Frames有什么特别之处,当你创建它们运行时它会自动分配一个名字?当您在循环中使用它们时会出现问题,即:
for i := 0 to 3 do
TMyFrame.Create(self); //Error on 2nd pass
第一次传递时,框架是explicityl,名为'MyFrame'。 在第二次传递时,它会尝试再次命名为“MyFrame” 因为已经存在异常,所以会引起异常 具有此名称的组件。
其他组件或表单很乐意在没有的情况下创建 我为他们分配了一个名字。是什么给了什么?
这是Delphi 2006 btw。
干杯
答案 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等,它已经是注册类。