Delphi - заполнить раскрывающийся список редактора свойств списком?
Я разрабатываю компонент. Этот компонент имеет свойство 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 ответ
Ваш DataSource
а также DataField
свойства находятся в отдельных классах, поэтому вам придется написать и зарегистрировать пользовательский редактор свойств для DataField
свойство связать их вместе. Вы можете использовать стандарт Delphi TDataFieldProperty
класс в качестве основы для вашего редактора. TDataFieldProperty
обычно ищет DataSource: TDataSource
свойство (имя настраивается) в том же классе, что и DataField
свойство объявлено в, но вы можете настроить его, чтобы получить TDataSource
объект из вашего основного компонента вместо.
Создайте пакет времени разработки, который requires
IDE designide
а также dcldb
пакеты и пакет времени выполнения вашего компонента. Реализуйте класс, производный от 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
назначен на ваш компонент.