Об открытии БД

Не следует открывать таблицу в режиме DesignTime, то есть при написании программы в Delphi (ее можно временно открывать там лишь при отладке программы). В готовой программе таблица должна быть закрыта. Таблицу нужно открывать программно в работающей программе, то есть в режиме RunTime. Причем запускать программу следует не из Delphi, а при помощи ярлыка программы или в проводнике двойным щелчком на файле Biolife2. exe, то есть также, как запускаются и всякие другие программы.

Наше приложение обладает одним существенным недостатком - оно способно работать лишь на том компьютере, где имеется БД с алиасом DbBiolife2. То есть если скопировать папку Biolife2 на флешку и с нее запустить программу на другом компьютере, то программа не найдет БД DbBiolife2, а следовательно, откажется работать. То есть наша программа пока полностью зависима от БД DbBiolife2. Сейчас мы сделаем программу независимой, автономной.

Идея автономизации программы заключается в том, что папка db с базой данных находится в той же папке, что и программа Biolife2. exe. Следовательно, если определить папку, в которой находится эта программа, то легко определить и папку с базой данных. Составим функцию логического типа, которая возвратит true, если ей удалось найти папку БД, файл таблицы и открыть её.

Не исключено также, что на компьютере может отсутствовать BDE (Borland Database Engine) - движок работы с БД типа Paradox. Если на компьютере установлена Delphi, то на нем установлен и BDE (он устанавливается вместе с Delphi). Если Delphi на компьютере отсутствует, то для работы нашей программы BDE можно установить отдельно. Поэтому кроме проверки наличия БД, надо еще и проверять наличие BDE.

Наличие BDE можно проверить функцией

function BDEInstalled: Boolean;
begin
Result:= (dbiInit(nil) = 0);
if not Result then ShowMessage('BDE не установлен.');
end;

Текст функции TableActivate с комментариями приведен ниже

function TableActivate: boolean;
var ExeDir, DbDir, DbFile: String; // переменные для папки приложения, папки БД и файла biolifes. db
begin
Result:= false; // начало поиска
if BDEInstalled then // если BDE установлен, то
begin
ExeDirt:= ExtractFilePath(Application.ExeName); // папка, где лежит приложение
DbDir:= ExeDir+'db\'; // папка с базой данных
DbFile:= DbDir+Form1.Table1.TableName; // полный путь к файлу БД biolifes.db
if FileExists(DbFile) then // если файл с таблицей найден, то
begin
Form1.Table1.DataBaseName:= DbDir; // имя БД делаем равным адресу папки БД
Form1.Table1.Open; // открываем таблицу Table1, которая лежит на форме Form1, поскольку файл таблицы найден
Result:= true; // таблица найдена и открыта
end;
end;

end;

Далее надо решить вопрос о том, когда нужно обращаться к этой функции. Лучше всего это сделать тогда, когда после запуска программы форма Form1 становится активной. Для этого создадим для формы Form1 событие OnActivate:

procedure TForm1.FormActivate(Sender: TObject);
begin
if not TableActivate then ShowMessage('Не удалось открыть таблицу БД.');
end;

Теперь при активации формы если БД не удалось открыть, будет выдано соответствующее сообщение. Если же таблица найдена, то она без дополнительных сообщений откроется и будет готова к работе.

2.5.2. О закрытии приложения

Поскольку в начале своей работы программа открывает таблицу БД Table1, то при завершении работы программа должна эту таблицу закрыть. Следует сказать, что изменения, которые происходят с таблицей во время работы программы, находятся в оперативной памяти, то есть на диске в файле таблицы находятся старые данные, в то время как в оперативной памяти в таблице могут произойти изменения. Поэтому время от времени эти изменения следует фиксировать в файле biolifes. db. Можно это делать всякий раз, когда срабатывает событие AfterPost (после фиксации изменений) таблицы Table1, а можно и один раз, когда происходит выход из программы. Сброс данных из таблицы в файл производите методом FlushBuffers. Следовательно, перед закрытием таблицы, необходимо сбросить данные из Table1 в файл biolifes. db, иначе они будут потеряны.

На этом основании можно составить программный код обработки таблицы при закрытии формы, когда срабатывает событие формы OnClose:

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if Table1.Active then // если таблица открыта, то
begin
Table1.FlushBuffers; // сброс изменений из таблицы в файл biolifes. db
Table1.Close; // закрытие таблицы
end;
end;


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: