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 > [email protected] > http://www.lazarus.freepascal.org/mailman/listinfo/lazarus > > > _______________________________________________ Lazarus mailing list [email protected] http://www.lazarus.freepascal.org/mailman/listinfo/lazarus
