我最近问过每次如何创建具有不同名称的动态组件,我得到了非常有用的答案,并且我的程序运行得很好
这是代码的基本思想
begin
pnlTemp := TPanel.Create(Self);
pnlTemp.Parent := Self;
pnlTemp.Name := 'pnlDisplay' + IntToStr(iCountPanel);
etc..
iCountPanel := iCountPanel + 1;
end;
但是,我遇到了一个新问题,我在这个论坛上以及许多其他资源中进行了搜索,但是当我搜索时只能找到如何创建动态组件(我知道该怎么做)。我的问题如下:
在运行时创建面板(如上所示)时,我希望用户能够单击该面板,然后将显示有关该特定面板的信息列表。我不能只为pnlTemp编写代码,因为它们将创建许多面板。
我想知道的是,即使该面板在技术上还不存在,是否也可以为“ pnlDisplay [i]”的click事件编写代码?
答案 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;