Создание и настройка кастомного редактора для компонента в Delphi: пример с TCustomPanel и TOwnedCollection
В процессе разработки приложений на Delphi может возникнуть необходимость создания собственных компонентов, которые обладают уникальными свойствами и редакторами. В данной статье мы рассмотрим, как создать кастомный редактор для компонента, унаследованного от TCustomPanel, который имеет опубликованное свойство класса, унаследованного от TOwnedCollection. Также мы рассмотрим, как настроить систему так, чтобы двойной клик по компоненту в режиме дизайна открывал редактор этого свойства.
Проблема
Разработчик создал компонент TMyCustomPanel, который наследуется от TCustomPanel. В этом компоненте есть опубликованное свойство MyOwnedCollection класса TMyOwnedCollection. Все работает корректно: клик по многоточию в объектном инспекторе для этого свойства открывает стандартный редактор коллекций, где можно управлять элементами TCollectionItems в списке.
Для взаимодействия с компонентом в режиме дизайна был создан класс TMyCustomPanelEditor, наследующийся от TDefaultEditor, и зарегистрирован соответствующий редактор компонентов. Однако, несмотря на это, разработчик столкнулся с проблемой: как запустить редактор свойства коллекции при двойном клике по панели в режиме дизайна?
Решение проблемы
Из описания TDefaultEditor следует, что этот класс предназначен для обработки двойных кликов по форме, которые обычно приводят к созданию новых обработчиков событий. Однако, для нашего случая, необходимо использовать другой класс - TComponentEditor.
В редакторе, наследуемом от TComponentEditor, следует переопределить метод Edit, в котором и будет вызван метод ShowCollectionEditor из модуля ColnEdit. Это позволит показать редактор коллекции для указанного свойства.
Альтернативный подход заключается в объявлении верб (действий), используя методы GetVerbCount, GetVerb и ExecuteVerb. В этом случае можно расширить контекстное меню, и стандартная реализация Edit выполнит действие с индексом 0.
Пример кода
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
ShowCollectionEditor(Designer, Component, TMyCustomPanel(Component).MyOwnedCollection, 'MyOwnedCollection');
end;
end;
end;
Заключение
В данной статье мы рассмотрели, как можно создать кастомный редактор для компонента TCustomPanel с опубликованным свойством TOwnedCollection, чтобы в режиме дизайна при двойном клике по компоненту открывался редактор этого свойства. Использование класса TComponentEditor и переопределение соответствующих методов позволило реализовать требуемое поведение. Приведенный пример кода можно использовать в качестве основы для создания собственных кастомных редакторов в Delphi.
Разработчик в Delphi создает кастомный редактор для компонента `TCustomPanel` с `TOwnedCollection`, чтобы в режиме дизайнера двойной клик по компоненту открывал редактор его свойства.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.