[Lazarus] Saving user created component structure to LFM file
Thierry Coq
tcoq at free.fr
Mon Jan 12 09:34:13 CET 2009
Dear Martin,
In Delphi, I frequently used the mecanism you described, but I had to
use the root "WriteComponentRes" procedure, not the WriteComponent one,
which is only available for subcomponents.
I did not use TCollection, which is capable of writing components (too
complex for my usage). What I did do, was create container classes with
TComponent as Parent. By default, TComponent stores all children. The
root component must also give a name to each component, or the storage
will not work.
The end result is the capability to store a hierarchy of objects in a
consistent manner.
You should look for WriteComponentResFile in classes.inc and see how
this work, with a few tries.
Hope this helps,
Thierry
Martin Friebe wrote:
> Hi, I have a problem saving a certain component struicture to an LFM
> (lazarus) file and read it back.
>
> since a good amount of code is in FPC, I am not sure which list to go to?
>
> There is classes/writer.inc with has TBinaryObjectWriter. This is where
> things go first.
> Then, later this gets translated into text. This translation seems to be
> stricter in terms of what can be nested.
>
>
> Anyway the problem is, that if I want to save a component (that can be
> of different class/classes) then I can use WriteComponent. But only if I
> am in a Component that is itself written with WriteComponent.
>
> In the final LFM it seems a Component can only be nested in an other
> component. It does not seem to be possible to put it in:
> - Not in a subcomponent (because a subcomponent does not write it's
> class, but just the properties that are visible for the class given by
> the property
> property Foo: TPanel read .. write ...
> writes
> Foo.Name = 'abc'
> Foo.Top = 1
> ...
> - Not in a TCollection, or at least I havent managed. Also again a
> TCollection is restricted to one classs for all Items
> - Not Using DefineProperties
> All propwerties with define property are of the kind
> Name = Value
> I can add a list, but even inside the list I can not write a component
>
>
> What I want to archive is theFollowing. I have
>
> TMainComponent = class (foo)
> property Options : TPersitentBar read x write x;
> end
>
> If It has to be it can be a TComponent, with SubComponent in
> TComponentStyle.
> Problem 1) Options is always created in the constructor, it can not be
> stored as a nested Component in the LFM. If it was, it would exist twice
> (once created in the constructor, and once loaded from the lfm)
>
> TPersitentBar should have a list of components, variable number, and
> different subclasses (could inherit from TPersistent, only Component if
> it makes it easier)
>
> How can I get this list saved into the lfm? Each item has a diff class,
> and diff properties, so they must saved via WriteComponent. (Which does
> not work for DefineProerties)
>
> And of course a default list of items is created in the constructor, so
> I need to detect if they are loaded, and remove the defaults.
>
> Any Idea?
>
> Example of the final structure (if only it was valid)
>
> object MainComp1 : TMainComponent
> Options.AllowFoo = 1
> Options.AllowABC = 2
> object Options.SubOptionsForCars : TCarOptions
> MAxCar = 4
> end
> object Options.SubOptionsForTrains : TTrainOptions
> MAxTrain = 1
> end
> end
>
>
> Best Regards
> Martin
>
>
>
>
> _______________________________________________
> Lazarus mailing list
> Lazarus at lazarus.freepascal.org
> http://www.lazarus.freepascal.org/mailman/listinfo/lazarus
>
>
>
More information about the Lazarus
mailing list