Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.03.2012, 17:27   #21
krikaved
Пользователь
 
Регистрация: 26.02.2010
Сообщений: 66
По умолчанию

Код:
procedure TForm1.FormCreate(Sender: TObject);
var Reg: TRegistry;
     dat:  string;
begin
 dat := FormatDateTime('d', Now);
 Reg:=TRegistry.Create;
 Reg.RootKey:=HKEY_LOCAL_MACHINE;
 Reg.OpenKey('мой путь');
 if not Reg.ValueExists('Date') then
    begin
      Reg.WriteString('Date', dat);
    end;
 Reg.CloseKey;
 Reg.Free;
end;

procedure TForm1.FormShow(Sender: TObject);
var Reg: TRegistry;
    dat: string;
    k:   integer;
begin
 dat := FormatDateTime('d', Now);
 Reg:=TRegistry.Create;
 Reg.RootKey:=HKEY_LOCAL_MACHINE;
 Reg.OpenKey('мой путь', false);
 k  := StrToInt(Reg.ReadString('Date'));
 Reg.CloseKey;
 Reg.Free;
 if k + 5 = StrToInt(dat) then
    begin
      ShowMessage('Я уважаю всех на форуме кроме xrob! Зауважаю тогда, когда он перестанет умничать и присоединится к решению задачи');
     end;
end;
Я сделал по-своему. Пусть выглядет на новичка, но зато я сам написал. Конечно, многие бы сделали например, с помощью функции и тому подобное.
Программа никогда не выдаст ShowMessage, если ее запустить в первый раз, например, 28 числа. Так как не учтено ограничение разных месяцев (февраль 28 дней, март 31 день, апрель 30 дней).
Осталось только подправить, если, например, к числу 28 прибавить 5 равняется 33, а в месяце максимум 31 день! Вот как это все учесть?

Последний раз редактировалось krikaved; 23.03.2012 в 17:40.
krikaved вне форума Ответить с цитированием
Старый 23.03.2012, 18:05   #22
xrob
Форумчанин
 
Регистрация: 18.10.2010
Сообщений: 419
По умолчанию

эй, уважаемый!

не парьтесь с числами и месяцами.
воспользуйтесь TodayDate:=Trunc(now);
вы получите кол-во дней, прошедших с начала 19-го века.
сохраните это число, например FirstDate = TodayDate.
когда вы запустите программу снова, и она обнаружит свои записи в реестре, снова получаете TodayDate и вычитаете из него FirstDate.
и получаете кол-во дней прошедших с первого запуска программы.
и не важно 29 это февраля или 36 августа.
кол-во дней - абсолютная величина.
при желании его можно перевести в дату вида YYYY.MM.DD
xrob вне форума Ответить с цитированием
Старый 23.03.2012, 19:36   #23
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Какой Trunc, какие Strtoint, какие числа, тут лучше использовать DaysBetween (подробности в справке), примерно так:
Код:
if Daysbetween(now, saved_date) >=5 then
saved_date должна быть типа Tdatetime
phomm вне форума Ответить с цитированием
Старый 23.03.2012, 22:05   #24
krikaved
Пользователь
 
Регистрация: 26.02.2010
Сообщений: 66
По умолчанию

Цитата:
Сообщение от phomm Посмотреть сообщение
Какой Trunc, какие Strtoint, какие числа, тут лучше использовать DaysBetween (подробности в справке), примерно так:
Код:
if Daysbetween(now, saved_date) >=5 then
saved_date должна быть типа Tdatetime
Код:
function DaysBetween(const ANow, AThen: TDateTime): Integer;

procedure TForm1.FormCreate(Sender: TObject);
var Reg: TRegistry;
     dat:  string;
begin
 dat := FormatDateTime('ddddd', Now);
 Reg:=TRegistry.Create;
 Reg.RootKey:=HKEY_LOCAL_MACHINE;
 Reg.OpenKey('мой путь');
 if not Reg.ValueExists('Date') then
    begin
      Reg.WriteString('Date', dat);
    end;
 Reg.CloseKey;
 Reg.Free;
