Michael Van Canneyt wrote:
On Wed, 14 Jan 2009, Martin Friebe wrote:
Hi,

If a component is loaded from a stream, then csLoading is set in
ComponentState (or so I thought I understood the concept)
So in my component i do  "if not(csLoading in componentState)" ...

However I found this does not work in the constructor Create. csLoading  is
only set *after* the Constructor has been called.
(This is unless it is an inline component?).
- TReader does create the object with class.NewInstance (so create is not yet
called)
- the for inlined components it does set csInline, scLoading => for others it
does not set anything
- then the constructor create is called (but csLoading is not set)
- only then does csLoading get set

Is this supposed to be like this? How else can I inside Create check if the
component is loaded from a stream?

It is supposed to be like this. You cannot check this, and you shoud not.
A component should always behave the same, no matter whether it is being
streamed or not: You cannot a priori know whether a component of a certain
class will be streamed or not.
So here is my problem.

I have a component, that may or may not have children. If it has children they are correctly streamed, and read back too.

Historically it did not have children (or more accurate, it did, but they did not get streamed, they where constant)

Now I want to make sure that:
- a newly created (not loaded) component behaves as before. It creates it's default children. - a loaded component however can not do with this default created children => because they would be duplicates.

Simply replacing isn't going to work, since their amount can vary. (0, 1 or more). In fact in Lazarus I probably going to check the LCLVersion property of the form (or something like that). => This is for loaded components => new componets always will have the default.

In any way, currently this default children are created in the constructor, so it would have been nice to know if it was loaded or not.

Question:
- Is there a better place to create those defaults? One where I can access the necessary information? - Alternative "ReadState" comes to mind. I can intercept it, and clear out the defaults, since loading is about to happen. (then call inherited)

Any better Idea?

Another question:
The component described are Subcomponents, and they are not visible. I will probably have them parented and owned by the same visible control. ( The only reason to stream them as component is because they vary in number and can be of different classes. I can not do that through a property, nor through a collection:
  Property is fixed in number and class
  Collection(Item) is fixed in class, only variable in number
)

It seems to work with the default setting.
But I was wondering if in such a scenario I should have to thing about csInline, csAncestor or csInherited....? Probably not?

Thanks and Best Regards
Martin

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

Reply via email to