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 назначен на ваш компонент.

Другие вопросы по тегам