Marc Weustink wrote:
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.

Just thought of another option:

in the owning class, in defineProperties, define a property 'CollectionIsEmpty' and write it only when the collection is empty. THen wen read from stream, clear the collection.

Marc

_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel

Reply via email to