Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Редактирование графических полей



Одно из полей таблицы является графическим. Оно предназначено для хранения картинки того биологического объекта, который представлен в текущей записи таблице. Мы должны научить программу вставлять такие картинки в данное поле и при необходимости заменять их.

Для этого у нас есть кнопка sbOpenImage и диалоговое окно OpenPictureDialog1. Назначение или замена картинки производится щелчком на кнопке. При этом вызывается окно графического диалога для выбора файла с картинкой формата jpeg. Если такой файл выбран, то картинка вставляется из него в поле Graphic таблицы. Для кнопки создадим всплывающую подсказку (свойство Hint кнопки) с текстом Добавить картинку. Чтобы подсказка появлялась при наведении курсора на кнопку, установим ее свойство ShowHint (показывать подсказку) в true.

Дважды щелкните на кнопке sbOpenImage и создайте событие для щелчка на кнопке. Перед ним разместите вспомогательную процедуру передачи содержимого файла в Bitmap (растровое изображение картинки):

procedure JPEGtoBMP(FileName: TFileName; var Bmp: TBitmap);
// процедура передачи содержимого графического файла в объект Bitmap
var jpg: TJPEGImage;
begin
jpg: =TJPEGImage.Create; // создание JPEG-картинки в памяти
jpg.CompressionQuality: =100; // качество сжатия
jpg.Compress; // сжать
jpg.LoadFromFile(FileName); // загрузка изображения из указанного файла
Bmp.Assign(jpg); // передача изображения из JPEG в Bitmap
FreeAndNil(jpg); // освобождение памяти, занятой JPEG
end;

Текст обработчика события для щелчка на кнопке:

procedure TForm1.sbOpenImageClick(Sender: TObject);
var FileName: TFileName;
Bmp: TBitmap;
begin
if Table1.Active then // если таблица открыта, то
if Table1.RecordCount > 0 then // если в таблице есть записи, то
if OpenPictureDialog1. Execute then // если файл картинки выбран, то
begin
if not (Table1.State in [dsEdit]) then Table1.Edit; // перевод таблицы в режим редактирования
FileName: = OpenPictureDialog1.FileName; // имя файла с картинкой
Bmp: = TBitmap.Create; // создаем Bitmap в памяти
try
JPEGtoBMP(FileName, Bmp); // передача картинки из файла в Bitmap
Table1Graphic.Assign(Bmp); // передача картинки из Bitmap в поле Graphic
FreeAndNil(bmp); // освободить память Bitmap
except // в случае исключительной ситуции делать:
ShowMessage('Не удалось загрузить картинку.');
FreeAndNil(bmp); // освободить память Bitmap
end;
end;
end;

Суть этого программного кода ясна из комментариев к каждому оператору. Добавим лишь, что поле Graphic хранит картинку в формате BMP (простейший растровый формат), поэтому нам потребовалась дополнительная процедура конвертации картинки из формата JPEG в формат BMP.

После ввода картинки в поле Graphic можно изменения сохранить или отменить при помощи соответствующих кнопок навигатора.

Указанным способом в таблицу ведена запись о новой рыбке Барбус. Вид окна с этой записью приведен на рис. 4.7.

Рис. 4.7. В таблицу добавлена новая запись с данными по рыбке Барбус

Для того чтобы убрать картинку из записи добавим новую кнопку с типом SpeedButton с именем sbClearImage. Для нее создадим всплывающую подсказку (свойство Hint кнопки) с текстом Удалить картинку. Чтобы подсказка появлялась при наведении курсора на кнопку, установим ее свойство ShowHint (показывать подсказку) в true.

Двойным щелчком на это кнопке создадим событие для очистки картинки:

procedure TForm1.sbClearImageClick(Sender: TObject);
begin
if Table1.Active then
if Table1.RecordCount > 0 then
begin
if not (Table1.State in [dsEdit]) then Table1.Edit;
DBImage1.Picture: = Nil; // освобождение памяти, занятой картинкой
end;
end;

Вид окна, с удаленной картинкой и новой кнопкой показан на рис. 4.8.

Рис. 4.8. Из записи о рыбке Барбус удалена картинка

На новой кнопке размещен Glyph с картинкой в виде красного крестика. Находящийся под ней объект, предназначенный для показа картинки пуст. Навигатор содержит активную кнопку отмены выполненной операции по удалению картинки и активную кнопку сохранению произведенных изменений, давая пользователю возможность выполнить требуемое действие.

Теперь наша программа умеет делать все намеченные процедуры.

 

Автономизация приложения

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

Не следует открывать таблицу в режиме 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;

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

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

Поскольку в начале своей работы программа открывает таблицу БД 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;

Сервисные улучшения


Поделиться:



Популярное:

Последнее изменение этой страницы: 2016-06-04; Просмотров: 592; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.021 с.)
Главная | Случайная страница | Обратная связь