帧名称自动分配

时间:2010-11-29 12:30:31

标签: delphi

Frames有什么特别之处,当你创建它们运行时它会自动分配一个名字?当您在循环中使用它们时会出现问题,即:

for i := 0 to 3 do
  TMyFrame.Create(self); //Error on 2nd pass

第一次传递时,框架是explicityl,名为'MyFrame'。 在第二次传递时,它会尝试再次命名为“MyFrame” 因为已经存在异常,所以会引起异常 具有此名称的组件。

其他组件或表单很乐意在没有的情况下创建 我为他们分配了一个名字。是什么给了什么?

这是Delphi 2006 btw。

干杯

3 个答案:

答案 0 :(得分:3)

如果您使用TFrame创建框架,那么它不会引发该错误。

即,如果你的代码看起来像这样,你就不会有任何问题

for i := 0 to 3 do 
  Frame1 := TFrame.Create(self);

因为此处未分配Name属性。如果您愿意,可以使用语句ShowMessage(Frame1.Name);

进行检查

但是如果你使用TMyFrame,即你从TFrame派生的帧,那么它就会产生问题。

我认为原因是,每次创建TMyName时,Delphi都明确指定了相同的名称。

答案 1 :(得分:1)

你试图创建相同的框架4次,每次创建框架它都会有相同的名称,一种方法可以避免

...
var
  i: Integer;
  lFrame: TFrame;
begin
  for i := 0 to 3 do begin
    lFrame := TFrame.Create(Self);
    // assign a unique name to the frame
    lFrame.Name := Format('MyFrame%d', [i]);
    // set the parent, align, etc...
  end;
end;

答案 2 :(得分:0)

顺便说一句,我自己(再次)碰到了这个。

如果从框架组件中取出名称,那么Delphi就会说“根组件必须有一个名称” - 我想这是因为某个地方Delphi正在调用RegisterClass(RootComponentName)然后创建它(或后代)它是致电Findclass(RootComponentName)或类似的人。你自己可以自己创建那些你实际上并不知道设计时间的类名的组件,为什么Delphi不这样做呢?

对于TButton等,它已经是注册类。