C++ Builder - вопросы программирования

         

Обработка события Click на кнопках



Листинг 5.1

. Обработка события Click на кнопках Сегодня, Завтра и Эта неделя // Щелчок на кнопке Сегодня void __fastcall TForml::ButtonlClick(TObject *Sender) { AnsiString today = FormatDateTime("dd/mm/yyyy",Now());
Forml->
Label2->
Caption = "Сегодня"; // изменить критерий запроса Queryl->
SQL->
Strings[3] = "(Date_F = '" + today + "')"; // выполнить запрос Forml->
Queryl->
Open();
Forml->
DataSourcel->
DataSet = Forml->
Queryl; if ( ! Forml->
Queryl->
RecordCount) { ShowMessage("Ha сегодня никаких дел не запланировано!");
} } // щелчок на кнопке Завтра void __fastcall TForml::Button2Click(TObject *Sender) { < AnsiString tomorrow = FormatDateTime("dd/mm/yyyy", Now() +1);
Forml->
Label2->
Caption = "Завтра"; // изменить критерий запроса Queryl->
SQL->
Strings[3] = "(Date_F = '" + tomorrow + "')"; // выполнить запрос Forml->
Queryl->
Open();
Forml->
DataSourcel->
DataSet = Forml->
Queryl; if ( ! Forml->
Queryl->
RecordCount) { ShowMessage("На завтра никаких дел не запланировано!");
} } // щелчок на кнопке Эта неделя void __fastcall TForml::Button3Click(TObject *Sender) { // от текущего дня до конца недели (до воскресенья) TDateTime Present, EndOfWeek; Label2->
Caption = "На этой неделе"; Present= Now();
// Now — возвращает текущую дату // для доступа к StartOfWeek, EndOfWeek, YearOf и WeekOf // надо подключить DateUtils.hpp (см. директивы tfinclude) // ************************** EndOfWeek = StartOfAWeek(YearOf(Present),WeekOf(Present)+1);
Queryl->
SQL->
Strings[3] = "(Date_F >
= '"+ FormatDateTime("dd/mm/yyyy",Present)+"') AND " + "(Date_F< '"+ FormatDateTime("dd/mm/yyyy",EndOfWeek)+"'}"; Queryl->
0pen();
if ( Queryl->
RecordCount) { DataSourcel->
DataSet = Forml->
Queryl; } else ShowMessage("На эту неделю никаких дел не запланировано.");
}
В результате щелчка на кнопке Все в диалоговом окне программы должно быть выведено все содержимое базы данных. Базу данных представляет компонент Table1. Поэтому функция обработки события click на кнопке Все просто "переключает" источник данных на таблицу (листинг 5.2).



Листинг 5.2.

Обработка события на кнопке Все // Щелчок на кнопке Все void__fastcall TForml::Button4Click(TObject *Sender) { // установить: источник данных — таблица // таким образом, отобажается вся БД Forml->
DataSourcel->
DataSet = Forml->
Tablel; Label2->
Caption = "Все, что намечено сделать"; }
Программа "Ежедневник" спроектирована таким образом, что при каждом ее запуске в диалоговом окне выводится текущая дата и список дел, запланированных на этот и ближайшие дни. Вывод даты и названия дня недели в поле Label выполняет функция обработки события onActivate (ее текст приведен в листинге 5.3). Эта же функция формирует критерий запроса к базе данных, обеспечивающий вывод списка задач, решение которых запланировано на сегодня (в день запуска программы) и на завтра. Если программа запускается в пятницу, субботу или воскресенье, то завтрашним днем считается понедельник. Такой подход позволяет сделать упреждающее напоминание, ведь, возможно, что пользователь не включит компьютер в выходные дни.



Листинг 5.3

