如何在设计时编写仅在运行时创建的组件
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;
我最近询问了如何创建每次都具有不同名称的动态组件,我得到了非常有用的答案并且我的程序一直运行完美无瑕
这是代码的基本思路
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;