Главная » Delphi » Работа с полями типа BLOB

0

Поля  BLOB (Binary  Large Object) разработаны для размещения в них данных  неоп ределенного размера. Поля  BLOB в одной  записи набора данных  могут содержать 3 байта  данных, в то  время  как  подобное же  поле  в другой  записи может  содержать

3 Кбайта данных. Эти поля наиболее удобны для хранения большого количества тек

ста, графики либо таких непредсказуемых типов данных, как объекты OLE.

Класс TBlobField и типы полей

Как уже отмечалось в этой главе, в библиотеке VCL существует класс TBlobField, производный от класса TField и специально предназначенный для инкапсуляции полей BLOB. Класс  TBlobField содержит свойство BlobType типа  TBlobType, которое ото бражает, какой именно тип данных хранится в его поле BLOB. Тип TBlobType определен в модуле DB следующим образом:

TBlobType = ftBlob..ftOraClob;

Все возможные типы  объектов и данных, которые может  принимать поле  BLOB, приведены в табл. 7.4.

Таблица 7.4. Типы полей класса TBlobField

Тип поля                                                Тип данных

ftBlob              Нетипизированные  или   определенные  пользователем данные

ftMemo                   Текст

ftGraphic   Растровая графика Windows ftFmtMemo Поле MEMO в формате Paradox ftParadoxOle  Объект OLE

ParadoxОкончание табл. 7.4.

Тип поля                                  Тип данных

ftDBaseOLE           Объект OLE dBASE

ftTypedBinary        Любые неструктурированные данные

ftCursor..ftDataSet  Недопустимые типы BLOB ftOraBlob            Поля BLOB таблиц  Oracle8 ftOraClob            Поля CLOB таблиц  Oracle8

Как правило, основная часть  работы по выборке и помещению данных  в компо нент  класса  TBlobField может  быть  выполнена при  их загрузке  или  сохранении в файле либо с помощью компонента класса TBlobStream. Класс TBlobStream являет ся специализированным, производным от класса  TStream, который использует поле BLOB внутри  физической таблицы как место  размещения потока. Для демонстрации методов взаимодействия с компонентом класса  TBlobField создадим  демонстраци онное приложение.

Пример использования  поля BLOB

В описанном далее проекте создается приложение, которое позволяет пользователю сохранять звуковые  файлы (.wav) в таблице базы  данных, а затем  воспроизводить их непосредственно из этой  таблицы. Начните проект с создания главной формы с компо нентами, показанными на рис. 7.9. Компонент TTable может описывать таблицу Wavez, расположенную в соответствии с псевдонимом DDGUtils, или вашу собственную табли цу с подобной структурой. Структура таблицы Wavez приведена ниже.

Имя поля

Тип поля

Размер

WaveTitle

Character

25

FileName

Wave

Character

BLOB

25

Рис. 7.9. Главная форма для таблицы

Wavez — примера использования поля BLOB

Кнопка Add используется для загрузки  звукового  файла  с диска  и добавления его в таблицу. Подпрограмма обработки события OnClick кнопки Add имеет следующий вид:

procedure TMainForm.sbAddClick(Sender: TObject);

begin

if OpenDialog.Execute then begin

tblSounds.Append;

tblSounds[‘FileName’] := ExtractFileName(OpenDialog.FileName);tblSoundsWave.LoadFromFile(OpenDialog.FileName);

edTitle.SetFocus;

end;

end;

В этой  процедуре сначала  предпринимается попытка выполнить метод  OpenDia- log. Если такая  операция выполняется успешно,  то источник данных  tblSound пе реключается в режим  Append, полю  FileName присваивается значение и поле  типа BLOB по  имени Wave заполняется  данными из  файла, определенного параметром OpenDialog. Обратите внимание, насколько удобно использовать здесь метод  Load- FromFile класса TBlobField и как просто выглядит код загрузки файла  в поле BLOB.

Подобным же образом щелчок на кнопке Save приводит к сохранению во внеш

нем файле содержимого звукового файла, расположенного в поле Wave. Код процеду

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

procedure TMainForm.sbSaveClick(Sender: TObject);

begin

with SaveDialog do begin

FileName := tblSounds[‘FileName’];

//

Получить имя файла

if Execute then

//

Диалог Execute

tblSoundsWave.SaveToFile(FileName);

//

Сохранить blob в файл

end;

end;

В данном  методе  используется еще  меньше  кода.  Объект SaveDialog инициали зируется значением  поля  FileName. Если  процедура SaveDialog выполняется ус пешно, то для сохранения содержимого поля  BLOB в файле вызывается метод  Save- ToFile объекта tblSoundsWave.

Обработчик кнопки Play считывает звуковые  данные из поля  BLOB и передает их функции API PlaySound() для воспроизведения. Код этого  обработчика приведен ни же. Обратите внимание, что данный код немного сложнее приведенного выше кода для кнопки Save.

procedure TMainForm.sbPlayClick(Sender: TObject);

var

B: TBlobStream;

M: TMemoryStream;

begin

// Создание потока BLOB

B := TBlobStream.Create(tblSoundsWave, bmRead);

Screen.Cursor := crHourGlass; // Отображение песочных часов

try

M := TMemoryStream.Create;        // Создание потока памяти

try

// Копирование из потока BLOB в поток памяти

