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


Автор: Janger 24.6.2013, 10:01
Такая проблема....
У меня определённая дата записывается в текстовый документ, а потом, я хочу определить, сколько дней прошло с выбранной даты...
Вот мой код... Подскажите, что я не так делаю...(
Код

var
    date: string;
    myFile : TextFile;
    text : string;
begin
AssignFile(myFile, ExtractFilePath(Application.ExeName)+'on_off.txt');
Reset(myFile);
ReadLn(myFile, text);
date:=DateToStr(Now);
Edit1.Text:=text-date;
CloseFile(myFile);}
end;

================================
text = 04.06.2014
date = 24.06.2013 (сегодняшняя дата)
================================
И естественно в Edit1 у меня ничего не отображается....
Подскажите пожалуйста(( 

Автор: kakawkin 24.6.2013, 11:49
Код

DaysBetween(const ANow, AThen: TDateTime): Integer;

Автор: Janger 24.6.2013, 13:24
Жаль, что никто не помог....
Но я код выложу, вдруг, кому то будет полезно....
Код

var
    date,li: TDateTime;
    myFile : TextFile;
    text : string;
begin
AssignFile(myFile, ExtractFilePath(Application.ExeName)+'on_off.txt');
Reset(myFile);
ReadLn(myFile, text);
li:=StrTodateTime(text);
date:=StrToDateTime(DateToStr(Now));
ShowMessage(IntToStr(DaysBetween(li,date))+'дней');
CloseFile(myFile);
end;


Добавлено через 9 минут и 45 секунд
Тему в принципе можно закрыть... 
Я просто тут не давно, так что не знаю, может можно это как то самому сделать...

Автор: bems 24.6.2013, 13:35
Цитата(Janger @  24.6.2013,  13:24 Найти цитируемый пост)
date:=StrToDateTime(DateToStr(Now));
тут есть что-то лишнее

Автор: northener 24.6.2013, 13:47
Цитата(bems @  24.6.2013,  13:35 Найти цитируемый пост)
тут есть что-то лишнее

Это слишком мягко сказано. smile

Автор: Sharhan 20.9.2013, 12:17
У меня тоже проблемы с датами.
Код

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, Buttons, Menus, Dateutils;

Код

var
   myDate : TDateTime;
   myDay : string;
begin
   myDate := EncodeDate(StrToInt(Edit6.Text), StrToInt(ComboBox16.Items.Strings[ComboBox16.ItemIndex]), StrToInt(ComboBox15.Items.Strings[ComboBox15.ItemIndex]));
   myDay := LongDayNames[DayOfWeek(myDate)];
   Memo1.Lines.Add ('День недели: ' +  myDay);
end;

В Edit6.Text вводим год. В ComboBox16.Items.Strings[ComboBox16.ItemIndex] находится номер месяца, список там от 01 до 12. В ComboBox15.Items.Strings[ComboBox15.ItemIndex] выбираем из списка число дня, список там от 1 до 31.
Компилируется отлично, без всяких сообщений об ошибках.
После нажатия кнопки в программе в форме появляется строка, в которой указывается название дня недели, всё правильно. Но при этом выводится поверх еще окно с надписью: "Invalid argument to date encode". Нажимаешь "ОК" и закрываешь окно. В принципе всё работает, но это всплывающее окно надоедает.
Что я не так делаю? Можно как-то от этого окна избавиться?
Пробовал изменить одну строку и даписать дату так:
Код

   myDate := EncodeDate(1988, 09, 13);

Только программа опять расчитала все правильно и выдала тоже дополнительное окно с надписью: "Invalid argument to date encode".
Операционная система: Система: Microsoft Windows XP Professional версия 2002 Service Pack 3 со всеми последними обновлениями.
Программирую на Делфи 7.

Автор: Poseidon 20.9.2013, 12:54
Вот жаль нет возможности проверить на D7, но что-то мне подсказывает, что Dateutils тут лишний, т.к. и http://docwiki.embarcadero.com/Libraries/XE2/en/System.SysUtils.EncodeDate, и http://docwiki.embarcadero.com/Libraries/XE2/en/System.SysUtils.LongDayNames, и http://docwiki.embarcadero.com/Libraries/XE2/en/System.SysUtils.DayOfWeek объявлены в SysUtils. Наверно все-таки в Dateutils есть своя EncodeDate, которая работает "не так". Хотя вот в http://docwiki.embarcadero.com/Libraries/XE3/en/System.DateUtils, но может в семерке еще была.

PS. Конструкции вида ComboBox16.Items.Strings[ComboBox16.ItemIndex] безусловно красивы, но у ComboBox, так же как и у Edit, есть свойство Text.

Автор: Sharhan 20.9.2013, 14:05
Цитата(Poseidon @  20.9.2013,  13:54 Найти цитируемый пост)
что-то мне подсказывает, что Dateutils тут лишний, т.к. и EncodeDate, и LongDayNames, и DayOfWeek объявлены в SysUtils.

Вы правы. Dateutils я добавил в качестве эксперимента, но и до добавления всплывало это сообщение. Так что проблема осталась.

Автор: Poseidon 20.9.2013, 15:04
Локализуй и скинь сюда pas в таком случае, будем смотреть. Я вот пробую на D5 твой код, все работает без сообщений.

Автор: Akella 20.9.2013, 15:51
Цитата(Janger @  24.6.2013,  13:24 Найти цитируемый пост)
date:=StrToDateTime(DateToStr(Now));

Вы пишите в высшей мере несознательно. Вы пишите просто так, совсем не думая, какой тип имеет date, что такое StrToDateTime и DateToStr

И совет.
Не называйте переменную именем date, назовите, например, _date или date1. А лучто что-то типа dtStart или dtEnd. Используйте кроме имёт ещё и префиксы/суффиксы. Почитайте обязательно об именовании переменных, объектов, компонент и т.д.

Это связано с тем, что date содержит текущую дату.
date - текущая дата.
time - текущее время.
now - текущие время и дата.


Например, как показать текущую дату:
Код

procedure TfmMain.Button1Click(Sender: TObject);
begin
  ShowMessage(DateToStr(Date));
end;


А у Вас получается, что Вы перегоняете дату сначала в строку, потом из строки опять в дату.

Добавлено через 1 минуту и 25 секунд
Цитата(Poseidon @  20.9.2013,  15:04 Найти цитируемый пост)
скинь сюда pas

Вместо того, чтобы дать ему рыбу, ты лучше научи её ловить.

Добавлено через 3 минуты и 30 секунд
Цитата(Akella @  20.9.2013,  15:51 Найти цитируемый пост)
И совет.
Не называйте переменную именем date


Да, и не читайте за обедом советских газет.

Автор: Poseidon 20.9.2013, 15:56
Цитата(Akella @  20.9.2013,  15:51 Найти цитируемый пост)
Вместо того, чтобы дать ему рыбу, ты лучше научи её ловить.
Я не вижу в коде 
Код
myDate := EncodeDate(1988, 09, 13);
"рыбы". Вполне возможно что это его "Invalid argument to date encode" вываливается совершенно в другом месте.

Автор: Sharhan 21.9.2013, 13:31
Цитата(Poseidon @  20.9.2013,  16:56 Найти цитируемый пост)
Вполне возможно что это его "Invalid argument to date encode" вываливается совершенно в другом месте.

Благодарю за подсказку. Был уверен, что ошибка кралась именно в этих строчках. Конечно можно было бы вложить исходник целиком, но кому надо разбираться в полуторатысячах строчек чужого кода...
В общем, решил создать новый проект, где будет реализован только вывод названия дня недели. И к удивлению обнаружил, что тот же самый код в новой программе действительно нормально работает, без всяких сообщений.
Залез в основной проект и удалил вообще эти строки из кода, чтоб было, как раньше. Но после компиляции и запуска создания отчета опять выслыло тоже самое сообщение об ошибке.
А теперь, как говорит М. Задорнов, наберите воздуха в грудь. Ошибка была в самом конце исходника, там где я просисал обнуление всех данных. Если программу нужно использовать повторно, то старые данные в переменных будут сильно мешать и я их обнуляю. Так вот, я случайно прописал еще и обнуление переменной "myDate". Видимо не очень корректно это сделал или вообще этого нельзя было делать... После удаления этой строчки из очистки данных, всё заработало отлично.

Автор: kami 21.9.2013, 20:23
Цитата(Sharhan @  21.9.2013,  13:31 Найти цитируемый пост)
Видимо не очень корректно это сделал или вообще этого нельзя было делать...

Ага. Зачем разбираться, что именно было написано не так - проще удалить и в следующих проектах опять натыкаться на эти же грабли.
Цитата(Sharhan @  21.9.2013,  13:31 Найти цитируемый пост)
Был уверен, что ошибка кралась именно в этих строчках.

F7, F8, брейкпоинты и callstack придумали трусы...  smile 

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