Delphi - 用列表填充 属性 编辑器下拉列表?
Delphi - Populate Property editor dropdown with list?
我正在开发一个组件。该组件有一个 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;
我不希望它有数据源 属性。
我如何实现 TSecondaryPathListItem.DataField 属性,使其成为下拉列表(在 属性 编辑器中),显示组件的 DataSource.DataSet 字段?
您的 DataSource
和 DataField
属性位于不同的 class 中,因此您必须为 DataField
编写并注册自定义 属性 编辑器] 属性 到 link 他们在一起。您可以使用 Delphi 的标准 TDataFieldProperty
class 作为编辑器的基础。 TDataFieldProperty
通常在声明 DataField
属性 的同一个 class 中查找 DataSource: TDataSource
属性(名称可自定义),但是您可以调整它以从您的主要组件中检索 TDataSource
对象。
创建一个设计时包,其中 requires
IDE 的 designide
和 dcldb
包,以及您的组件的运行时包。实现一个派生自 TDataFieldProperty
的 class 并覆盖其虚拟 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
属性 应该会显示一个下拉列表,其中包含来自任何 [=18] 的字段名称=] 已分配给您的组件。
我正在开发一个组件。该组件有一个 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;
我不希望它有数据源 属性。 我如何实现 TSecondaryPathListItem.DataField 属性,使其成为下拉列表(在 属性 编辑器中),显示组件的 DataSource.DataSet 字段?
您的 DataSource
和 DataField
属性位于不同的 class 中,因此您必须为 DataField
编写并注册自定义 属性 编辑器] 属性 到 link 他们在一起。您可以使用 Delphi 的标准 TDataFieldProperty
class 作为编辑器的基础。 TDataFieldProperty
通常在声明 DataField
属性 的同一个 class 中查找 DataSource: TDataSource
属性(名称可自定义),但是您可以调整它以从您的主要组件中检索 TDataSource
对象。
创建一个设计时包,其中 requires
IDE 的 designide
和 dcldb
包,以及您的组件的运行时包。实现一个派生自 TDataFieldProperty
的 class 并覆盖其虚拟 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
属性 应该会显示一个下拉列表,其中包含来自任何 [=18] 的字段名称=] 已分配给您的组件。