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

时间:2018-10-13 09:19:01

标签: dynamic delphi-7

我最近问过每次如何创建具有不同名称的动态组件,我得到了非常有用的答案,并且我的程序运行得很好

这是代码的基本思想

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

  iCountPanel := iCountPanel + 1;
end;

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

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

我想知道的是,即使该面板在技术上还不存在,是否也可以为“ pnlDisplay [i]”的click事件编写代码?

1 个答案:

答案 0 :(得分:0)

事件是任何其他属性。可以在运行时分配其处理程序。因此,只需为您创建的每个面板分配一个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;