我需要在设计时获取表单上的所有组件的列表(不是控件,只是组件)。
组件在设计时也必须在表格上显示为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吗?
答案 0 :(得分:5)
作为其他组件的一部分创建的非可视组件(例如 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
即使非可视组件之间没有可视的父/子关系,非可视组件也不会知道他们是否有父母。
可以通过 TComponent 的 HasParent 属性访问。
但至关重要的是,表单 不被视为直接放置的非可视组件的父级。
因此,如果 HasParent 对于表单上的非可视组件( Form.Components ) FALSE ,那么它是直接放置的组件,而不是其他组件的子组件。
只需修改 if 条件,如下所示:
if (NOT (Components[i] is TControl)) and (NOT Components[i].HasParent) then
Memo1.Lines.Add(Components[i].Name);
请注意,我已删除是TComponent 的测试,因为对于中的项目,始终将 TRUE 表单的组件属性。