Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.94/32: Рейтинг темы: голосов - 32, средняя оценка - 4.94
71 / 66 / 35
Регистрация: 09.04.2009
Сообщений: 359
Записей в блоге: 1
1

сколько дней прошло!!

15.02.2010, 23:27. Просмотров 6354. Ответов 15
Метки нет (Все метки)


Всем привет!! как узнать сколько дней прошло с последнего загрузки программы!! например последний раз программа запускалась 12.01.2010 теперь нужно узнать сколько дней прошло например до сегодня!


дата запуска программы записывается в ini файл после закрытие программы!!
Зарание спасибо
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.02.2010, 23:27
Ответы с готовыми решениями:

Описать функцию Число дней, подсчитывающую, сколько дней прошло от 1 января 0001 года нашей эры до даты d
type число =1..31; месяц =1..12; год =1..2000; дата = record ч: число; м: месяц; г: год...

С некоторого момента прошло 234 дня. Сколько полных недель прошло за этот период.
С некоторого момента прошло 234 дня. Сколько полных недель прошло за этот период. Зарание...

С начала суток прошло n секунд. Определить сколько полных минут прошло с начала очередного часа
С начала суток прошло n секунд. Определить сколько полных минут прошло с начала очередного часа.

сколько минут прошло между 2 времен
1. как узнать сколько минут прошло с начала дня, причем время нужно по гринвичу. 2. узнать сколько...

__________________
Помогаю в написании курсовых работ и дипломов здесь.
15
13065 / 5851 / 1705
Регистрация: 19.09.2009
Сообщений: 8,807
16.02.2010, 08:58 2
Используй функцию:
Delphi
1
DaysBetween(const ANow, AThen: TDateTime): Integer;
Она объявлена в модуле DateUtils.
0
Junior Developer
43 / 43 / 7
Регистрация: 08.06.2009
Сообщений: 261
16.02.2010, 09:00 3
или же можно сделать по другому от сегодняшнего дня отнять дату записанную в ини....
1
13065 / 5851 / 1705
Регистрация: 19.09.2009
Сообщений: 8,807
16.02.2010, 09:34 4
Да - можно просто через вычитание дат и взятие целой части сделать. Тип TDateTime на самом деле является псевдонимом типа Double. Он объявлен в модуле System так:
Delphi
1
TDateTime = type Double;
Целая часть этого типа обозначает количество целых дней прошедших от 30.12.1899г. А в дробной части записана часть дня - 0.25 -> 6 часов, 0.5 -> 12 часов. Т. е. 1/24 -> 1 час, 1/(24 * 60) -> 1 минута, 1/(24 * 60 * 60) -> 1 секунда, 1/(24 * 60 * 60 * 1000) -> 1 миллисекунда.
Например, дни:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
procedure TForm1.Button1Click(Sender: TObject);
var
  Days : Integer;
  Date1, Date2 : TDateTime;
begin
  Date2 := Date; //Дата сегодня.
  Date1 := Date2 - 10; //Дата 10 дней назад.
 
  Days := Round( Int(Date2 - Date1) );
 
  ShowMessage('Прошло дней: ' + IntToStr(Days)); //Будет показано 10 дней.
end;
0
163 / 140 / 23
Регистрация: 28.12.2009
Сообщений: 365
16.02.2010, 10:23 5
есть еще такая функция - DaysBetween

Добавлено через 31 минуту
Mawrat ее уже упоминал. извиняюсь, не увидел
0
71 / 66 / 35
Регистрация: 09.04.2009
Сообщений: 359
Записей в блоге: 1
16.02.2010, 18:55  [ТС] 6
Цитата Сообщение от velikijmerlin Посмотреть сообщение
или же можно сделать по другому от сегодняшнего дня отнять дату записанную в ини....
как это осуществить!!

если дата записывается вот так
Delphi
1
label1.Caption:=FormatDateTime('dd.mm.yyyy tt',now);
ну это так пример!!
0
Junior Developer
43 / 43 / 7
Регистрация: 08.06.2009
Сообщений: 261
16.02.2010, 19:12 7
Цитата Сообщение от Mawrat Посмотреть сообщение
Да - можно просто через вычитание дат и взятие целой части сделать. Тип TDateTime на самом деле является псевдонимом типа Double. Он объявлен в модуле System так:
Delphi
1
TDateTime = type Double;
Целая часть этого типа обозначает количество целых дней прошедших от 30.12.1899г. А в дробной части записана часть дня - 0.25 -> 6 часов, 0.5 -> 12 часов. Т. е. 1/24 -> 1 час, 1/(24 * 60) -> 1 минута, 1/(24 * 60 * 60) -> 1 секунда, 1/(24 * 60 * 60 * 1000) -> 1 миллисекунда.
Например, дни:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
procedure TForm1.Button1Click(Sender: TObject);
var
  Days : Integer;
  Date1, Date2 : TDateTime;
begin
  Date2 := Date; //Дата сегодня.
  Date1 := Date2 - 10; //Дата 10 дней назад.
 
  Days := Round( Int(Date2 - Date1) );
 
  ShowMessage('Прошло дней: ' + IntToStr(Days)); //Будет показано 10 дней.
