Консультация № 159989
09.02.2009, 10:39
0.00 руб.
0 9 1
Здравствуйте , уважаемые эксперты.

Такой вопрос:

Надо сделать прогу, которая при открытии показывала бы разные сообщения в зависимости от календарной даты.
Что посоветуете новичку? Просто направление - делать базу данных, или кучу окон или еще какой-то прием? На что обратить внимание. Прога должна получиться максимально простой (в смысле установки и эксплуатации).

Меня интересует особенно как сделать (пример кода), чтобы происходило какое либо событие в зависимости от календарной даты.
Как прописать, чтобы 9 февраля прога делала одно событие, а 23 марта другое?
Искал в инете, но не нашел ничего ...

Заранее благодарю за ответ!

Обсуждение

давно
Профессионал
153662
1070
09.02.2009, 10:58
общий
Можно сделать базу данных в access, куда внести поле дата и поле сообщение, после запуска программы она находит соответствующую запись по текущему числу и выводит на экран сообщение из соответствующего поля. Если хотите, то как освобожусь накидаю код. Можно так же заставить проигрывать какой нибудь файл.
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

Неизвестный
09.02.2009, 11:21
общий
спасибо за ответ! было бы неплохо, если это не трудно... Мне главное общее направление, там уже сам попытаюсь разобраться.
давно
Профессионал
153662
1070
09.02.2009, 11:25
общий
Как будет на работе окно, в течение дня, сделаю.
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

Неизвестный
09.02.2009, 11:28
общий
Спасибо огромное!
Неизвестный
09.02.2009, 12:09
общий
Есть ещё один простой совет. Можно не привязываться к базам данных, а просто сделать пару файлов. В первом файле (сделайте его текстовым) храните сами сообщения. Формат второго - на Ваше усмотрение, он может быть и текстовым, и бинарным, как Вам удобнее. В нём каждая запись будет состоять из трёх значений: дата, номер строки с началом сообщения и номер строки с концом сообщения. Естественно, что сообщения будут браться из первого файла. Такой подход сделает Вашу программу независимой от того, что установлено на компьютере, соответственно, её будет проще копировать куда-либо.
Если Вы всё же хотите привязаться к серьёзной СУБД, я бы порекомендовал не Access, а к примеру PostgreSQL или MySQL.
Неизвестный
09.02.2009, 12:15
общий
Спасибо! Хорошая идея насчет пары файлов.
Но я не знаю как привязать все это к дате .
Сам код! Я новичек...
давно
Профессионал
153662
1070
09.02.2009, 14:01
общий
это ответ
Здравствуйте, Crusi2007!
Вот программа которая у меня получилась, она создана на основе базы данных access 2002. При загрузки программы она считывает данные из базы в stringlist и начинает проверять по таймеру совпадения по времени, как только совпало текущее время и время из базы данных, на форму выводится сообщение из соответствующего поля. Код в приложении, а весь проект по URL >>адресу. Разобраться с программой не должно вызвать проблем. Может быть не самое лучшее решение, зато работает на любой машине и не требует инсталляции.

Приложение:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, ADODB, Menus, ExtCtrls, ComCtrls;

