Обработка элемента, проверенного в потомке TListView

StackOverflow https://stackoverflow.com/questions/2225533

  •  19-09-2019
  •  | 
  •  

Вопрос

У меня есть потомок TListView, который предоставляет дополнительные функции, такие как сортировка и загрузка из набора данных.

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

К сожалению, вместо того, чтобы абстрагировать обработку операции проверки/снятия отметки в какой-то внутренний метод (например, DoCheck), который я мог бы переопределить, TCustomListView, похоже, встраивает логику проверки глубоко в большую функцию обработки сообщений.

Единственный способ, который я могу придумать, чтобы аккуратно внедрить свое собственное поведение в компонент, — это перехватить свойство OnItemChecked, заставив это свойство читать и записывать FOnItemCheckedUser (например), а не FOnItemChecked, поместить свой собственный код в FOnItemChecked и вызвать FOnItemCheckedUser из мой код.

Есть ли более простой способ справиться с этим?Если нет, то осуществима и безопасна ли моя идея?

Это было полезно?

Решение

К сожалению, код проверочного события спрятан в обработчике сообщений, но это не мешает.Уловите и обработайте это же сообщение самостоятельно.Обнаруживайте те же условия, которые проверяет обработчик сообщений родительского класса, а затем выполняйте там свои собственные действия.После этого позвоните inherited.

type
  TListViewDescendant = class(TListView)
  private
    procedure CNNotify(var Message: TMessage); message cn_Notify;
  end;

procedure TListViewDescendant.CNNotify(var Msg: TMessage);
begin
  if IsCheckBoxNotification(Msg) then
    DoSpecialCheckBoxHandling;
  inherited;
end;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top