Раздел 2. Использование DBImage для извлечения JPEG — неправильный способ
DBImage — возьми один (The DBImage — возьми один)
Пытаясь сделать что-то новое с помощью Delphi, первое, что я делаю, — это запрашиваю метод у встроенной справки Delphi. Вот что ответит справочная документация: TDBImage (на странице «Элементы управления данными» палитры компонентов) представляет собой графическое изображение поля BLOB в текущей записи базы данных. Используйте TDBImage для представления значений графических полей. TDBImage позволяет формам отображать графические данные из базы данных. TDBImage имеет лишь несколько больше свойств видимости данных, чем компонент TImage. Двумя наиболее важными свойствами являются: DataSource (источник данных) и Field (поле). Свойство DataSource подключает графический компонент к базе данных. В нашей форме есть компонент DataSource с именем DataSource1, который представляет набор данных. Свойство Field указывает поле (в таблице), содержащее изображение.
Все понятно, теперь разместим на форме компонент DBImage и назовем его по умолчанию DBImage1. Чтобы по-настоящему связать DBImage с полем BLOB таблицы, нам нужно всего лишь выполнить следующую настройку (с помощью инспектора объектов):
DBImage1.DataSource = DataSource1
DBImage1.Field = Изображение
Это необходимый трюк для отображения изображения JPEG, существующего в поле «Изображение» таблицы приложений.
Чтобы убедиться, что эта конфигурация работает, единственное, что нам нужно сделать, — это установить для свойства Active компонента ADOTable1 значение True. Мы можем сделать это в Инспекторе объектов во время проектирования. Как только вы это сделаете, появится следующее диалоговое окно:
Что? Почему отображается сообщение «Растровое изображение недопустимо»? У нас есть изображения JPEG вместо изображений BMP. В этом проблема? Давайте вернемся, чтобы помочь.
Через некоторое время нажимая на справку, я пришел к выводу: чтобы получить изображение JPG в базе данных, нам нужно использовать объект TJpegImage. Для отображения изображений нам нужна простая невидимая версия компонента Image. В то же время нам нужно использовать поток для загрузки изображения из BLOB-объекта. Описание справочного документа: Мы должны использовать TADOBlobStream для доступа или изменения значения BLOB или поля memo (примечания) в наборе данных ADO.
Раздел 3. Использование потоков для извлечения JPEG — неправильный метод
Вытаскиваем JPEG — возьми два!
Так как мы ничего не можем сделать с DBImage — удалим его из формы и поместим обычный компонент TImage (Дополнительная страница) с именем ADOImage. К сожалению, компонент «Изображение» не имеет свойств, учитывающих данные, поэтому для отображения изображения из таблицы базы данных, которую оно представляет, требуется отдельная программа. Самый простой способ сделать это — поместить кнопку в форму, поместить весь программный код в событие OnClick и назвать кнопку «btnShowImage».
Чтобы использовать ADOBLOBStream, в справочной документации рекомендуется создать экземпляр TADOBlobStream, используя метод «stream» для чтения графических полей из набора данных, а затем освободить поток BLOB. Где-то посередине нам нужно будет загрузить изображение JPEG из объекта TADOBlobStream с помощью метода LoadFromStream. Свойства Picture и Graphic компонента Image будут использоваться для хранения и отображения изображений.
Полевой объект, что это такое?
На данный момент я предполагаю, что даже небольшого знания полевых объектов вам будет более чем достаточно, чтобы освоить эту главу. При разработке базы данных Delphi одним из основных объектов является объект TField. Компоненты полей — это невизуальные объекты, которые представляют поля набора данных во время выполнения (или разработки). TADOTable (и другие подклассы TDataSet) предоставляют доступ к редактору полей во время разработки. Редактор полей позволяет вам выбирать поля, которые вы хотите включить в набор данных. Что еще более важно, он создает надежный список компонентов полей, используемых в наборе данных приложения. Чтобы вызвать Редактор полей, дважды щелкните компонент TADOTable. По умолчанию список полей пуст. Нажмите кнопку «Добавить», чтобы открыть диалоговое окно со списком полей таблицы «Приложения». По умолчанию выбраны все поля, затем нажмите «ОК».
Delphi присваивает полю имя по умолчанию следующим образом: Имя таблицы (таблицы) + Имя поля (поля). Это означает, что наше поле изображения называется ADOTable1Picture.
Метод Create класса TADOBlobStream создает экземпляр для чтения или записи указанного объекта поля BLOB, в данном случае поля ADOTable1Picture.
Программный код пишем в событии OnClick кнопки btnShowImage. Этот код прочитает изображение из поля «Изображение» выбранной в данный момент строки. Исходный код выглядит следующим образом:
использует JPEG;
...
PROcedure TForm1.btnShowImageClick(Отправитель: TObject);
вар БС: TADOBlobStream;
Изображение: TJpegImage;
начинать
bS := TADOBlobStream.Create
(AdoTable1Picture, bmRead);
пытаться
Рис:=TJpegImage.Create;
пытаться
Pic.LoadFromStream(bS);
ADOImage.Picture.Graphic:=Рис;
окончательно
Рис.Бесплатно;
конец ;
окончательно
bS.Бесплатно
конец ;
конец ;
Хорошо, давайте запустим этот проект. Конечно, установите для свойства ADOTable1.Active значение True. После отображения формы нажмите кнопку, и появится следующий экран:
Э, что происходит? Код на 100% правильный, но почему изображение не отображается? Помните: «Никогда не сдавайтесь, никогда не сдавайтесь»! Давайте перейдем к уровню байтов и посмотрим, что происходит!