type
TForm1 = class(TForm)
MainMenu1: TMainMenu;
Timer1: TTimer;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
N5: TMenuItem;
ADOConnection1: TADOConnection;
StatusBar1: TStatusBar;
ADOQuery1: TADOQuery;
Timer2: TTimer;
procedure N2Click(Sender: TObject);
procedure N3Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Timer1Timer(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure N5Click(Sender: TObject);
procedure Timer2Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
TimeMem: TStringList;

implementation

uses Unit2, MMSystem;

{$R *.dfm}

procedure TForm1.N2Click(Sender: TObject);
begin
Application.CreateForm(TForm2, Form2);
ADOConnection1.Connected:= True;
Form2.ADOTable1.Active:= true;
Form2.Show;
end;

procedure TForm1.N3Click(Sender: TObject);
begin
Close;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
TimeMem.free;
Action:= caFree;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
i: Byte; a: String;
begin
statusbar1.Panels[0].Text:=timetostr(time); // Индикация текущего времени на панели состояния
If TimeMem.Count = 0 then
exit;
I:= 0;
a:= TimeToStr(Time); // Расчёт времени
While I < TimeMem.Count-1 do // Проверка времени на совпадение с списком
begin
If TimeMem.Strings[I] = a then
begin
Form1.Canvas.TextOut(50, 50, TimeMem.Strings[I + 1]);
Windows.Beep(500,500); // Веер на встроенный спикер
If N5.Checked then
sndPlaySound(pchar(ExtractFilePath(ParamStr(0))+'sound\NACHALO.wav'), SND_FILENAME or SND_ASYNC); //
timer2.Enabled:= True;
break; // Досрочный выход из цикла For
end;
Inc(I,2);
end;
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
ADOQuery1.Close; // Закрыть запрос
ADOQuery1.SQL[2]:=(' where data=:dat '); // Добавление новых данных в запрос
ADOQuery1.Parameters.ParamByName('dat').Value:= DateToStr(Date);
ADOQuery1.Open; // Открытие запроса
if ADOQuery1.RecordCount > 0 then // Проверка результата запроса
begin
ADOQuery1.First; // Переход на первую запись в запросе
TimeMem.Clear; // Отчистили список напоминания
while not ADOQuery1.Eof do // Делать пока не будет конец запроса
begin
If ADOQuery1.Fields.FieldByName('vremya').AsString <> '' then
begin
TimeMem.Add(ADOQuery1.Fields.FieldByName('vremya').Value); // Вставить запись в список
TimeMem.Add(ADOQuery1.Fields.FieldByName('soobshenie').Value); // Вставить запись в список
end
else
TimeMem.Add('0:01');
ADOQuery1.Next; // Переход на следующюю запись запроса
end;
end;
Timer1.Enabled:= True;
ADOConnection1.Connected:= False;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
ADOConnection1.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source='
+ExtractFilePath(ParamStr(0))+'data\napominalka.mdb'; // Добавление параметров базы
Try
ADOConnection1.Connected:=true; // Подключение базы
Except
MessageDlg('Похоже база не найдена',mtWarning,[mbOK],0);
end;
TimeMem:= TStringList.Create; // Создали список времени напоминания
end;

procedure TForm1.N5Click(Sender: TObject);
begin
If N5.Checked then
n5.Checked:= False
else
n5.Checked:= True;
end;

procedure TForm1.Timer2Timer(Sender: TObject);
begin
Timer2.Enabled:= False;
Form1.Repaint;
end;

end.


unit Unit2;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, DBCtrls, Grids, DBGrids, DB, ADODB;

type
TForm2 = class(TForm)
DataSource1: TDataSource;
DBGrid1: TDBGrid;
DBNavigator1: TDBNavigator;
ADOTable1: TADOTable;
ADOTable1id: TAutoIncField;
ADOTable1data: TDateTimeField;
ADOTable1vremya: TDateTimeField;
ADOTable1soobshenie: TWideStringField;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form2: TForm2;

implementation

{$R *.dfm}

uses unit1;

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Form1.ADOConnection1.Connected:= False;
ADOTable1.Active:= False;
Action:= caFree;
end;

end.
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

давно
Профессионал
153662
1070
09.02.2009, 14:04
общий
Когда то делал программу на основе списка из двух файлов, но по сравнению с программой из базы данных access, она получается более сложнее и увестистей. Да и для такой проги использовать PostgreSQL или MySQL слишком жирно.
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

Неизвестный
09.02.2009, 18:10
общий
Еще раз спасибо! Мне особено звук понравился, прикольно! :)
Буду пытаться повторить нечто подобное...
Форма ответа