[lazarus] Order of destruction in TCustomListBox

Michael Van Canneyt michael.vancanneyt at wisa.be
Mon Dec 15 07:30:49 EST 2003




On Mon, 15 Dec 2003, Micha Nelissen wrote:

> Michael Van Canneyt wrote:
> >
> > On Mon, 15 Dec 2003, Micha Nelissen wrote:
> >
> >
> >>Mattias Gaertner wrote:
> >>
> >>
> >>>On Sun, 14 Dec 2003 15:09:48 +0100  Micha Nelissen <micha at neli.hopto.org>
> >>>wrote:
> >>>
> >>>><output>
> >>>>CB.SomeFunc call
> >>>>Constructor
> >>>></output>
> >>>>
> >>>>Which is not logical, IMHO.
> >>>
> >>>
> >>>It is just a matter of definition. Although it would be interesting how you
> >>>imagine a more logical alternative.
> >>
> >>The definition is: the object is only 'defined', if it's constructor has
> >>run completely. Something along those lines is used by C++. After each
> >>constructor run, and only then, are the overriden function pointers
> >>written to the VMT. Personally, I think this is more logical, although
> >>maybe it's a matter of personal taste.
> >
> >
> > I can show you code where in the constructor a virtual method is called
>
> Yes, show me the code :-).

Basically, it says the following:

Constructor TAppClientDataset.Create(AOwner : TComponent)

begin
  Inherited;
  // ... Various statements
  InitDataEvents;
end;

The data events that must be initialized depend on the descendent.

Now, we could put this call in 'Loaded', but then they are not initialized
when we do for instance:

With TMySomeClientDataset.Create(Self) do
  Try
    // Do stuff.
  Finally
    Free;
  end;

This kind of code is quite common.

Alternatively, we could put the code from InitDataEvents in the
constructor, and add additional initialization in the descendent
constructors. But sometimes, the events must be re-initialized:
That would mean duplicating the code from the constructor to
a separate call.

For these reasons, the 'InitDataEvents' is called in the
constructor and is virtual.

>
> > which does some additional initialization. The method needs to be
>
> What kind of initialization should I be thinking about?

Anything. Data events, extra variables.

>
> > virtual since the initialization is different depending on the
> > descendent. That would not work in your scheme as it would be invalid
> > code...
>
> That's the only way?

It's never the _only_ way, but definitely the most convenient in many
cases.

Michael.






More information about the Lazarus mailing list