|
Вопрос # 5 179/ вопрос открыт / |
|
Приветствую, уважаемые эксперты!
Хочу чтобы изменялась дата на год назад использую функцию IncYear. В строке myDate := IncYear(myDate, -1); выдает ошибку [Error] Unit1.pas(88): Too many actual parameters. Подскажите как исправить пожалуйста.
Приложение: Переключить в обычный режим- function TForm1.IncYear(const StartDate: TDateTime): TDateTime;
- var
- myDate : TDateTime;
- begin
-
- myDate := EncodeDate(2008, 02, 29);
- ShowMessage('myDate = '+DateToStr(myDate));
-
-
- myDate := IncYear(myDate, -1);
- ShowMessage('myDate - 1 years = '+DateToStr(myDate));
-
- end;
 |
Вопрос задал: mobidik (статус: Посетитель)
Вопрос отправлен: 12 апреля 2011, 04:27
Состояние вопроса: открыт, ответов: 2.
|
Ответ #1. Отвечает эксперт: Мережников Андрей
Здравствуйте, mobidik!
Ошибка в том, что свою функцию назвали так же, как встроенная IncYear. Назовите ее, например, MyIncYear.
 |
Ответ отправил: Мережников Андрей (статус: Абитуриент)
Время отправки: 12 апреля 2011, 06:05
|
Ответ #2. Отвечает эксперт: Вадим К
Здравствуйте, mobidik!
Функция IncYear не может уменьшать дату. Только увеличивать. В справке сказано - DecYear нет, используйте IncMinute с отрицательным значением.
Я бы написал эту функцию где то так.
var
myDate : TDateTime;
myYear, myMonth, myDay : Word;
begin
myDate := now();// для примера.
DecodeDate(myDate, myYear, myMonth, myDay);// разобрали на кусочки
dec(myYear);
// проверим, что новый год высокосный
if not ((myYear mod 4 = 0) and (myYear mod 100 <> 0)) and (myDays = 29) and (myMonth = 2) then begin
// в этом случае если дата 29 февраля - выставим 1 марта. Хотя может кому то правильнее 28 февраля выставить...
myDay := 1; myMonth := 3;
end;
myDate := EncodeDate(myYear, myMonth, myDay);
 |
