gpt4 book ai didi

delphi - 如何在设计时获取表单上所有组件的列表?

转载 作者:行者123 更新时间:2023-12-03 15:49:56 24 4
gpt4 key购买 nike

我需要在设计时获取表单上所有组件的列表(不是控件,只是组件)。

组件还必须在设计时以 24x24 图像的形式在表单上可见。

我可以使用这样的代码

procedure TForm2.GetComponentList(Memo1: TMemo)
var
i: Integer;
begin
for i := 0 to ComponentCount-1 do
if (Components[i] is TComponent) and not (Components[i] is TControl) then
Memo1.Lines.Add(Components[i].Name);
end;

但在这里我会得到不可见的组件,如 TField 等。

我只需要 IDE 在表单上以 24x24 位图形式显示的组件。

我可以使用 Open Tools API 吗?

最佳答案

作为其他组件的一部分创建的非可视组件(例如 TDataSet 中的 TField 等)是包含组件的子组件。这种关系在 DFM 中很明显 - 如果以文本形式查看,您将看到字段组件是相应数据集对象的子级。

直接放置在表单上的非可视组件(例如 TDataset 本身)是表单对象的子对象:

object frmMain: TfrmMain
...
object MyClientDataSet: TClientDataSet
...
object MyClientDataSetID: TIntegerField
FieldName = 'id'
end
object MyClientDataSetTitle: TStringField
FieldName = 'title'
Size = 255
end
end
object MyDataSource: TDataSource
DataSet = MyClientDataSet
Left = 488
Top = 120
end
end

即使非可视组件之间没有视觉父/子关系,非可视组件仍然知道它们是否有父级。

这可以通过TComponentHasParent属性访问。

但至关重要的是,表单被视为直接放置的非可视组件的父级。

因此,如果表单上的非可视组件(Form.Components 中的项目)的 HasParentFALSE,那么它就是直接放置的组件,而不是其他组件的子组件。

只需修改您的 if 条件,如下所示:

if (NOT (Components[i] is TControl)) and (NOT Components[i].HasParent) then
Memo1.Lines.Add(Components[i].Name);

请注意,我已经删除了对 is TComponent 的测试,因为对于 中的项目来说,始终TRUE表单的组件属性。

关于delphi - 如何在设计时获取表单上所有组件的列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29010029/

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