Pregunta

Tengo un descendiente TListView que introduce características adicionales como la clasificación y carga de un conjunto de datos.

Ahora deseo de modificar la clase para que cada vez que un artículo está marcado o no que se añade o elimina en una lista interna de los elementos seleccionados de manera que una aplicación utilizando una instancia del componente puede leer fácilmente el número y la ubicación de comprobar artículos sin tener que iterar sobre todos los elementos de la vista de lista.

Desafortunadamente, en lugar de la abstracción de manejo de la comprobación del funcionamiento / Desmarcar en algún método interno (como DoCheck) que podía anular, TCustomListView parece incrustar la lógica de verificación de profundidad en una gran función de manejo de mensajes.

La única manera que puedo pensar para introducir mi propio comportamiento perfectamente en el componente es secuestrar la propiedad OnItemChecked, causando que la propiedad para leer y escribir FOnItemCheckedUser (por ejemplo) en lugar de FOnItemChecked, poner mi propio código en FOnItemChecked, y llamar FOnItemCheckedUser de mi código.

¿Hay una manera más fácil de manejar esto? Si no es así, es mi idea factible y segura de implementar?

¿Fue útil?

Solución

Es desafortunado que el código de registro de entrada evento está enterrado en un controlador de mensajes, pero no es algo sensacional. Capturar y manejar el mismo mensaje a sí mismo. Detectar las mismas condiciones cheques controlador de mensajes de la clase padre para, a continuación, realice sus acciones personalizadas allí. Después, llame 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;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top