end;

procedure TForm1.FormShow(Sender: TObject);
var Reg: TRegistry;
    //dat: string;
    //k:   integer;
    k: TDateTime;
begin
 //dat := FormatDateTime('d', Now);
 Reg:=TRegistry.Create;
 Reg.RootKey:=HKEY_LOCAL_MACHINE;
 Reg.OpenKey('мой путь', false);
 //k  := StrToInt(Reg.ReadString('Date'));
 k  := StrToDateTime(Reg.ReadString('Date'));
 Reg.CloseKey;
 Reg.Free;
 if Daysbetween(now, k) >= 5 then
    begin
      ShowMessage('Hello, world!');
     end;
end;
У меня пишет ошибку. Я где-то неправильно делаю! У меня saved_date - это k.

Последний раз редактировалось krikaved; 23.03.2012 в 22:13.
krikaved вне форума Ответить с цитированием
Старый 23.03.2012, 23:15   #25
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Код:
function DaysBetween(const ANow, AThen: TDateTime): Integer;
это что такое ? Уберите.
Чтобы использовать функцию DaysBetween надо в uses подключить модуль DateUtils

Что за ошибка-то ? ну и где : рантайм или компайлтайм ?

Ну и плюсом - зачем сохраняете дату отформатированной только в днях (причём , если не ошибаюсь, 5д это длинное название дня недели), не проще не форматить, или форматить только ддммгггг ?

Последний раз редактировалось phomm; 24.03.2012 в 10:42.
phomm вне форума Ответить с цитированием
Старый 24.03.2012, 10:34   #26
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

За флуд бы карточку красную вам, автор предыдущего поста!
По теме все проще.
Запись времени:
Код:
Reg.WriteDate('Мой путь',Now);
Чтение времени:
Код:
k := Reg.ReadDate('Мой путь');
"ковыряю изнутри" (с)

Последний раз редактировалось Serge_Bliznykov; 27.03.2012 в 11:54.
3D Hunter вне форума Ответить с цитированием
Старый 26.03.2012, 15:07   #27
krikaved
Пользователь
 
Регистрация: 26.02.2010
Сообщений: 66
По умолчанию

Спасибо большое phomm и 3D Hunter!
1) А вот по поводу реестра, если много процедур с ипользованием переменной Reg, нужно ли объявлять глобально переменую Reg (var Reg: TRegistry; ), или именно для использования реестра необходимо объявлять переменную Reg локально в каждой процедуре?
2) Почему я не везде могу добавлять новые разделы и параметры в реестре средствами Delphi 7, а вручную без Delphi могу добавлять где угодно. В HKEY_CURRENT_USER могу добавить раздел Prog, а в HKEY_LOCAL_MACHINE - нет. У меня Win7x64.
Код:
 reg:=TRegistry.Create;
 //reg.RootKey:=HKEY_CURRENT_USER;
 reg.RootKey:=HKEY_LOCAL_MACHINE;
 reg.OpenKey('Software\Microsoft\Windows\Prog', true);
 reg.WriteString('date','qqq');
 reg.CloseKey;
 reg.Free;

Последний раз редактировалось krikaved; 26.03.2012 в 15:18.
krikaved вне форума Ответить с цитированием
Старый 27.03.2012, 15:17   #28
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

1. Лучше используйте локальные переменные в своих процедурах. Глобальные - плохой стиль программирования.
2. Потому что сидите без прав администратора. Да и в реестре есть защищенные ветви, в которые программы писать не могут.
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Закрытие программы nikityan Общие вопросы Delphi 8 01.03.2012 00:33
Закрытие программы SKS Помощь студентам 3 13.11.2011 15:39
Закрытие программы ray_1k Общие вопросы C/C++ 12 09.07.2011 17:40
Закрытие программы Byurrer Общие вопросы C/C++ 8 06.04.2011 17:44
Закрытие программы Zloy_Doomer Общие вопросы Delphi 3 23.06.2008 19:08