end;
вот таким образом...
1
71 / 66 / 35
Регистрация: 09.04.2009
Сообщений: 359
Записей в блоге: 1
16.02.2010, 19:25  [ТС] 8
Цитата Сообщение от velikijmerlin Посмотреть сообщение
вот таким образом...
Delphi
1
Date1 := Date2 - 10; //Дата 10 дней назад.
мне не нужно чтобы она выдавала в сообщение 10 дней, а поставь туда 24 он будет выдавать 24 мне нужно примерно так

Delphi
1
2
3
label1.Caption:=FormatDateTime('dd.mm.yyyy tt',now); 
label2.Caption:='12.02.2010 18:00:32';
messagedlg('Последний раз программа открывалась'+ Days+'дней назад' ,mtinformation, [mbOK],0);
0
Junior Developer
43 / 43 / 7
Регистрация: 08.06.2009
Сообщений: 261
16.02.2010, 19:27 9
ну смотри... ты сам писал, что ты берёшь и сохраняешь дату файла в ини файле, так? так...
так просто возьми заведи переменную, например inidata и присвой ей время взятой из ини файла... а потом подставь эту переменную вместо 10 и всё...

З.Ы я с иниками не работал так что как там открыть\считать\закрыть инфу ВЦ!..)))
1
71 / 66 / 35
Регистрация: 09.04.2009
Сообщений: 359
Записей в блоге: 1
16.02.2010, 19:45  [ТС] 10
Цитата Сообщение от velikijmerlin Посмотреть сообщение
ну смотри... ты сам писал, что ты берёшь и сохраняешь дату файла в ини файле, так? так...
так просто возьми заведи переменную, например inidata и присвой ей время взятой из ини файла... а потом подставь эту переменную вместо 10 и всё...

З.Ы я с иниками не работал так что как там открыть\считать\закрыть инфу ВЦ!..)))
у меня противоречит string и TDateTime

