在运行时创建组件 - Delphi

Luk*_*oud 20 delphi components runtime

如何在运行时创建组件然后使用它(更改属性等)?

Dan*_*ski 66

这取决于它是视觉还是非视觉组件.原理是相同的,但每种组件都有一些额外的考虑因素.

对于非可视组件

var
  C: TMyComponent;
begin
  C := TMyComponent.Create(nil);
  try
    C.MyProperty := MyValue;
    //...
  finally
    C.Free;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

对于可视组件:

本质上,可视组件的创建方式与非可视组件的创建方式相同.但是您必须设置一些其他属性才能使它们可见.

var
  C: TMyVisualComponent;
begin
  C := TMyVisualComponent.Create(Self);
  C.Left := 100;
  C.Top := 100;
  C.Width := 400;
  C.Height := 300;
  C.Visible := True;
  C.Parent := Self; //Any container: form, panel, ...

  C.MyProperty := MyValue,
  //...
end;
Run Code Online (Sandbox Code Playgroud)

以上代码的一些解释:

  • 通过设置组件的所有者(构造函数的参数),当拥有的表单被销毁时,组件将被销毁.
  • 设置Parent属性使组件可见.如果忘了它,您的组件将不会显示.(很容易错过那个:))

如果你想要很多组件,你可以像上面那样做,但是循环:

var
  B: TButton;
  i: Integer;
begin
  for i := 0 to 9 do
  begin
    B := TButton.Create(Self);
    B.Caption := Format('Button %d', [i]);
    B.Parent := Self;
    B.Height := 23;
    B.Width := 100;
    B.Left := 10;
    B.Top := 10 + i * 25;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

这将在表单的左边框添加10个按钮.如果您想稍后修改按钮,可以将它们存储在列表中.(TComponentList最适合,但也可以看看评论中的建议到这个答案)

如何分配事件处理程序:

您必须创建一个事件处理程序方法并将其分配给event属性.

procedure TForm1.MyButtonClick(Sender: TObject);
var
  Button: TButton;
begin
  Button := Sender as TButton; 
  ShowMessage(Button.Caption + ' clicked');
end;

B := TButton.Create;
//...
B.OnClick := MyButtonClick;
Run Code Online (Sandbox Code Playgroud)

  • 我的意思是,我不知道"它取决于它是视觉还是非视觉组件".它没有.您的两个代码段仅在创建的组件的预期生命周期中有所不同. (2认同)

gab*_*abr 24

要简化运行时组件创建过程,可以使用GExperts.

  1. 直观地创建组件(或更多组件)并设置其属性.
  2. 选择一个或多个组件并执行GExperts,Components to Code.
  3. 将生成的代码粘贴到应用程序中.
  4. 从可视表单设计器中删除组件.

示例(以这种方式生成的TButton创建代码):

var
  btnTest: TButton;

btnTest := TButton.Create(Self);
with btnTest do
begin
  Name := 'btnTest';
  Parent := Self;
  Left := 272;
  Top := 120;
  Width := 161;
  Height := 41;
  Caption := 'Component creation test';
  Default := True;
  ParentFont := False;
  TabOrder := 0;
end;
Run Code Online (Sandbox Code Playgroud)