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

Marc Weustink marc.weustink at cuperus.nl
Wed Jun 20 13:55:33 CEST 2007


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



More information about the fpc-devel mailing list