Изображения и InterBase Blob-поля
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;
|
|