Michael Van Canneyt wrote:

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...

Yes, I do understand this. An ide (or someone doing this manually) should handle this. And for components which are streamed this way its a requirement. However, it is IMO a bit strange that there are limitations on some property, only because some usage indirectly requires a valid identifier. IMO, the creator of this usage is responsible for that, not the component itself.


Marc
_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel

Reply via email to