Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 179

/ вопрос открыт /

Приветствую, уважаемые эксперты!
Хочу чтобы изменялась дата на год назад использую функцию IncYear. В строке myDate := IncYear(myDate, -1); выдает ошибку [Error] Unit1.pas(88): Too many actual parameters. Подскажите как исправить пожалуйста.

Приложение:
  1. function TForm1.IncYear(const StartDate: TDateTime): TDateTime;
  2. var
  3. myDate : TDateTime;
  4. begin
  5.  
  6. myDate := EncodeDate(2008, 02, 29);
  7. ShowMessage('myDate = '+DateToStr(myDate));
  8.  
  9.  
  10. myDate := IncYear(myDate, -1);
  11. ShowMessage('myDate - 1 years = '+DateToStr(myDate));
  12.  
  13. end;


mobidik Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: 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™

min@y™ (статус: Доктор наук), 12 апреля 2011, 08:10 [#1]:

Цитата (Мережников Андрей):

Назовите ее, например, MyIncYear.

Ну, необязательно. Можно так:
myDate := DateUtils.IncYear(myDate, -1);
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
bugmenot

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™

min@y™ (статус: Доктор наук), 12 апреля 2011, 20:36 [#6]:

Цитата (Вадим К):

я смотрел справку по старым делфи.

Интересно, справку от какой версии ты смотрел?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
mobidik

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

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.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:59
Выполнено за 0.04 сек.