首页 > 解决方案 > 如何在设计时编写仅在运行时创建的组件

问题描述

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

这是代码的基本思想

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

  iCountPanel := iCountPanel + 1;
end;

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

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

我想知道的是,即使这个面板在技术上还不存在,是否有办法为“pnlDisplay[i]”的点击事件编码?

标签: dynamicdelphi-7

解决方案


事件是和其他任何属性一样的属性。它们的处理程序可以在运行时分配。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;

推荐阅读