Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Создание и инициализация кастомных свойств компонента TSpeedButton в Delphi

Delphi , Компоненты и Классы , Компоненты

При работе с компонентом TSpeedButton в Delphi может возникнуть необходимость добавления новых свойств, которые позволят расширить его функциональность. В данной статье мы рассмотрим, как добавить два новых свойства: ImgIndex и ImgList, которые будут использоваться для работы с изображениями.

Проблема

Пользователь столкнулся с проблемой, когда после добавления новых свойств в компонент TSpeedButton, значения этих свойств в runtime были равны nil. Это происходило, несмотря на то что свойства корректно отображались в Object Inspector и их значения сохранялись в DFM файле.

Решение

Проблема заключалась в том, что доступ к свойствам ImageList нельзя получить из события Create компонента, так как это происходит до того, как содержимое будет загружено из DFM файла. Вместо этого, код, который обращается к ImageList, следует перенести в переопределённый метод Loaded, который вызывается после загрузки всего содержимого.

type
  TlbSpeedButton = class(TSpeedButton)
  private
    fImageList: TImageList;
    fImageIndex: Integer;
    procedure SetImageIndex(aIndex: Integer);
    procedure SetImageList(aImageList: TImageList);
    procedure UpdateGlyph;
  protected
    procedure Loaded; override;
    procedure Notification(AComponent: TComponent; Operation: TOperation); override;
  public
    constructor Create(AOwner: TComponent); override;
  published
    property ImgIndex: Integer read fImageIndex write SetImageIndex default -1;
    property ImgList: TCustomImageList read fImageList write SetImageList;
  end;

constructor TlbSpeedButton.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  fImageIndex := -1;
end;

procedure TlbSpeedButton.Loaded;
begin
  inherited;
  UpdateGlyph;
end;

procedure TlbSpeedButton.Notification(AComponent: TComponent; Operation: TOperation);
begin
  inherited;
  if (Operation = opRemove) and (AComponent = fImageList) then
  begin
    fImageList := nil;
    UpdateGlyph;
  end;
end;

procedure TlbSpeedButton.UpdateGlyph;
begin
  if csLoading in ComponentState then Exit;
  if Assigned(fImageList) and (fImageIndex >= 0) and (fImageIndex < fImageList.Count) then
    fImageList.GetBitmap(fImageIndex, Self.Glyph)
  else
    Self.Glyph := nil;
  Invalidate;
end;

procedure TlbSpeedButton.SetImageIndex(aIndex: Integer);
begin
  if fImageIndex <> aIndex then
  begin
    fImageIndex := aIndex;
    UpdateGlyph;
  end;
end;

procedure TlbSpeedButton.SetImageList(aImageList: TCustomImageList);
begin
  if fImageList <> aImageList then
  begin
    if Assigned(fImageList) then fImageList.RemoveFreeNotification(Self);
    fImageList := aImageList;
    if Assigned(fImageList) then fImageList.FreeNotification(Self);
    UpdateGlyph;
  end;
end;

Обратите внимание, что методы SetImageIndex и SetImageList должны обновлять Glyph, проверяя флаг csLoading, чтобы не обновлять Glyph во время загрузки DFM. Также не забудьте вызвать FreeNotification() для TImageList, так как он не является частью компонента и может быть освобождён до освобождения самого компонента.

Подтвержденное решение

В дополнение к вышеуказанному, методы SetImageIndex и SetImageList должны обновлять Glyph в случае, если свойства будут изменены в коде после загрузки DFM или даже во время дизайна. Важно проверить флаг csLoading свойства ComponentState, чтобы не обновлять Glyph во время загрузки DFM, так как обновление будет выполнено в методе Loaded(). Кроме того, не забывайте вызывать FreeNotification() для TImageList, который является внешним по отношению к компоненту.

Пример кода

// Обновлённый код компонента TlbSpeedButton
// ...
// Здесь должен быть код, аналогичный предоставленному выше, с учётом всех рекомендаций
// ...

Заключение

В данной статье мы рассмотрели, как правильно добавить и инициализировать кастомные свойства для компонента TSpeedButton в Delphi, используя переопределение метода Loaded и корректную работу с уведомлениями. Это позволит вам расширить функциональность стандартных компонентов, сохраняя при этом их совместимость с DFM файлами и дизайнером форм.

Создано по материалам из источника по ссылке.

Пользователь столкнулся с проблемой инициализации кастомных свойств компонента `TSpeedButton` в Delphi, связанной с неправильной работой этих свойств после загрузки DFM файла.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Компоненты ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-07-16 03:02:55/0.0019748210906982/0