gpt4 book ai didi

delphi - 为什么 TCategoryPanel.controls[i].className 总是“TCategoryPanelSurface?

转载 作者:行者123 更新时间:2023-12-03 15:29:51 25 4
gpt4 key购买 nike

在表单上,​​我放置了 1 个 TCategoryPanelGroup 对象,并向其中添加了 3 个 TCategoryPanel。在例程中,我需要遍历每个 TCategoryPanel 并遍历这些面板上的每个对象以生成输出。

所以,这是代码......为什么进入第二个FOR而不是给我每个组件的类名(即TButtonTLabel等)它给出TCategoryPanelSurface?

简短的问题:如何从每个 TCategoryPanel 访问每个控件?

<小时/>
procedure TForm1.Button2Click(Sender: TObject);
var i,i2 : integer;

begin
for i := 0 to CategoryPanelGroup1.ControlCount-1 do
begin
showMessage((CategoryPanelGroup1.Controls[i] as TCategoryPanel).caption ) ;

for i2 := 0 to (CategoryPanelGroup1.Controls[i] as TCategoryPanel).ControlCount-1 do
begin

showMessage((CategoryPanelGroup1.Controls[i] as TCategoryPanel).Controls[i2].ClassName);
end;
end;
end;

最佳答案

当您应该循环遍历其 TCategoryPanelGroup.Panels 列表时,您正在循环遍历 Group 的底层 TWinControl.Controls[] 列表。

至于为什么您会看到 TCategoryPanelSurface 出现,TCategoryPanel 在其构造函数中将该对象创建为其自身的直接子对象。之后放入面板中的任何控件实际上都是该 TCategoryPanelSurface 对象的子级,而不是 TCategoryPanel 本身的子级。这就是为什么你的循环永远不会看到这些控件。

不幸的是,TCategoryPanel 不公开对其 TCategoryPanelSurface 对象的直接访问。因此,为了循环访问它的子级,您必须首先能够访问它。有两种可能的方法可以做到这一点:

1)

procedure TForm1.Button2Click(Sender: TObject);
var
i, j: integer;
panel: TCategoryPanel;
surface: TCategoryPanelSurface;
begin
for i := 0 to CategoryPanelGroup1.Panels.Count-1 do
begin
panel := TCategoryPanel(CategoryPanelGroup1.Panels[i]);
ShowMessage(panel.Caption);
surface := panel.Controls[0] as TCategoryPanelSurface;
for j := 0 to surface.ControlCount-1 do
begin
ShowMessage(surface.Controls[j].ClassName);
end;
end;
end;

2)

type
TCategoryPanelAccess = class(TCategoryPanelAccess)
end;

procedure TForm1.Button2Click(Sender: TObject);
var
i, j: integer;
panel: TCategoryPanel;
surface: TCategoryPanelSurface;
begin
for i := 0 to CategoryPanelGroup1.Panels.Count-1 do
begin
panel := TCategoryPanel(CategoryPanelGroup1.Panels[i]);
ShowMessage(panel.Caption);
surface := TCategoryPanelAccess(panel).FPanelSurface;
for j := 0 to surface.ControlCount-1 do
begin
ShowMessage(surface.Controls[j].ClassName);
end;
end;
end;

关于delphi - 为什么 TCategoryPanel.controls[i].className 总是“TCategoryPanelSurface?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3105271/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com