Domanda

Ho un discendente TListView che introduce funzionalità aggiuntive come l'ordinamento e il caricamento da un set di dati.

ora desidero modificare la classe in modo che ogni volta che un elemento è controllato o incontrollato viene aggiunto o rimosso in un elenco interno di elementi selezionati in modo che un'applicazione che utilizza un'istanza del componente può facilmente leggere il numero e la posizione delle controllate articoli senza dover iterare su tutti gli elementi nella vista elenco.

Sfortunatamente, piuttosto che astraendo gestione del controllo / deselezionare operazione in qualche metodo interno (come DoCheck) che ho potuto ignorare, TCustomListView sembra incorporare la logica di verifica profondo in una grande funzione di gestione dei messaggi.

L'unico modo che posso pensare di introdurre il mio comportamento ordinatamente nel componente è quello di dirottare la proprietà OnItemChecked, causando che la proprietà per leggere e scrivere FOnItemCheckedUser (per esempio) piuttosto che FOnItemChecked, ha messo il mio codice in FOnItemChecked, e chiamare FOnItemCheckedUser dal mio codice.

C'è un modo più semplice per gestire questa situazione? In caso contrario, è la mia idea fattibile e sicuro per implementare?

È stato utile?

Soluzione

E 'un peccato che il codice di controllo-evento è sepolto in un gestore di messaggi, ma non è un bloccante. Catturare e gestire lo stesso messaggio da soli. Rilevare le stesse condizioni di controlli gestore di messaggi della classe genitore per, e poi fare le vostre azioni personalizzate lì. In seguito, chiamare 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;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top