[fpc-devel] TComponent.Name can not be set to ''

Michael Van Canneyt michael at freepascal.org
Wed Jun 20 12:38:38 CEST 2007



On Wed, 20 Jun 2007, Marc Weustink wrote:

> Michael Van Canneyt wrote:
> > 
> > On Wed, 20 Jun 2007, Marc Weustink wrote:
> > 
> > > Michael Van Canneyt wrote:
> > > > On Wed, 20 Jun 2007, Micha Nelissen wrote:
> > > >
> > > > > Michael Van Canneyt wrote:
> > > > > > This is due to a Delphi compatibility fix. Component names must be
> > > > > > valid
> > > > > > identifiers. Logical, since the name must match the field name in
> > > > > > the
> > > > > > form,
> > > > > Why *must* it match a field name in the form ?
> > > > Because the streaming depends on it.
> > > >
> > > > The stream contains the component name. The streaming mechanism creates
> > > > a
> > > > component, sets it's name and then matches this name with the list of
> > > > published fields of TForm, and then fills in the pointer.
> > > And what if a published field isn't found ?
> > 
> > Nothing. Since there is no pointer to fill in, nothing happens.
> > 
> > And this is right, because if you were to create everything run-time, and
> > stream
> > that, there are no pointers to fill in when the stream is being read again.
> 
> :)
> then back to Michas question: why must ?

Because in the form declaration, the fieldname must match the name.

Given

  TMyForm = Class(TForm)
    MyButton : TButton;
  end;

and a form file

Object TmYForm
  Object MyButton : TButton
    Caption = 'Click here'
  end
end
    
The MyButton (=component name) in the form file is used to look up the MyButton 
field in TMyForm. If it doesn't find that, then things in code like

MyButton.Enabled:=False;

Would lead to a nice access violation, if the instance pointer is Nil...

Michael.



More information about the fpc-devel mailing list