delphi - 在运行时创建组件 - Delphi

标签 delphi runtime components

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

最佳答案

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

对于非可视组件

var
  C: TMyComponent;
begin
  C := TMyComponent.Create(nil);
  try
    C.MyProperty := MyValue;
    //...
  finally
    C.Free;
  end;
end;

对于视觉组件:

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

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;

对上面代码的一些解释:

  • 通过设置组件的所有者(构造函数的参数),当拥有的表单被销毁时,组件也会被销毁。
  • 设置 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;

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

如何分配事件处理程序:

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

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

B := TButton.Create;
//...
B.OnClick := MyButtonClick;

关于delphi - 在运行时创建组件 - Delphi,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1005373/

相关文章:

forms - Delphi:显示和填写法律表格或报告

javascript - ReactJS中组件的返回值prop

c# - .Net Powerpoint 组件

performance - Delphi:在表单中隐藏/显示 TWinControl 对象非常慢。怎样才能更快得到呢?

delphi - 用于检查 Delphi 项目中循环依赖的任何工具

multithreading - 如何以线程安全的方式停止正在运行的任务?

go - 如何获取有关 Go 中最后调用的函数的信息?

ios - 如何将数组元素分配给属性?

algorithm - 为什么插入排序的 O(n) nlogn 运行时间是最理想的?

database - 写入 joomla 组件中的多个表?