Thierry Coq wrote: > 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 > Thanks, I think I found a better way.
The outer container has no nested components of it's own. It seems I can hook into (override) TComponent.WriteState which is calling WriteComponentData (properties, then Children). Since no children are there, I can make my own calls to WriteComponent from there, supplying all the components, of all the helper objects. On Read, I can Hook into ReadState. I can let the reader add them normally, and sort them out/once they have been read by the reader. The remaining question is: Does that look like something that will stay compatible with future code? The generated LFM file definitely looks like any LFM file (it has a component, with properties first then other nested Components) Thanks Martin > 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 > _______________________________________________ Lazarus mailing list [email protected] http://www.lazarus.freepascal.org/mailman/listinfo/lazarus
