Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Компоненты";
Текущий архив: 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.47 MB
Время: 0.017 c
14-1130915005
Saruwatari
2005-11-02 10:03
2005.11.27
Кто что знает об ипотеке поделитесь мыслями...


14-1131433411
Slider007
2005-11-08 10:03
2005.11.27
Update2 на Delphi2005


14-1130913575
КаПиБаРа
2005-11-02 09:39
2005.11.27
Как научиться


6-1123567115
Shopot
2005-08-09 09:58
2005.11.27
Как передавать данные удаленному компу.


14-1130915105
boalse
2005-11-02 10:05
2005.11.27
Компьютерный ажиотаж.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский