其实我的回答
如果您使用命名约定来命名您的组件,例如
"Mycomponent" + inttostr(global_int)
你可以用它很容易地找到它:
function getMyComponent(id:integer) : TComponent;
begin
result := {Owner.}FindConponent('MyComponent'+inttostr(id));
end;
(sender as TComponent).name
您还可以通过使用知道哪些其他组件与他相关来使您生成的组件相互交互。
示例
以下是您可以使用它执行的操作的示例:
想象一个页面控件,其中选项卡是您想要多次使用的界面(例如,用 1 tab = 1 col 描述文件中的列,并且您想要动态添加选项卡)。
对于我们的示例,我们正在命名按钮并以这种方式编辑:
Button : "C_(column_number)_btn"
Edit : "C_(column_number)_edi"
实际上,您可以使用 buttonclick 直接引用编辑,在运行时通过调用 findcomponent 链接:
procedure TForm1.ColBtnClick(Sender:TObject);
var nr : string; Edit : TEdit;
begin
// Name of the TButton. C(col)_btn
nr := (Sender as TButton).Name;
// Name of the TEdit C_(column)_edi
nr := copy(nr,1,length(nr)-3)+'edi';
// Get the edit component.
edit := (Form1.Findcomponent(nr) as TEdit);
//play with it
Edit.Enabled := Not Edit.Enabled ;
showmessage(Edit.Text);
Edit.hint := 'this hint have been set by clicking on the button';
//...
end;
当然,您将此过程链接到每个生成的按钮。
如果有人想练习它,您可能想知道如何生成选项卡和组件,在这里:
procedure Form1.addCol(idcol:integer, owner : TComponent); // Form1 is a great owner imo
var
pan : TPanel; // Will be align client with the new tabsheet
c: TComponent; //used to create components on the pannel
tab : TTabSheet;
begin
try
pan := TPanel.create(owner);
pan.name := format('Panel_%d',[idcol]);
pan.caption := '';
// dynamically create that button
c := TButton.create(Owner);
with c as TButton do
begin
Name := format('C%d_btn',[idcol]);
Parent := pan;
//Top := foo;
//Left := bar;
caption := 'press me';
OnClick := Form1.ColBtnClick; // <<<<<<< link procedure to event
end;
//create a Tedit the same way
c := TEdit.create(Owner);
with c as TEdit do
Name := format('C%d_edi',[idcol]);
Parent := pan;
// other properties
// create the tabsheet and put the panel in
finally
tab := TTabSheet.Create(Parent);
tab.caption := 'Column %d';
tab.PageControl := Pagecontrol1;
pan.Parent := tab;
pan.Align := alClient;
end;
end;
生成名称来获取组件实际上是拥有干净代码的一种非常好的方法。
滚动父子组件以找到您想要的组件实际上效率低下,并且如果有很多组件(在我的示例中,如果有 3、10 或未知数量的 TEdit 循环子(兄弟)组件将很难看) .
也许这个例子是无用的,但它可能会帮助某人,总有一天。