Работа со свойствами Images и ImageIndex в Delphi VCL: решение проблемы наследования
В процессе создания компонента Delphi VCL, разработчик столкнулся с необходимостью получения свойства Images из базового класса компонента в событии подкласса Buttons. В данном случае, подкласс Buttons обладает свойством ImageIndex, для которого требуется редактор свойств, чтобы можно было выбрать изображение из списка, предоставляемого свойством Images базового класса.
Описание проблемы
Разрабатывается компонент с двумя свойствами: Images, позволяющий выбрать TImageList, и Buttons, который имеет свойство ImageIndex. Для редактора свойств ImageIndex необходимо получить доступ к списку изображений Images из базового класса компонента в событии, связанном с Buttons.
Решение проблемы
Для решения данной задачи следует использовать класс TOwnedCollection вместо TCollection, что упрощает процесс сохранения компонента в DFM. Класс TCollectionItem имеет свойство Collection, которое в свою очередь имеет метод Owner, реализованный в TOwnedCollection. Это позволяет получить доступ от кнопки к её владельцу в коде.
Пример кода
TFlexButton = class(TCollectionItem)
private
// ...
public
constructor Create(ACollection: TCollection); override;
end;
TFlexButtons = class(TOwnedCollection)
private
// ...
public
constructor Create(AOwner: TFlexButtonGroupBox); reintroduce;
// ...
end;
TFlexButtonGroupBox = class(TcxGroupBox)
private
// ...
procedure SetButtons(AValue: TFlexButtons);
public
constructor Create(AOwner: TComponent); override;
// ...
published
// ...
property Buttons: TFlexButtons read FButtons write SetButtons;
// ...
end;
constructor TFlexButton.Create(ACollection: TCollection);
begin
inherited;
// ...
end;
constructor TFlexButtons.Create(AOwner: TFlexButtonGroupBox);
begin
inherited Create(AOwner, TFlexButton);
// ...
end;
constructor TFlexButtonGroupBox.Create(AOwner: TComponent);
begin
inherited;
FButtons := TFlexButtons.Create(Self);
// ...
end;
procedure TFlexButtonGroupBox.SetButtons(AValue: TFlexButtons);
begin
FButtons.Assign(AValue);
end;
function TImageIndexProperty.GetImageListAt(Index: Integer): TCustomImageList;
begin
Result := ((GetComponent(Index) as TFlexButton).Collection.Owner as TFlexButtonGroupBox).Images;
end;
Комментарии
Благодарю за пример кода, Remy, теперь все работает и я понял систему.
Заключение
При работе с наследованными свойствами в Delphi VCL, использование TOwnedCollection позволяет упростить доступ к владельцу объекта, что решает проблему получения свойства Images из базового класса в контексте подкласса Buttons.
Проблема связана с наследованием свойства `Images` в базовом классе для использования его в подклассе `Buttons` с свойством `ImageIndex` в Delphi VCL, и решением является использование класса `TOwnedCollection` для упрощения доступа к владельцу компонент
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.