[fpc-devel] Reading empty collection from stream
Michael Van Canneyt
michael at freepascal.org
Mon Sep 11 13:01:24 CEST 2006
On Thu, 7 Sep 2006, Marc Weustink wrote:
> Vincent Snijders wrote:
>> Hi,
>>
>> I am investigating Lazarus issue 7305. The TSynEdit class has a KeyStrokes
>> property of the type TSynEditKeyStrokes, which is a TCollection descendant.
>> The TSynEdit constructor fills the collection with some default items. If I
>> remove the items and stream the TSynEdit, the following line is shown in
>> the lfm:
>> Keystrokes = <>
>>
>> If I read this lfm, I don't get a empty KeyStrokes collection, but one
>> filled with the default value.
>>
>> I suspect the following lines in TReader.ReadCollection cause this
>> behaviour:
>> if not EndOfList then
>> Collection.Clear;
>>
>> Is this a bug or by design? How do I load an empty collection from a
>> stream, if the collection has a default value?
You can't.
> Delphi has the same construction, which is IMO a design flaw.
> IMO when a collection is "default" is shouldn't be streamed, so there would
> be nothing written.
There is no way to know whether the collection is default or not,
since that would imply keeping a copy of the collection as it was
just after creation.
> I don't know why it is there, since when a "default" collection is written,
> all elements are written. So it never will be <>.
>
>> Note, if I remove the 'Keystrokes = <>' line from the lfm, I will get the
>> default collection too, so I wonder why there are two ways to get the
>> default collection.
>
> I propose to remove the "if not EndOfList then Collection.Clear;" line.
You may not, because then inherited form streaming will be broken:
a collection of "<>" means: don't touch, keep the collection of
the parent form.
Michael.
More information about the fpc-devel
mailing list