M.CopyFrom(B, B.Size);

// Попытка воспроизвести звук. Передача исключения,

// если что-нибудь будет не так, как надо.

Win32Check(PlaySound(M.Memory, 0, SND_SYNC or SND_MEMORY));

finally

M.Free;

end;finally

Screen.Cursor := crDefault;

B.Free;                           // Освобождение памяти

end;

end;

Сначала  этот  метод  создает  экземпляр класса  TBlobStream по имени B, используя поле  BLOB таблицы tblSoundsWave. Первый параметр, передаваемый методу TBlob- Stream.Create(), является объектом поля  BLOB, а второй параметр указывает, как следует открыть поток.  Обычно к потоку BLOB обращаются только  для чтения, исполь зуя значение bmRead, а для записи используют значение bmReadWrite.

CОВЕТ

Чтобы открыть поток TBlobStream с параметром bmReadWrite используемый набор данных должен быть переведен в режим Edit, Insert или Append.

Затем  создается экземпляр M класса потока TMemoryStream. В этот  момент обычный указатель мыши изменяется на изображение песочных часов, что указывает пользователю на  продолжительность выполняемой операции. Затем  поток  B копируется в поток  M. Функции  PlaySound(), применяемой для воспроизведения звукового  файла, в качестве первого параметра должно  быть  передано имя  файла  или  указатель  на область  памяти. Класс  TBlobStream не предоставляет доступа к данным  потока с помощью указателя, а класс  TMemoryStream обеспечивает такую  возможность с помощью свойства Memory. Воспользовавшись этим,  можно  вызвать функцию  PlaySound() для  воспроизведения данных, указатель  на которые содержится в свойстве M.Memory. После  завершения рабо ты  этой  функции необходимо освободить потоки и восстановить вид  указателя  мыши. Полный код основного модуля данного проекта приведен в листинге 7.4.

Листинг 7.4. Основной модуль проекта Wavez

unit Main; interface uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,

Dialogs, ExtCtrls, DBCtrls, DB, DBTables, StdCtrls, Mask,

Buttons, ComCtrls;

type

TMainForm = class(TForm)

tblSounds: TTable;

dsSounds: TDataSource;

tblSoundsWaveTitle: TStringField;

tblSoundsWave: TBlobField;

edTitle: TDBEdit;

edFileName: TDBEdit;

Label1: TLabel;

Label2: TLabel;

OpenDialog: TOpenDialog;tblSoundsFileName: TStringField; SaveDialog: TSaveDialog; pnlToobar: TPanel;

sbPlay: TSpeedButton; sbAdd: TSpeedButton; sbSave: TSpeedButton; sbExit: TSpeedButton; Bevel1: TBevel;

dbnNavigator: TDBNavigator;

stbStatus: TStatusBar;

procedure sbPlayClick(Sender: TObject);

procedure sbAddClick(Sender: TObject);

procedure sbSaveClick(Sender: TObject);

procedure sbExitClick(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure FormClose(Sender: TObject;

var Action: TCloseAction);

private

procedure OnAppHint(Sender: TObject);

end;

var

MainForm: TMainForm;

implementation

{$R *.DFM}

uses MMSystem;

procedure TMainForm.sbPlayClick(Sender: TObject);

var

B: TBlobStream;

M: TMemoryStream;

begin

// Создать поток blob

B := TBlobStream.Create(tblSoundsWave, bmRead);

Screen.Cursor := crHourGlass;          // песочные часы

try

M := TMemoryStream.Create;            // Создать поток в памяти

try

// Копирование из потока BLOB в поток памяти

M.CopyFrom(B, B.Size);

// Попытка воспроизвести звук. Передача исключения,

// если что-нибудь будет не так, как надо.

Win32Check(PlaySound(M.Memory, 0, SND_SYNC or SND_MEMORY));

finally

M.Free;

end;

finally

Screen.Cursor := crDefault;

B.Free;                               // Освобождение памяти

end;end;

procedure TMainForm.sbAddClick(Sender: TObject);

begin

if OpenDialog.Execute then begin

tblSounds.Append;

tblSounds[‘FileName’] := ExtractFileName(OpenDialog.FileName);

tblSoundsWave.LoadFromFile(OpenDialog.FileName);

edTitle.SetFocus;

end;

end;

procedure TMainForm.sbSaveClick(Sender: TObject);

begin

with SaveDialog do begin

FileName := tblSounds[‘FileName’];

//

Получить имя файла

if Execute then

//

Диалог Execute

tblSoundsWave.SaveToFile(FileName);

//

Сохранить blob в файл

end;

end;

procedure TMainForm.sbExitClick(Sender: TObject);

begin

Close;

end;

procedure TMainForm.FormCreate(Sender: TObject);

begin

Application.OnHint := OnAppHint;

tblSounds.Open;

end;

procedure TMainForm.OnAppHint(Sender: TObject);

begin

stbStatus.SimpleText := Application.Hint;

end;

procedure TMainForm.FormClose(Sender: TObject;

var Action: TCloseAction);

begin tblSounds.Close;

end;

end.

Источник: Тейксейра, Стив, Пачеко, Ксавье.   Borland Delphi 6. Руководство разработчика. : Пер.  с англ. — М. : Издательский дом “Вильямс”, 2002. —  1120 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии