Michael Van Canneyt wrote 45 lines
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