Как вызвать редактор свойств компонента во время разработки - PullRequest
7 голосов
/ 16 сентября 2011

Я создал компонент, полученный из TCustomPanel. На этой панели у меня есть опубликованное свойство класса, производного от TOwnedCollection. Все работает хорошо, и щелчок по многоточию в инспекторе объектов для этого свойства открывает редактор коллекции по умолчанию, где я могу управлять TCollectionItems в списке.

  TMyCustomPanel = class(TCustomPanel)
  private
  ...
  published
    property MyOwnedCollection: TMyOwnedCollection read GetMyOwnedCollection write SetMyOwnedCollection;
  end;

Я также хотел бы иметь возможность дважды щелкнуть панель во время разработки и открыть редактор коллекций по умолчанию. Я начал с создания класса, производного от TDefaultEditor, и его регистрации.

  TMyCustomPanelEditor = class(TDefaultEditor)
  protected
    procedure EditProperty(const PropertyEditor: IProperty; var Continue: Boolean); override;
  end;

  RegisterComponentEditor(TMyCustomPanel, TMyCustomPanelEditor);

Кажется, это выполняется в нужное время, но я застрял в том, как запустить редактор свойств для коллекции в то время.

procedure TMyCustomPanelEditor.EditProperty(const PropertyEditor: IProperty; var Continue: Boolean);
begin
  inherited;

  // Comes in here on double-click of the panel
  // How to launch collection editor here for property MyOwnedCollection?

  Continue := false;
end;

Любое решение или другой подход приветствуются.

Ответы [ 2 ]

9 голосов
/ 16 сентября 2011

Насколько я могу судить, вы не используете правильный редактор.TDefaultEditor описывается так:

Редактор, обеспечивающий поведение по умолчанию для двойного щелчка, который будет перебирать свойства, выбирая наиболее подходящее свойство метода для редактирования

Это редактор, который реагирует на двойной щелчок по форме, перетаскивая вас в редактор кода с помощью только что созданного обработчика событий.Подумайте о том, что происходит, когда вы дважды щелкаете мышью по TButton, и вы попадаете в обработчик OnClick.

Прошло много времени с тех пор, как я написал редактор времени разработки (надеюсь, моя память сегодня работает) но я считаю, что ваш редактор должен быть производным от TComponentEditor.Чтобы показать редактор коллекции, вы вызываете ShowCollectionEditor из блока ColnEdit.

Вы можете переопределить метод Edit для TComponentEditor и вызвать ShowCollectionEditor оттуда.Если вы хотите быть более продвинутым, в качестве альтернативы вы можете объявить некоторые глаголы с GetVerbCount, GetVerb и ExecuteVerb.Если вы сделаете это таким образом, вы расширите контекстное меню, и реализация Edit по умолчанию выполнит глагол 0.

5 голосов
/ 18 сентября 2011

Следуя правильному ответу Дэвида, я хотел бы предоставить готовый код, который показывает CollectionEditor для определенного свойства элемента управления пользовательского интерфейса при двойном щелчке во время разработки.

type
  TMyCustomPanel = class(TCustomPanel)
  private
  ...
  published
    property MyOwnedCollection: TMyOwnedCollection read GetMyOwnedCollection write SetMyOwnedCollection;
  end;


  TMyCustomPanelEditor = class(TComponentEditor)
  public
    function GetVerbCount: Integer; override;
    function GetVerb(Index: Integer): string; override;
    procedure ExecuteVerb(Index: Integer); override;
  end;


procedure Register;
begin
  RegisterComponentEditor(TMyCustomPanel, TMyCustomPanelEditor);
end;

function TMyCustomPanelEditor.GetVerbCount: Integer;
begin
  Result := 1;
end;

function TMyCustomPanelEditor.GetVerb(Index: Integer): string;
begin
  Result := '';
  case Index of
    0: Result := 'Edit MyOwnedCollection';
  end;
end;

procedure TMyCustomPanelEditor.ExecuteVerb(Index: Integer);
begin
  inherited;
  case Index of
    0: begin
          // Procedure in the unit ColnEdit.pas
          ShowCollectionEditor(Designer, Component, TMyCustomPanel(Component).MyOwnedCollection, 'MyOwnedCollection');
       end;
  end;
end;
...