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

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

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

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

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

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

1 ответ

Решение

К сожалению, код check-event скрыт в обработчике сообщений, но это не showtopper. Поймай и обработай это же сообщение сам. Определите те же условия, которые проверяет обработчик сообщений родительского класса, а затем выполните там свои пользовательские действия. После звоните 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;
Другие вопросы по тегам