Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.27;
Скачать: CL | DM;

Вниз

TFieldDataLink   Найти похожие ветки 

 
Антон   (2005-04-02 23:32) [0]

Разрабатываю компонент, который читает изображения из BLOB поля. При этом его возможности не ограничеваються "пониманием" только формата Bitmap (как DBImage). Соответсвенно компонент должен использовать минимум два поля: первое - непосредственно хранящее изображение, фторое - информацию о формате (bmp,jpg,png,psd). Вопрос-то вот в чем - как организвать хранение свойств, содержащих информацию о полях. Посмотрел как сделали это Борланоиды в DBEdit - использовали TFieldDataLink. Но у меня два подобных свойства, а заводить две переменных типа TDataField, я не хочу. Может кто знает способ по лучьше?


 
Юрий Зотов ©   (2005-04-03 00:26) [1]

Можно обойтись одним полем и писать информацию о формате картинки в первый байт TBlobStream. Соответственно и читать.


 
Набережных С. ©   (2005-04-03 07:05) [2]

Делал я такого зверушку на заре освоения дельфи:) Сохранял-показывал любого формата изображение при наличии соответствующего TGraphic, без использования дополнительных полей. Сам компонент не особенно интересен - копи-пасте кода TDBImage с некоторыми изменениями, но опирался он на такой вот модуль:
unit MultiFmtPicture;

interface

uses
 SysUtils, Classes, Graphics;

type
 TMultiFmtPicture = class(TPicture)
 public
   { Public declarations }
   procedure LoadFromStream(Stream: TStream);
   procedure SaveToStream(Stream: TStream);
 end;

implementation

type
 TMReader = class(TReader)
 private
   FStream: TStream;
 public
   constructor Create(Stream: TStream; BufSize: Integer);
   procedure DefineBinaryProperty(const Name: string;
                   ReadData, WriteData: TStreamProc;
                   HasData: Boolean); override;
 end;

 TMWriter = class(TWriter)
 private
   FStream: TStream;
 public
   constructor Create(Stream: TStream; BufSize: Integer);
   procedure DefineBinaryProperty(const Name: string;
                   ReadData, WriteData: TStreamProc;
                   HasData: Boolean); override;
 end;

const
 SErrorParam = "Invalid Stream parameter!";

{ TMultiFmtPicture }

procedure TMultiFmtPicture.LoadFromStream(Stream: TStream);
var
 Rd:TMReader;
begin
 if not Assigned(Stream) then
   raise Exception.Create(SErrorParam);
 Rd:=TMReader.Create(Stream , 0);
 try
   DefineProperties(Rd);
   Changed(Self);
 finally
   Rd.Free;
 end;
end;

procedure TMultiFmtPicture.SaveToStream(Stream: TStream);
var
 Wr:TMWriter;
begin
 if not Assigned(Stream) then
   raise Exception.Create(SErrorParam);
 Wr:=TMWriter.Create(Stream , 0);
 try
   DefineProperties(Wr);
 finally
   Wr.Free;
 end;
end;

{ TMWriter }

constructor TMWriter.Create(Stream: TStream; BufSize: Integer);
begin
 inherited;
 FStream:=Stream;
end;

procedure TMWriter.DefineBinaryProperty(const Name: string; ReadData,
 WriteData: TStreamProc; HasData: Boolean);
begin
 WriteData(FStream);
end;

{ TMReader }

constructor TMReader.Create(Stream: TStream; BufSize: Integer);
begin
 inherited;
 FStream:=Stream;
end;

procedure TMReader.DefineBinaryProperty(const Name: string; ReadData,
 WriteData: TStreamProc; HasData: Boolean);
begin
 ReadData(FStream);
end;

end.


 
Антон   (2005-04-03 15:08) [3]

На счет первого байта мне нравиться идея, но тогда процесс чтения/записи придеться писать ручками (BlockRead/BlockWrite). Хмм... Опять-же быстродейтсвие снизиться, а ведь компонент задумываеться для просмотра больших изображений (страницы книг, осканированные страницы комиксов и т.п.) с возможностью прокрутки и т.п. Короче - подумаю я. В любом случае спасибо, но может еще предложения будут?


 
Юрий Зотов ©   (2005-04-03 17:15) [4]

> Антон   (03.04.05 15:08) [3]

> процесс чтения/записи придеться писать ручками
> (BlockRead/BlockWrite).

Насколько я понимаю, непосредственно с полем Вы все равно будете работать через TBlobStream. А у него есть уже готовые методы Read и Write.

> Опять-же быстродейтсвие снизиться, а ведь компонент
> задумываеться для просмотра больших изображений

От записи в поток всего одного дополнительного байта? На фоне десятков или сотен килобайт, которые туда все равно придется записывать?



Страницы: 1 вся ветка

Текущий архив: 2005.11.27;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.027 c
14-1130934487
Del_programmer
2005-11-02 15:28
2005.11.27
МОБИЛЫ


14-1130927187
Бугимэн
2005-11-02 13:26
2005.11.27
MS Office Outlook + NNTP


2-1130952630
12next
2005-11-02 20:30
2005.11.27
добвить свою процедуру, в событие..


14-1130921576
TUser
2005-11-02 11:52
2005.11.27
Освобождение ресурсов при завершении процесса


8-1120430070
Fantasy
2005-07-04 02:34
2005.11.27
помогите DSPack