[Lazarus] pascal component stream

Mattias Gaertner nc-gaertnma at netcologne.de
Mon Jan 17 11:38:34 CET 2011


On Mon, 17 Jan 2011 13:18:06 +0300
Max Vlasov <max.vlasov at gmail.com> wrote:

> On Mon, Jan 17, 2011 at 1:45 AM, Mattias Gaertner <nc-gaertnma at netcologne.de
> > wrote:
> 
> > Hi,
> >
> > Point 4 is the real problem. How to store TStrings.Data or TBitmap.Data?
> >
> >
> When the topic appears some time ago, I experimented creating procedure
> converting dfm text form into delphi code. Point 4 was a real challenge.
> 
> For TStrings it was just assuming if token is '(' then it's TStrings
> (possible not always true, but there are so many TStrings inside *CL and
> user's codebase this is almost safe to assume)

Ok. The pascal streamer is a driver level, so it knows the type and does
not need to guess here.

 
> For binary data (token '{') was a more complex thing.
> As a self-explaining example, the following code from TImage dfm. I made it
> in Delphi, but surprisingly (or not depending on the person) Lazarus
> accepted the converted approach without any problem :) As long as I
> remember, in Delphi data from TTreeview was always successfully converted.
> 
> ****************** begin of fragment *************************
> 
> object Image1: TImage
>   Left = 184
>   Top = 16
>   Width = 49
>   Height = 33
>   Picture.Data = {
>     07544269746D617076010000424D760100000000000036000000280000000A00
>     .....}
> end
> 
> was converted to
> 
> ...
>   TReaderHack = class(TReader);
> ....
> 
>   Image1.Left := 184;
>   Image1.Top := 16;
>   Image1.Width := 49;
>   Image1.Height := 33;
>   DataString:=
> 
> #7'TBitm'+'apv'#1#0#0'BM'+'v'#1#0#0#0#0#0#0'6'#0#0#0'('#0#0#0+#10#0+#0#0+...;
>   Insert(#4'Data'+Chr(Ord(vaBinary)) + #130#1#0#0, DataString, 1);
>   Stream:=TStringStream.Create(DataString);
>   try
>     Reader:=TReaderHack.Create(Stream, 1024);
>     try
>       Reader.ReadProperty(Image1.Picture);
>     finally
>     Reader.Free;
>     end;
>   finally
>     Stream.Free;
>   end;
> 
> 
> ****************** end of fragment *************************
> 
> btw, since Lazarus is oss, the hack for TReader here that is needed only to
> call protected method, can be solved other way.

Sounds good.

How did you solve TOpenDialog.Left/Top?


Mattias




More information about the Lazarus mailing list