dynamic - 如何在设计时编写仅在运行时创建的组件
问题描述
我最近问如何创建每次都具有不同名称的动态组件,我得到了非常有用的答案,我的程序一直在完美运行
这是代码的基本思想
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;
推荐阅读
- python - Pandas read_csv - 如何处理双引号内的逗号,这些逗号本身就在双引号内
- javascript - 可反应加载的多个资源加载不起作用
- node.js - 谷歌应用引擎上的node.js:运行的版本与package.json中指定的不同
- clickhouse - 结转四舍五入
- intel - DE10-Nano usb-blaster 驱动
- spring - 从 org.springframework 导入 amqp 得到错误
- docker - 从 Docker 容器中的 localhost Consumer 连接到 localhost Kafka 代理时出现端口绑定错误
- python - 图字典
- jaeger - 将 Jaeger 代理连接到在 Openshift 中运行的收集器
- python - 在 tkinter 应用程序中创建和分配多个变量