Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Как правильно сравнивать даты?


Автор: MacTep 14.5.2007, 13:04
Почему не работает код?
Код

procedure TForm1.Button1Click(Sender: TObject);
var d1,d2:TDate;
    kol:integer;
begin
  d1:=StrToDate('03.01.1985');
  d2:=StrToDate('05.01.1985');
  if d2>d1 then
    kol:=kol+1;
end;
Чему будет равно значение переменной kol? И как сделать так, чтобы  оно стало в результате сравнения равно 1. smile

Автор: Snowy 14.5.2007, 13:12
Ну во-первых использование текстовой записи даты чревато граблями с региональными настройками.

Цитата(MacTep @  14.5.2007,  13:04 Найти цитируемый пост)
Чему будет равно значение переменной kol?
А вот это хороший вопрос... Знаешь задачку про яблоки?
Пете дали 3 яблока, потом одно забрали. Сколько стало яблок у Пети?
Два? Неверно. Правильный ответ зависит от того, сколько яблок у Пети было до этого.
Мораль: инициализируйте переменные.

Цитата(MacTep @  14.5.2007,  13:04 Найти цитируемый пост)
 И как сделать так, чтобы  оно стало в результате сравнения равно 1.
kol := 1; smile

Добавлено через 2 минуты и 2 секунды
Цитата(MacTep @  14.5.2007,  13:04 Найти цитируемый пост)
Почему не работает код?
А что он должен делать?

Автор: ama_kid 14.5.2007, 13:22
Цитата(MacTep @  14.5.2007,  13:04 Найти цитируемый пост)
Как правильно сравнивать даты?

Код
  TDate = type TDateTime;
  TDateTime = type Double;

Даты - де-факто это есть дабл... Следовательно, сравнивать их можно так же как и обычные даблы... А если учесть, что дата - это целая часть дабла, то можно сделать trunc и сравнивать как integer (если уж поизвращаться есть желание)...
Цитата
Почему не работает код?
У меня он работает (я только добавил инициализацию)...

Автор: MacTep 14.5.2007, 13:33
добавляю строку 
Код

kol:=0;
, а компилятор говорит, что эта строка вообще не выполняется. У меня после выполнения кода должно быть значение переменно равное 1. Такого почему-то не происходит. Вот код, который так и не работает:
Код

procedure TForm1.Button1Click(Sender: TObject);
var d1,d2:TDate;
    kol:integer;
begin
  kol:=0;
  d1:=StrToDate('03.01.1985');
  d2:=StrToDate('05.01.1985');
  if d2>d1 then
    kol:=kol+1;
end;
Здесь, kol не равен 1. Он остается 0.
А вот, кстати, код, который работает? И почему же из-за этого такая разница конкретная?
Код

procedure TForm1.Button1Click(Sender: TObject);
var d1,d2:TDate;
    kol:integer;
begin
  kol:=0;
  d1:=StrToDate('03.01.1985');
  d2:=StrToDate('05.01.1985');
  if d2>d1 then
    kol:=kol+1;
  ShowMessage(IntToStr(kol));
end;
Здесь нормально kol превращается в 1. Странное поведение.

Автор: ama_kid 14.5.2007, 13:41
просто у тебя в первом случае значения, присвоенные kol - нигде не используется и компилятор их отбрасывает... Отключи оптимизацию в свойствах проекта - все будет выполняться...

Автор: MacTep 14.5.2007, 13:49
Где именно она отключается? smile

Автор: skyboy 14.5.2007, 13:50
Цитата(MacTep @  14.5.2007,  12:33 Найти цитируемый пост)
kol 

эта переменная глобальная? тогда зачем ты её объявляешь в секции var? если эта переменная и должна быть локальной, то почему в твоем коде это значение не выходит за пределы процедуры? может, ты просто не так проверяешь, когда говоришь, что "она не изменилась"?

Автор: Snowy 14.5.2007, 13:52
Не надо ничего отключать.
Просто компилятор - умное существо.
Зачем считать kol, если ты его всё равно никогда не используешь...

Добавлено через 1 минуту и 10 секунд
MacTep, ты скажи что ты хочешь сделать.
А то мы обсуждаем что неправильно, а не как сделать правильно.
Ибо неизвестно, чего тебе надо...

Автор: drkot 14.5.2007, 19:53
Уважаемый MacTep, ответте на вопрос: в каком формате у Вас дата dd.mm.yyyy или mm.dd.yyyy?
и я думаю что ваша проблемма решится.

Автор: MacTep 16.5.2007, 23:22
drkot, в формате dd.mm.yyyy. smile

Snowy, я просто его в этом примере не использую. Как только задействовал, сразу проблема и пропала. smile

Автор: aktuba 17.5.2007, 08:12
MacTep, а чем тебе CompareDate не устраивала???

Автор: MacTep 19.5.2007, 01:56
Да тем и не устраивала, что я просто этой функцией в жизни не пользовался. smile;)

Автор: WinSer 17.6.2007, 21:22
У меня есть вопрос. Что я делаю нетак?
Прога должна открыть типизированый файл, взять из определенного столбца дату, сравнить с заданым периодом времени и если выполняется условие записать в новый файл.
Она работает, только:
 1. Не перекидает записи при  условии с сегодня по сегодня.
 2. Если задавать диапазон например с 12:05:2007 по 16:05:2007 то перекидываются все кроме тех, которые 16 числа
 3. Если задавать фильтрацию по дате и по времени одновременно, то вообще ничего неотбирает, хотя записи есть.

Код:
Код

procedure TForm8.BitBtn1Click(Sender: TObject);
begin

 AssignFile(f,ARM.katalog + '\Podii.dat');
 Reset(f);
 AssignFile(f1,ARM.katalog + '\Podii1.dat');
 Rewrite(f1);
 n:=FileSize(f);
 i:=0;
 if Form8.CheckBox1.Checked=False then
  Begin
   data1:=Form8.DateTimePicker1.Date;
   data2:=Form8.DateTimePicker2.Date;
   While i<n do
    Begin
     Read(f,zm1);
     i:=i+1;
     if ((zm1.dat>=data1) and (zm1.dat<=data2)) then
      Begin
       zm1.zapus:=FilePos(f);
       Write(f1,zm1);
      end;
    end;
  end
 else
  Begin
   Data1:=Form8.DateTimePicker1.Date;
   Data2:=Form8.DateTimePicker2.Date;
   Chass1:=Form8.DateTimePicker3.Time;
   Chass2:=Form8.DateTimePicker4.Time;
   While i<n do
    Begin
     Read(f,zm1);
     i:=i+1;
     if ((zm1.chas>=chass1) and (zm1.chas<=chass2)) and ((zm1.dat>=data1) and (zm1.dat<=data2)) then
      Begin
       zm1.zapus:=FilePos(f);
       Write(f1,zm1);
      end;
    end;
  end;
 zf:=True;
 CloseFile(f1);
 CloseFile(f);
Form5.Visible:=True;
Form8.Visible:=False;
end;



Автор: MacTep 23.6.2007, 10:34
WinSer, а может вообще весь проект кинешь. Надо на твои файлы посмотреть бы...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)