В начале работы программа должна вывести список дел, запланированных на дату запуска программы и ближайшие дни. Псевдоним базы данных должна создавать про грамма. Таблица данных должна находиться в том же каталоге, что и выполняемый файл программы. Если таблицы данных нет, то программа должна ее создать. Рекомендуемый вид формы программы приведен на рис. 1.76, структура записей БД — в табл. 1.3.

Рис. 1.76. Форма программы Ежедневник

Таблица 1.3. Поля записей базы данных "Ежедневник"

Поле

Тип

Размер

Информация

What

А

80

Мероприятие

Data

D

 

Дата

// Главный модуль программы "Организатор".
// Чтобы его увидеть, выберите в меню
// Project команду View Source
program org;
uses
Forms,
org_ in 'org_.pas' {Formlj,
SysUtils,Dialogs,
DateUtils, // для доступа к IncDay
DBTables; // для доступа к Session, AddStandardAlias
{$R *.res}
var
Present: TDateTime; // сегодня
NextDay: TDateTime; // следующий день
Year, Month, Day : Word; // год, месяц, день
Query: TQuery; // запрос, обеспечивающий
// создание БД (таблицы)
begin
Application.Initialize;
Application.Title := 'Ежедневник';
Application.CreateForm(TForml, Forml);
l Псевдоним для доступа к базе данных создается
во время запуска программы и существует только
во время работы программы.
База данных находится в том же каталоге, что
и выполняемый файл программы. Имя каталога,
в котором находится выполняемый файл, можно получить
обратившись к функции ParamStr. }
// создадим псевдоним
with Session do
begin
ConfigMode := cmSession;
AddStandardAlias('diary', // псевдоним БД
ExtractFilePath(ParamStr(0)), // каталог
'PARADOX');
end;
// определим текущую дату
Present:= Now; // Wow — функция, возвращает текущую дату
// и время
DecodeDate(Present, Year, Month, Day);
case (dof) DayOfWeek(Present) of
6: NextDay := IncDay(Present,3); // пятница
7: NextDay := IncDay(Present,2); // суббота
else NextDay := IncDay(Present,1)
end;
// запрос к базе данных: есть ли дела, запланированные
// на сегодня и ближайшие дни
Forml.Queryl.SQL[3] :=
'{Data >= '''+
FormatDateTime('dd/mm/yyyy',Present)+''')' + 'and'+
1 (Data <= ' ' ' + FormatDateTime (' dd/mm/yyyy', NextDay) + '")'/
try
Forml.Queryl.Open; // выполнить запрос
except
on E:EDBEngineError do
// Ошибка при выполнении запроса может
// быть вызвана тем, что файла базы данных нет.
// Предложить пользователю создать
// файл базы данных.
begin
MessageDlg('Файл таблицы базы данных не найден .'+#13+
'Таблица будет создана.',mtWarning, [mbYes],0);
Query := TQuery.Create(Forml);
with Query do
begin
// сформируем запрос, обеспечивающий
// создание БД
SQL.Add('CREATE TABLE diary (');
SQL.Add('What CHAR(80),');
SQL.Add('Data DATE);');
ExecSQL;
end;
// таблица создана
Forml.Queryl.Open; // выполним запрос
end;
end;
if Forml.Queryl.RecordCount <> 0 // есть дела,
. // запланированные на ближайшие дни
then
Forml.DataSourcel.DataSet := Forml.Query1
else
begin
Forml.DataSourcel.DataSet := Forml.Tablel;
Forml.Tablel.Open;
ShowMessage('На сегодня и ближайшие дни' +
1 никаких дел не запланировано.');
end;
Application.Run;
end.
unit org_; // модуль формы
{
Сразу после запуска программа посылает запрос к базе
данных, для того чтобы выяснить, есть ли дела, запланированные
на сегодня. Если что-то намечено, то на экране появляется окно
Ежедневник.
Запрос к базе данных в начале работы программы формирует
главная процедура приложения. Чтобы ее увидеть,
выберите из меню Project команду View Source.
1
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms, Dialogs, DB, Grids, DBGrids, DBTables,
StdCtrls, DBCtrls, ExtCtrls;
type
TForml = class(TForm)
Tablel: TTable;
DataSourcel: TDataSource;
DBGridl: TDBGrid;
Queryl: TQuery;
Labell: TLabel;
Buttonl: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
Label2: TLabel;
DBNavigatorl: TDBNavigator;
procedure FormActivate(Sender: TObject);
procedure ButtonlClick(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
I Private declarations j
public
{ Public declarations I
end;
var
Forml: TForml;
stDay : array[1..7] of string[ll] =
('воскресенье','понедельник','вторник',
1 среда','четверг','пятница','суббота'),
stMonth : array[1..12] of string[8] =
('января','февраля','марта',
'апреля','мая','июня','июля',
'августа','сентября','октября',
'ноября','декабря');
implementation
{$R *.dfm}
uses DateUtils;
// сегодняшняя дата и день недели
procedure TForml.FormActivate(Sender: TObject);
var
Present: TDateTime;
Year, Month, Day : Word;
begin
Present:= Now; // Now — функция, возвращает текущую дату
// и время
DecodeDate(Present, Year, Month, Day);
Labell.Caption := 'Сегодня ' + IntToStr(Day)+' '
+ StMonth[Month] + ' '+ IntToStr(Year)+' года, '
+ stDay[DayOfWeek(Present)];
Forml.Label2.Caption := 'Сегодня и ближайшие дни';
end;
// щелчок на кнопке Сегодня
procedure TForml.Button2Click(Sender: TObject);
var
st : string; // критерий запроса
begin '
Forml.Label2.Caption := 'Сегодня';
st:= FormatDateTime('dd/ram/yyyy',Now);
Forml. Query 1. SQL [3] := ' (Data = "• +st+ "')';
Forml.Queryl.Open;
if forml.Queryl.RecordCount <> 0 then
forml.DataSourcel.DataSet := Forml.Queryl
else begin
ShowMessage('На сегодня никаких дел не запланировано.1);
//forml.DataSourcel.DataSet := Tablel;
end;
end;
// завтра
procedure TForml.Button3Click(Sender: TObject);
var
Present, // сегодня'
Tomorrow: TDateTime; // завтра
begin
Forml.Label2.Caption := 'Завтра';
Present:= Now; // Now — функция, возвращает текущую дату
// и время
Tomorrow := IncDay(Present); // завтра
Forml.Queryl.SQL[3] : =
'(Data = '''+ FormatDateTime('dd/mm/yyyy',Tomorrow)+''')';
Forml.Queryl.Open;
if forml.Queryl.RecordCount <> 0 then
forml.DataSourcel.DataSet := Forml.Queryl
else
ShowMessage('На завтра никаких дел не запланировано.1);
end;
// на этой неделе
procedure TForml.Button4Click(Sender: TObject);
var
Present: TDateTime;
EndOfWeek: TDateTime;
begin
Forml.Label2.Caption := 'На этой неделе';
Present:= Now; // Now — функция, возвращает текущую дату
// и время
EndOfWeek := StartOfAWeek(YearOf(Present),WeekOf(Present)+1);
Forml.Queryl.SQL[3] :=
'(Data >= '''+
FormatDateTime (' dd/rtim/yyyy', Present) + ''')' + ' and' +
'(Data < ' ' ' +
FormatDateTime ('dd/mm/yyyy', EndOfWeek)+ ' ' ') ' ;
Forml.Queryl.Open;
if forml.Queryl.RecordCount <> 0 then
forml.DataSourcel.DataSet := Forml.Queryl
else
ShowMessage('На эту неделю никаких дел не запланировано.');
end;
// на следующей неделе
procedure TForml.ButtonlClick(Sender: TObject);
var
Present: TDateTime;
dl, d2: TDateTime;
begin
Forml.Label2.Caption := 'На следующей неделе1;
Present:= Now; // Wow — функция, возвращает текущую дату
// и время
dl := StartOfAWeek(YearOf(Present),WeekOf(Present)+1) ;
d2 := StartOfAWeek(YearOf(Present),WeekOf(Present)+2);
Forml.Queryl.SQL[3] :=
'(Data >= '''+ FormatDateTime('dd/mm/yyyy', dl) + ''')' +
'and'+
'(Data < "'+ FormatDateTime ('dd/mm/yyyy',d2)+ 111)';
Forml.Queryl.Open;
if forml.Queryl.RecordCount <> 0 then
forml.DataSourcel.DataSet := Forml.Queryl
else
ShowMessage('На следующую неделю никаких дел
не запланировано.');
end;
// показать все записи
procedure TForml.Button5Click(Sender: TObject);
begin
Forml.Label2.Caption := 'Все, что намечено сделать';
DataSourcel.DataSet := Tablel;
Tablel.Active : = True;
end;
end.