如何在设计时编写仅在运行时创建的组件

How to code a component in design time that will only be created in runtime

我最近询问了如何创建每次都具有不同名称的动态组件,我得到了非常有用的答案并且我的程序一直运行完美无瑕

这是代码的基本思路

 begin
  pnlTemp := TPanel.Create(Self);
  pnlTemp.Parent := Self;
  pnlTemp.Name := 'pnlDisplay' + IntToStr(iCountPanel);
  etc..

  iCountPanel := iCountPanel + 1;
end;

但是我遇到了一个新问题,我在这个论坛以及许多其他来源上进行了搜索,但是我搜索时只能找到如何创建动态组件(我知道该怎么做)。我的问题如下:

当在 运行 时间内创建面板(如上所示)时,我希望用户能够单击该面板,然后将显示有关该特定面板的信息列表。我不能只为 pnlTemp 编写代码,因为它们将创建许多面板。

我想知道是否有一种方法可以为 "pnlDisplay[i]" 的点击事件编写代码,即使该面板在技术上尚不存在?

事件与其他属性一样。它们的处理程序可以在运行时分配。因此,只需为您创建的每个面板分配一个 OnClick 事件处理程序,并使用事件的 Sender 参数来了解哪个面板被点击。

constructor TMyComponent.Create(AOwner: TComponent);
var
  pnlTemp: TPanel;
  iCountPanel: Integer;
begin
  inherited Create(AOwner);
  iCountPanel := 0;
  ...
  while iCountPanel < ... do
  begin
    pnlTemp := TPanel.Create(Self);
    pnlTemp.Parent := Self;
    pnlTemp.Name := 'pnlDisplay' + IntToStr(iCountPanel);
    pnlTemp.Tag := iCountPanel;
    // other properties as needed...
    pnlTemp.OnClick := PanelClicked; // <-- ADD THIS
    Inc(iCountPanel);
  end;
  ...
end;

procedure TMyComponent.PanelClicked(Sender: TObject);
var
  Panel: TPanel;
begin
  Panel := TPanel(Sender);
  // use Panel as needed...
end;