. Функция обработки события OnActivate AnsiString stDay[7] = ("воскресенье","понедельник", "вторник", "среда", "четверг","пятница","суббота"}; AnsiString stMonth[12] = {"января","февраля","марта", "апреля","мая","июня","июля", "августа","сентября", "октября", "ноября","декабря"}; // активизация формы void _fastcall TForml::FormActivate(TObject *Sender) { TDateTime Today, // сегодня NextDay; // следующий день Сне обязательно завтра) Word Year, Month, Day; // год, месяц, день Today = Now ();
DecodeDate(Today, Year, Month, Day);
Labell->
Caption = "Сегодня " + IntToStr(Day) + " " + stMonth[Month-l] + " " + IntToStr(Year) + " года, " + stDay[DayOfWeek(Today) -1]; Label2->
Caption = "Сегодня и ближайшие дни"; // вычислим следующий день // если сегодня пятница, то, чтобы не забыть, // что запланировано на понедельник, считаем, что следующий * // день — понедельник switch ( DayOfWeek(Today)) { case 6 : NextDay = Today + 3; break; // сегодня пятница case 7 : NextDay = Today + 2; break; // сегодня суббота default : NextDay = Today + 1; break; } // запрос к базе данных: есть ли дела, запланированные // на сегодня и на следующий день Queryl->
SQL->
Strings[3] = "(Date_F >
= '"+ FormatDateTime("dd/mm/yyyy",Today)+"') AND " + "(Date_F<= '"+ FormatDateTime("dd/mm/yyyy",NextDay)+"')"; Queryl->
Open();
DataSourcel->
DataSet = Forml->
Queryl; if ( ! Queryl->
RecordCount) { ShowMessage("На сегодня и ближайшие дни никаких дел не запланировано.");
} }


Использование псевдонима для доступа к базе данных обеспечивает независимость программы от размещения данных в системе, позволяет размещать программу работы с данными и базу данных на разных дисках компьютера, в том числе и на сетевом. Вместе с тем для локальных баз данных типичным решением является размещение базы данных в отдельном подкаталоге того каталога, в котором находится программа работы с базой данных. Таким образом, программа работы с базой данных "знает", где находятся данные. При таком подходе можно отказаться от создания псевдонима при помощи Database Desktop и возложить задачу создания псевдонима на программу работы с базой данных. Очевидно, что такой подход облегчает администрирование базы данных.

В качестве иллюстрации сказанного в листинге 5.4 приведен вариант реализации функции OnActivate, которая создает псевдоним для базы данных organizer. Предполагается, что база данных находится в подкаталоге DATA того каталога, в котором находится выполняемый файл программы. Непосредственное создание псевдонима выполняет функция AddStandardAlias, которой в качестве параметра передается псевдоним и соответствующий ему каталог. Так как во время разработки программы нельзя знать, в каком каталоге будет размещена программа работы с базой данных и, следовательно, подкаталог базы данных, имя каталога определяется во время работы программы путем обращения к функциям Paramstrto) и ExtractFilePatch. Значение первой — полное имя выполняемого файла программы, второй — путь к этому файлу. Таким образом, процедуре AddStandardAlias передается полное имя каталога базы данных.



Листинг 5.4.

Создание псевдонима во время работы программы void__fastcall TForml::FormActivate(TObject *Sender) { TDateTime Today, // сегодня NextDay; // следующий день (не обязательно завтра) Word Year, Month, Day; // год, месяц, день Today = Now (}; DecodeDate(Today, Year, Month, Day);
Labell->
Caption = "Сегодня " + IntToStr(Day) + " " + stMonth[Month-l] + " " + IntToStr(Year) + " года, " + stDay[DayOfWeek(Today) -1] ; Label2->
Caption = "Сегодня и ближайшие дни"; // вычислим следующий день // если сегодня пятница, то, чтобы не забыть, // что запланировано на понедельник, считаем, что следующий // день — понедельник switch ( DayOfWeek(Today)) { case 6 : NextDay = Today + 3; break; // сегодня пятница case 7 : NextDay = Today + 2; break; // сегодня суббота default : NextDay = Today + 1; break; } #define DIN_ALIAS // псевдоним доступа к БД создается динамически // если псевдоним создан при помощи Database Desktop // или BDE Administrator, директиву tfdefine DIN_ALIAS //надо удалить ("закомментировать") #ifdef DIN_ALIAS // псевдоним создается динамически // создадим псевдоним для доступа к БД Session->
ConfigMode = cmSession; Session->
AddStandardAlias("organizer", ExtractFilePath(ParamStr(0))+"DATA\\", "PARADOX");
// база данных "Ежедневник" // в формате Paradox #endif Forml->
Tablel->
Active = true; // открыть таблицу // запрос к базе данных: есть ли дела, запланированные // на сегодня и завтра Queryl->
SQL->
Strings[3] = "(Date_F >
= '"+ FormatDateTime("dd/mm/yyyy",Today)+"') AND " + "(Date_F <= '"+ FormatDateTime("dd/mm/yyyy",NextDay)+'")"; Queryl->
0pen();
DataSourcel->
DataSet = Forml->
Queryl; if ( ! Queryl->
RecordCount) ( ShowMessage("На сегодня и ближайшие дни никаких дел не запланировано.");
} }
 


Содержание раздела