[fpc-devel] Reading empty collection from stream
Marc Weustink
marc.weustink at cuperus.nl
Mon Sep 11 14:34:23 CEST 2006
Michael Van Canneyt wrote:
>
>
> 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,
I always can propose ;-)
> because then inherited form streaming will be broken: a
> collection of "<>" means: don't touch, keep the collection of
> the parent form.
There you have a point. Didn't think of that.
And indeed, a collection itself doesn't know if it is default or not.
The owning class usually knows this.
To solve this problem, I think the owning class needs to know when it is
loading or not, so that it can add the defaults when it is not loaded,
but created.
I think the cleanest way is to introduce a Loading virtual method as
counterpart of the Loaded method. This way the owning class can decide
that when loading, the collection should be cleared.
AFAIK, there is no other way a component knows on creation if it gets
loaded in the future or not.
Marc
More information about the fpc-devel
mailing list