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

时间:2015-03-12 12:40:58

标签: delphi ide components design-time

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

组件在设计时也必须在表格上显示为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吗?

1 个答案:

答案 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 表单的组件属性。