dBASE и Paradox таблицы имеют в своем арсенале BLOB-поля,
позволяющие хранить бинарные данные, в том числе bitmap-формат,
отображаемый с помощью компонента TDBImage. В Database Desktop
данный тип полей указан как Binary и Graphic (для dBASE и Paradox
таблиц, соответственно). Тем не менее, процесс сохранения
изображений в InterBase BLOB-полях и их использование в компонентах
TDBImage не такой уж простой.
Таблицы InterBase не имеют простого типа BLOB-поля. Есть три
варианта, или подтипа: тип 0, тип 1 и подтип, определенный
пользователем. Типы 0 и 1 - "встроенные" типы. Тип 0 - BLOB-поля
(тип по умолчанию) для хранения общих бинарных данных. Тип 1 -
BLOB-поля для хранения текстовых BLOB-данных. Ни один из
предопределенных типов не допускает автоматического извлечения
данных изображения из BLOB-поля для его последующего отображения в
компоненте TDBImage. BLOB-поля типа 0 могут использоваться для
хранения данных bitmap-формата, но данные должны извлекаться и
передаваться в объект типа TBitmap программным путем. Вот пример
ручного извлечения данных изображения, хранящихся в BLOB-поле типа 0
(Table1BLOBField), и его показ в компоненте TImage (не
предназначенным для работы с БД) :
procedure TForm1.ExtractBtnClick(Sender: TObject);
begin
Image1.Picture.Bitmap.Assign(Table1BLOBField);
end;
|
Естественно, поскольку это должно делаться вручную, данный
процесс менее желателен в приложении, нежели автоматическое
отображение данных изображения в комбинации BDE и компонента
TDBImage. Здесь происходит определение подтипа определенного
пользователем BLOB-поля. При работе с данными подтип BLOB-поля
учитывается, т.к. сохраненные первыми данные устанавливают тип
данных для этого поля для всей таблицы целиком. Таким образом, если
данные bitmap-формата оказывается первым загружаемым типом, то
данный формат будет единственно возможным для данного поля. До сих
пор по умолчанию тип бинарного BLOB-поля (предопределенный тип 0)
позволял BDE читать и отображать данные в компоненте TDBImage без
особых проблем.
Утилиты Database Desktop допускают создание бинарных BLOB-полей
только типа 0 и не имеют возможности самим определять подтипы
BLOB-полей. Из-за такого ограничения таблицы, подразумевающие
хранение и вывод изображений, должны создаваться с помощью
SQL-запросов. Обычно это делается посредством утилиты WISQL, но
вполне достаточно выполнение SQL-запроса с помощью компонента
TQuery. Ниже приведен SQL-запрос, создающий таблицу с определенным
пользователем подтипом BLOB-поля:
CREATE TABLE WITHBMP
(
FILENAME CHAR(12),
BITMAP BLOB SUB_TYPE -1
)
|
После создания таблицы с совместимыми BLOB-полями, для хранения
данных изображения в BLOB-поле и его вывода в компоненте TDBImage
используются те же самые методы, что и при работе с таблицами dBASE
и Paradox.
Имеется множество способов загрузки изображений в BLOB-поле. Три
самых простых метода включают в себя:
- копирование данных из буфера обмена Windows в компонент
TDBImage, связанный с BLOB-полем
- использование метода LoadFromFile компонента TBLOBField
- использование метода Assign для копирования объекта типа
TBitmap в значение свойства Picture компонента
TBDBImage.
Первый способ, когда происходит копирование
изображения из буфера обмена, вероятно, наиболее удобен в случае,
когда необходимо добавить изображение в таблицу при использовании
приложения конечным пользователем. В этом случае компонент TDBImage
используется в роли интерфейса между BLOB-полем таблицы и
изображением, хранящимся в буфере обмена. Метод PasteFromClipboard
компонента TDBImage как раз и занимается тем, что копирует
изображение из буфера обмена в TDBImage. При сохранении записи
изображение записывается в BLOB-поле таблицы.
Поскольку буфер обмена Windows может содержать данные различных
форматов, то желательно перед вызовом метода CopyFromClipboard
осуществлять проверку формата хранящихся в нем данных. Для этого
необходимо создать объект TClipboard и использовать его метод
HasFormat, позволяющий определить формат хранящихся в буфере данных.
Имейте в виду, что для создания объекта TClipboard вам необходимо
добавить модуль Clipbrd в секцию uses того модуля, в котором будет
создаваться экземпляр объекта.
Вот исходный код примера, копирующий содержание буфера обмена в
компонент TDBImage, если содержащиеся в буфере данные имеют формат
изображения:
procedure TForm1.Button1Click(Sender: TObject);
var
C: TClipboard;
begin
C := TClipboard.Create;
try
if Clipboard.HasFormat(CF_BITMAP) then
DBImage1.PasteFromClipboard
else
ShowMessage('Буфер обмена не содержит изображения!');
finally
C.Free;
end;
end;
|
Второй способ заполнения BLOB-поля заключается в загрузке
изображения непосредственно из файла в BLOB-поле. Данный способ
одинаково хорош как при создании приложения (формирование данных),
так и при его использовании.
Этот способ использует метод LoadFromFile компонента TBLOBField,
который применяется в Delphi для работы с dBASE-таблицами и
двоичными Windows полями или таблицами Paradox и графическими
Windows полями; в обоих случаях с помощью данного метода возможно
загрузить изображение и сохранить его в таблице.
Методу LoadFromFile компонента TBLOBField необходим единственный
параметр типа String: имя загружаемого файла с изображением.
Значение данного параметра может быть получено при выборе файла
пользователем с помощью компонента TOpenDialog и его свойства
FileName.
Вот пример, демонстрирующий работу метода LoadFromFile компонента
TBLOBField с именем Table1Bitmap (поле с именем Bitmap связано с
таблицей TTable, имеющей имя Table1):
procedure TForm1.Button2Clicck(Sender: TObject);
begin
Table1Bitmap.LoadFromFile(
'c:\delphi\images\splash\16color\construc.bmp');
end;
|
Третий способ для копирования содержимого объекта типа TBitmap в
свойство Picture компонента TDBImage использует метод Assign. Объект
типа TBitmap может быть как свойством Bitmap свойства-объекта
Picture компонента TImage, так и отдельного объекта TBitmap. Как и в
методе, копирующем данные из буфера обмена в компонент TDBImage,
данные изображения компонента TDBImage сохраняются в BLOB-поле после
успешного сохранения записи.
Ниже приведен пример, использующий метод Assign. В нашем случае
используется отдельный объект TBitmap. Для помещения изображения в
компонент TBitmap был вызван его метод LoadFromFile.
procedure TForm1.Button3Click(Sender: TObject);
var
B: TBitmap;
begin
B := TBitmap.Create;
try
B.LoadFromFile('c:\delphi\images\splashh\16color\athena.bmp');
DBImage1.Picture.Assign(B);
finally
B.Free;
end;
end;
|
|