Как вызвать редактор свойств компонента во время разработки
Я создал компонент, полученный из 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 ответа
Вы не используете правильный редактор, насколько я могу судить. TDefaultEditor
описывается так:
Редактор, обеспечивающий поведение по умолчанию для двойного щелчка, который будет перебирать свойства, выбирая наиболее подходящее свойство метода для редактирования
Это редактор, который реагирует на двойной щелчок по форме, помещая вас в редактор кода с помощью только что созданного обработчика событий. Подумайте о том, что происходит, когда вы дважды щелкните TButton
и вы зашли в OnClick
обработчик.
Прошло много времени с тех пор, как я написал редактор времени разработки (я надеюсь, что моя память работает сегодня), но я считаю, что ваш редактор должен быть получен из TComponentEditor
, Чтобы показать редактор коллекции, звоните ShowCollectionEditor
от ColnEdit
Блок.
Вы можете переопределить Edit
метод TComponentEditor
и позвонить ShowCollectionEditor
оттуда. Если вы хотите быть более продвинутым, в качестве альтернативы вы можете объявить некоторые глаголы с GetVerbCount
, GetVerb
а также ExecuteVerb
, Если вы делаете это таким образом, то вы расширяете контекстное меню и по умолчанию Edit
реализация выполнит глагол 0.
После правильного ответа Дэвида я хотел бы предоставить законченный код, который показывает 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;