Ответ отправил: Вадим К (статус: Академик)
Время отправки: 12 апреля 2011, 10:48
|
Мини-форум вопроса
Всего сообщений: 10; последнее сообщение — 14 апреля 2011, 04:42; участников в обсуждении: 6.
|
min@y™ (статус: Доктор наук), 12 апреля 2011, 08:10 [#1]:
Цитата (Мережников Андрей):
Назовите ее, например, MyIncYear.
Ну, необязательно. Можно так:
myDate := DateUtils.IncYear(myDate, -1);
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
bugmenot (статус: 3-ий класс), 12 апреля 2011, 09:00 [#2]:
Хм, по-моему, обёртка вообще ничего не делает...
виконання програми розпочинається з того самого мiсця, де призупинилося.
|
|
Мережников Андрей (статус: Абитуриент), 12 апреля 2011, 18:52 [#3]:
Цитата (Вадим К):
Функция IncYear не может уменьшать дату
вот выдержка из справки:
IncYear returns the value of the AValue parameter, incremented by ANumberOfYears years. ANumberOfYears can be negative, to return a date N years previous.
Если значение отрицательное, то возвращается дата на N лет предшествующая.
can be negative - переводится как: может быть отрицательная.
Может у нас Delphi разная? У меня TurboDelphi
|
|
Вадим К (статус: Академик), 12 апреля 2011, 18:57 [#4]:
я смотрел справку по старым делфи. А английский я знаю
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Мережников Андрей (статус: Абитуриент), 12 апреля 2011, 19:35 [#5]:
Цитата (Вадим К):
А английский я знаю
Не сомневаюсь в этом 
Цитата (Вадим К):
я смотрел справку по старым делфи
Я так и предположил:
Цитата (Мережников Андрей):
Может у нас Delphi разная? У меня TurboDelphi
|
|
min@y™ (статус: Доктор наук), 12 апреля 2011, 20:36 [#6]:
Цитата (Вадим К):
я смотрел справку по старым делфи.
Интересно, справку от какой версии ты смотрел?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
mobidik (статус: Посетитель), 13 апреля 2011, 03:21 [#7]:
Спасибо большое за ответы.
Подскажите пожалуйста что не так делаю? Необходимо чтобы программа при выборе периода (даты) выводила в таблицу сумму рублей за выбранный период даты в первое поле, и еще минус месяц и минус год во второе поле. Вот код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, Grids, ExtCtrls, DBGrids, ComObj, DB, ADODB, DateUtils;
type
TForm1 = class(TForm)
Edit1: TEdit;
DateTimePicker1: TDateTimePicker;
DateTimePicker2: TDateTimePicker;
Button1: TButton;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
dbs: TADOConnection;
query: TADOQuery;
DataSource1: TDataSource;
StringGrid1: TStringGrid;
Label4: TLabel;
Label5: TLabel;
procedure Button1Click(Sender: TObject);
private
function ZedYear ( const StartDate : TDateTime {; NumberOfYears : Integer = 1} ) : TDateTime;
function ZedMonth ( const StartDate : TDateTime {; NumberOfMonths : Integer = 1} ) : TDateTime;
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var i,j:integer;
begin
dbs.close;
query.close;
query.SQL.Text:= 'SELECT sum(doc_summ) FROM doc WHERE (doc_date between :d1 and :d2 )';
query.Parameters.ParseSQL(query.SQL.Text, true);
query.Parameters.ParamByName('d1').Value:=DateTimePicker1.Date;
query.Parameters.ParamByName('d2').Value:=DateTimePicker2.Date;
query.Open;
query.Close;
query.SQL.Text:= 'SELECT sum(doc_summ) FROM doc WHERE (doc_date between :d1 and :d2 )';
query.Parameters.ParseSQL(query.SQL.Text, true);
query.Parameters.ParamByName('d1').Value:=ZedYear(ZedMonth(DateTimePicker1.Date));
query.Parameters.ParamByName('d2').Value:=ZedYear(ZedMonth(DateTimePicker2.Date));
query.Open;
i:=0;
while not query.Eof do
begin
inc(i);
StringGrid1.Cells[0,i]:=query.Fields[0].AsString+' '+query.Fields[1].AsString+' '+query.Fields[2].AsString;
for j:=1 to 2 do
StringGrid1.Cells[j,i]:=query.Fields[j+2].AsString;
StringGrid1.RowCount:=i+1;
query.Next;
end;
if i=0 then begin
StringGrid1.RowCount:=2;
StringGrid1.Cells[0,1]:='';
StringGrid1.Cells[1,1]:='';
StringGrid1.FixedRows:=1;
end;
end;
function TForm1.ZedYear(const StartDate: TDateTime): TDateTime;
var
myDate : TDateTime;
begin
myDate := EncodeDate(2008, 02, 29);
ShowMessage('myDate = '+DateToStr(myDate));
myDate := IncYear(MyDate, -1);
ShowMessage('myDate - 1 years = '+DateToStr(myDate));
end;
function TForm1.ZedMonth(const StartDate: TDateTime): TDateTime;
var
myDat : TDateTime;
begin
myDat := StrToDate('31.01.2000');
ShowMessage('myDat = '+DateToStr(myDat));
myDat := IncMonth(myDat);
ShowMessage('myDat - 1 month = '+DateToStr(myDat));
end;
end.
Как переделать функции - год и - месяц, а то мне выдает в отдельном окне MyDate = 31.01.2000 ?
|
|
Мережников Андрей (статус: Абитуриент), 13 апреля 2011, 06:01 [#8]:
Цитата (mobidik):
Как переделать функции - год и - месяц, а то мне выдает в отдельном окне MyDate = 31.01.2000 ?
1.в обеих функциях добавить строку:
Result:=MyDat;
2. в функции ZedMonth исправить строку myDat := IncMonth(myDat);
на myDat := IncMonth(myDat,-1);
переменную MyDat в обеих функциях можно выбросить совсем, вместо нее использовать Result;
Вообще, это уже новый вопрос и задавать его надо было отдельно.
|
13 апреля 2011, 11:10: Вопрос перемещён из тематического раздела Delphi » Общие вопросы по программированию в раздел Delphi » Алгоритмы, преобразования модератором Ерёмин А.А.
|
mobidik (статус: Посетитель), 14 апреля 2011, 03:38 [#9]:
Вот так вставил все равно выходит окошко с датой:
function TForm1.ZedYear(const StartDate: TDateTime): TDateTime;
var
myDate : TDateTime;
begin
Result:= MyDate;
myDate := EncodeDate(2008, 02, 29);
ShowMessage('myDate = '+DateToStr(myDate));
myDate := IncYear(MyDate, -1);
ShowMessage('myDate - 1 years = '+DateToStr(myDate));
end;
function TForm1.ZedMonth(const StartDate: TDateTime): TDateTime;
var
myDat : TDateTime;
begin
Result:= MyDat;
myDat := StrToDate('31.01.2000');
ShowMessage('myDat = '+DateToStr(myDat));
myDat := IncMonth(myDat,-1);
ShowMessage('myDat - 1 month = '+DateToStr(myDat));
end;
end.
|
|
Егор (статус: 10-ый класс), 14 апреля 2011, 04:42 [#10]:
блин, и этот человек занимается программированием баз данных?!
я бы понял такие ошибки у новичка.
автору вопроса - срочно учить программирование. вообще - программирование. основы алгоритмов или подобные курсы/предметы. ну или уйти в другую область, т.к. напрочь отсутствует логическое мышление и понимание.
function TForm1.ZedYear(const StartDate: TDateTime): TDateTime;
// гм. а зачем нам этот дурацкий параметр StartDate?
// мы же его всё равно не используем нигде и никогда
var
myDate : TDateTime;
begin
Result:= MyDate; // ай, маладца! в результат, возвращаемый функцией, пишем значение
// неинициализированной переменной, т.е. мусор
myDate := EncodeDate(2008, 02, 29);
ShowMessage('myDate = '+DateToStr(myDate));
myDate := IncYear(MyDate, -1);
ShowMessage('myDate - 1 years = '+DateToStr(myDate));
// упс. а где же здесь Result? это что же, всё, что мы делали после строчки Result:= MyDate;,
// оно всё зря, что ли? выходит, зря.
end;
или я всё-всё неправильно понял и на самом деле проблема в этом:
Цитата (mobidik):
все равно выходит окошко с датой а?
ну тогда, чтобы "окошко с датой" не выходило, нужно убрать ShowMessage
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|