2017-04-21 69 views
0

我正在开发一个组件。该组件具有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列表(在属性编辑器中),显示组件的DataSource.DataSet字段?

回答

1

您的DataSourceDataField属性位于不同的类中,因此您必须编写并注册您的DataField属性的定制属性编辑器以将它们链接在一起。您可以使用Delphi的标准TDataFieldProperty类作为编辑器的基础。 TDataFieldProperty通常会在声明DataField属性的同一类中查找DataSource: TDataSource属性(名称可定制),但您可以调整它以从主要组件中检索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的字段名称分配给您的组件。