Delphi - 填充属性编辑器下拉列表?

时间:2017-04-21 14:37:18

标签: delphi properties components cascadingdropdown

我正在开发一个组件。该组件具有TDataSource属性和TSecondaryPathsList属性。 TSecondaryPathsList声明如下:

  TSecondaryPathListItem = Class(TCollectionItem)
    private
      fDataField: string;
      fPathPrefixParameter: String;
      procedure SetDataField(Value: string);
      procedure SetPathPrefixParameter(Value: String);
    published
      property DataField: string read fDataField write SetDataField;
      property PathPrefixParameter: String read fPathPrefixParameter write SetPathPrefixParameter;
  End;

  TSecondaryPathsList = class(TOwnedCollection)
  private
    function GetItem(Index: Integer): TSecondaryPathListItem;
    procedure SetItem(Index: Integer; Value: TSecondaryPathListItem);
  public
    function Add: TSecondaryPathListItem;
    property Items[Index: Integer]: TSecondaryPathListItem read GetItem write SetItem; default;
  end;

我不希望它拥有DataSource属性。 如何实现TSecondaryPathListItem.DataField属性,使其成为dropDown列表(在属性编辑器中),显示Component的DataSource.DataSet字段?

1 个答案:

答案 0 :(得分:1)

您的DataSourceDataField属性位于不同的类中,因此您必须为DataField属性编写并注册自定义属性编辑器,以将它们链接在一起。您可以使用Delphi的标准TDataFieldProperty类作为编辑器的基础。 TDataFieldProperty通常在声明DataSource: TDataSource属性的同一个类中查找DataField属性(名称可自定义),但您可以调整它以检索TDataSource对象取而代之的是你的主要组件。

创建一个设计时包,requires IDE的designidedcldb包,以及您组件的运行时包。实现一个派生自TDataFieldProperty的类并覆盖其虚拟GetValueList()方法,如下所示:

unit MyDsgnTimeUnit;

interface

uses
  Classes, DesignIntf, DesignEditors, DBReg;

type
  TSecondaryPathListItemDataFieldProperty = class(TDataFieldProperty)
  public
    procedure GetValueList(List: TStrings); override;
  end;

procedure Register;

implementation

uses
  DB, MyComponentUnit;

procedure TSecondaryPathListItemDataFieldProperty.GetValueList(List: TStrings);
var
  Item: TSecondaryPathListItem;
  DataSource: TDataSource; 
begin
  Item := GetComponent(0) as TSecondaryPathListItem;

  DataSource := GetObjectProp(Item.Collection.Owner, GetDataSourcePropName) as TDataSource;
  // alternatively:
  // DataSource := (Item.Collection.Owner as TMyComponent).DataSource;

  if (DataSource <> nil) and (DataSource.DataSet <> nil) then
    DataSource.DataSet.GetFieldNames(List);
end;

procedure Register;
begin
  RegisterPropertyEditor(TypeInfo(string), TSecondaryPathListItem, 'DataField', TSecondaryPathListItemDataFieldProperty);
end;

end.

现在您可以将设计时包安装到IDE中,并且DataField属性应该显示一个下拉列表,其中填充了分配给组件的TDataSource字段名称。