Обработка элемента, проверенного в потомке TListView
Вопрос
У меня есть потомок 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;