Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вычитание дат 
:(
    Опции темы
Janger
  Дата 24.6.2013, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 17.6.2013

Репутация: 1
Всего: 1



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

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 у меня ничего не отображается....
Подскажите пожалуйста(( 
PM MAIL   Вверх
kakawkin
Дата 24.6.2013, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 23.6.2010

Репутация: нет
Всего: нет



Код

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

PM MAIL   Вверх
Janger
Дата 24.6.2013, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 17.6.2013

Репутация: 1
Всего: 1



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

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 секунд
Тему в принципе можно закрыть... 
Я просто тут не давно, так что не знаю, может можно это как то самому сделать...
PM MAIL   Вверх
bems
Дата 24.6.2013, 13:35 (ссылка) |    (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



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



--------------------
Обижено школьников: 8
PM MAIL   Вверх
northener
Дата 24.6.2013, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 12
Всего: 20



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

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


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
Sharhan
Дата 20.9.2013, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 25.10.2009

Репутация: нет
Всего: нет



У меня тоже проблемы с датами.
Код

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.

Это сообщение отредактировал(а) Sharhan - 20.9.2013, 12:19
PM   Вверх
Poseidon
Дата 20.9.2013, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 9
Всего: 133



Вот жаль нет возможности проверить на D7, но что-то мне подсказывает, что Dateutils тут лишний, т.к. и EncodeDate, и LongDayNames, и DayOfWeek объявлены в SysUtils. Наверно все-таки в Dateutils есть своя EncodeDate, которая работает "не так". Хотя вот в XE3 нету, но может в семерке еще была.

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


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Sharhan
Дата 20.9.2013, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 25.10.2009

Репутация: нет
Всего: нет



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

Вы правы. Dateutils я добавил в качестве эксперимента, но и до добавления всплывало это сообщение. Так что проблема осталась.
PM   Вверх
Poseidon
Дата 20.9.2013, 15:04 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 9
Всего: 133



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


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Akella
Дата 20.9.2013, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 8
Всего: 329



Цитата(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


Да, и не читайте за обедом советских газет.
PM MAIL   Вверх
Poseidon
Дата 20.9.2013, 15:56 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 9
Всего: 133



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



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Sharhan
Дата 21.9.2013, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 25.10.2009

Репутация: нет
Всего: нет



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

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


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 22
Всего: 72



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

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

F7, F8, брейкпоинты и callstack придумали трусы...  smile 
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0949 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.