просто из ini я вытаскиваю вот так
Delphi
1
2
MyFile:=TIniFile.Create(ExtractFilePath(Application.ExeName)+'\'+ '\data.ini');
inidata:= MyFile.ReadString('data','old_data','');
0
13065 / 5851 / 1705
Регистрация: 19.09.2009
Сообщений: 8,807
16.02.2010, 20:37 11
Dryg, попробуй сделать на основе этого кода:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
procedure TForm1.Button1Click(Sender: TObject);
var
  //Объект доступа к INI файлу.
  IniFile: TIniFile;
  //Переменная в которую мы попытаемся прочитать дату прошлого запуска программы.
  OldDate : TDateTime;
  //Строковое представление даты OldDate.
  StrOldDate : String;
  //Количество целых дней, прошедших с момента предыдущего запуска программы.
  Days : Integer;
begin
  //Создаём объект доступа к INI файлу.
  IniFile := TIniFile.Create(ExtractFilePath(Application.ExeName) + '\data.ini');
  //Читаем строковое значение параметра "Date" в секции "Old_date".
  StrOldDate := IniFile.ReadString('Date', 'Old_date', '-');
  //Уничтожаем объект доступа к INI файлу.
  IniFile.Free;
 
  //Вычисляем время, прошедшее с прошлого запуска.
  if StrOldDate <> '-' then begin
    //Программа уже была ранее запущена.
    //Вычисляем время, прошедшее с момента прошлого запуска.
    OldDate := StrToDate(StrOldDate);
    Days := Round(Int(Date - OldDate));
    //Если подключить модуль DateUtils, тогда можно так:
    //Days := DaysBetween(Date, OldDate);
  end;
 
  //Распечатываем результат.
  if StrOldDate = '-' then begin
    ShowMessage('Программа запущена впервые.');
  end else begin
    ShowMessage('С момента предыдущего запуска прошло: ' + IntToStr(Days) + ' дней.');
  end;
end;
---
DATA - это слово означает "Данные". DATE - переводится на русский, как момент времени, событие календаря.
1
71 / 66 / 35
Регистрация: 09.04.2009
Сообщений: 359
Записей в блоге: 1
16.02.2010, 21:25  [ТС] 12
Цитата Сообщение от Mawrat Посмотреть сообщение
Dryg, попробуй сделать на основе этого кода:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
procedure TForm1.Button1Click(Sender: TObject);
var
  //Объект доступа к INI файлу.
  IniFile: TIniFile;
  //Переменная в которую мы попытаемся прочитать дату прошлого запуска программы.
  OldDate : TDateTime;
  //Строковое представление даты OldDate.
  StrOldDate : String;
  //Количество целых дней, прошедших с момента предыдущего запуска программы.
  Days : Integer;
begin
  //Создаём объект доступа к INI файлу.
  IniFile := TIniFile.Create(ExtractFilePath(Application.ExeName) + '\data.ini');
  //Читаем строковое значение параметра "Date" в секции "Old_date".
  StrOldDate := IniFile.ReadString('Date', 'Old_date', '-');
  //Уничтожаем объект доступа к INI файлу.
  IniFile.Free;
 
  //Вычисляем время, прошедшее с прошлого запуска.
  if StrOldDate <> '-' then begin
    //Программа уже была ранее запущена.
    //Вычисляем время, прошедшее с момента прошлого запуска.
    OldDate := StrToDate(StrOldDate);
    Days := Round(Int(Date - OldDate));
    //Если подключить модуль DateUtils, тогда можно так:
    //Days := DaysBetween(Date, OldDate);
  end;
 
  //Распечатываем результат.
  if StrOldDate = '-' then begin
    ShowMessage('Программа запущена впервые.');
  end else begin
    ShowMessage('С момента предыдущего запуска прошло: ' + IntToStr(Days) + ' дней.');
  end;
end;
---
DATA - это слово означает "Данные". DATE - переводится на русский, как момент времени, событие календаря.
постоянно пишет что Программа запущена впервые потом переберал код вообще выдает

Exception class EConvertError with message '''-'' is not a valid date'. Process Project1.exe (1192)

Exception class EConvertError with message ''''' is not a valid date'. Process Project1.exe (6000)
такое ощущение что он не читает из ini файла а вот если в писать
Delphi
1
StrOldDate := IniFile.ReadString('Date', 'Old_date', '12.02.2010');
то все работает!
0
13065 / 5851 / 1705
Регистрация: 19.09.2009
Сообщений: 8,807
16.02.2010, 22:11 13
Dryg, покажи код процедуры - посмотрим. Видимо твой код отличается от того, что я опубликовал. И желательно ещё посмотреть, как у тебя реализована запись в INI файл.
Ты пока запость сюда эту инфу. Но погляжу я завтра - сегодня не могу уже.
1
71 / 66 / 35
Регистрация: 09.04.2009
Сообщений: 359
Записей в блоге: 1
16.02.2010, 22:31  [ТС] 14
Цитата Сообщение от Mawrat Посмотреть сообщение
Dryg, покажи код процедуры - посмотрим. Видимо твой код отличается от того, что я опубликовал. И желательно ещё посмотреть, как у тебя реализована запись в INI файл.
Ты пока запость сюда эту инфу. Но погляжу я завтра - сегодня не могу уже.
вот накидал на быструю руку переписал не много его!!

проект прикреплен к посту!
0
Вложения
Тип файла: rar proect.rar (328.2 Кб, 20 просмотров)
13065 / 5851 / 1705
Регистрация: 19.09.2009
Сообщений: 8,807
17.02.2010, 08:28 15
Готово. Сейчас правильно отрабатывает. Чтение из INI файла я перенёс в обработчик OnCreate формы. Если этот код расположить в обработчике OnActivate - тогда он будет вызываться каждый раз, когда форма становится активной. Т. е., например, если переключиться на окно другого приложения, а потом активировать наше приложение (щёлкнуть по форме), тогда произойдёт событие OnActivate и будет вызван соответствующий обработчик. Поэтому код перенесён в обработчик OnCreate.
Следует не забывать удалять из памяти объект IniFile : TIniFile через IniFile.Free;. Если этого не делать - произойдут утечки памяти.
Кроме этого, переменные с глобального уровня (уровня модуля) перенесены на уровень процедур. И т. д.
Dryg и ещё обязательно перекомпилируй проект. Я правил на Delphi7, а у тебя, видимо, более новая версия.
1
Вложения
Тип файла: rar proect_new.rar (174.2 Кб, 34 просмотров)
71 / 66 / 35
Регистрация: 09.04.2009
Сообщений: 359
Записей в блоге: 1
17.02.2010, 08:55  [ТС] 16
Цитата Сообщение от Mawrat Посмотреть сообщение
Готово. Сейчас правильно отрабатывает. Чтение из INI файла я перенёс в обработчик OnCreate формы. Если этот код расположить в обработчике OnActivate - тогда он будет вызываться каждый раз, когда форма становится активной. Т. е., например, если переключиться на окно другого приложения, а потом активировать наше приложение (щёлкнуть по форме), тогда произойдёт событие OnActivate и будет вызван соответствующий обработчик. Поэтому код перенесён в обработчик OnCreate.
Следует не забывать удалять из памяти объект IniFile : TIniFile через IniFile.Free;. Если этого не делать - произойдут утечки памяти.
Кроме этого, переменные с глобального уровня (уровня модуля) перенесены на уровень процедур. И т. д.
Dryg и ещё обязательно перекомпилируй проект. Я правил на Delphi7, а у тебя, видимо, более новая версия.
Спасибо Большое!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.02.2010, 08:55

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь или здесь.

Идет k (катая) секунда суток. Определить, сколько полных часов (h) и полных минут (m) прошло к этому моменту
для вас наверно будет проще пареной репы написать код находящийся в разделе имплементейшен на...

Как отмерять сколько прошло времени от даты
Мне нужно, чтобы программа отмеряла пройденное время. Причём в днях до 1 месяца, а дальше в...

сколько дней прожил человек
составить программу, которая просит дату рождения человека в формате гг.мм.дд. подсчитать...

С начала пятого модуля прошло d дней; сколько полных недель прошло за этот период?
С начала пятого модуля прошло d дней. Сколько полных недель прошло за этот период? Определить,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.