Форум: "Компоненты";
Текущий архив: 2005.11.27;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.012 c