Imposta CheckBox.Checked senza l'evento OnClick

Il controllo Delphi di TCheckBox visualizza una casella di controllo che può essere attivata (selezionata) o disattivata (non selezionata). Il Proprietà controllata specifica se la casella di controllo è selezionata o meno.

Quando l'utente fa clic sulla casella di controllo per modificarne lo stato Controllato, viene attivato l'evento OnClick per la casella di controllo.

Modifica della proprietà selezionata della casella di controllo

Dal momento che non c'è OnCheckedChanged evento, probabilmente gestirai la logica del programma in base allo stato selezionato della casella di controllo nel suo evento OnClick.

Tuttavia, se tu modificare a livello di codice la proprietà Checked, l'evento OnClick verrà generato -- anche se nessuna interazione dell'utente ha avuto luogo.

Esistono (almeno) due modi per modificare a livello di programmazione la proprietà selezionata della casella di controllo durante la "disabilitazione" dell'evento OnClick.

Rimuovi gestore OnClick, Modifica selezionata, Ripristina gestore OnClick originale

In Delphi per Win32, a un evento può essere associato un solo gestore di eventi (procedura) (anche se esiste un modo per simulare eventi multicast in Delphi per Win32). La firma dell'evento OnClick di un controllo TCheckBox è "type TNotifyEvent = procedure (Sender: TObject) dell'oggetto;"

Se si assegna NIL all'evento OnClick prima di modificare lo stato della casella di controllo, si ripristina la procedura di gestione degli eventi OnClick originale: l'evento OnClick non verrà generato.

 procedura SetCheckedState (const checkBox: TCheckBox; const check: boolean);

var

   onClickHandler: TNotifyEvent;

 inizio

   con checkBox fare

   inizio

     onClickHandler: = OnClick;

     OnClick: = zero;

    Controllato: = controllo;
    OnClick: = onClickHandler;
  
fine;

fine; 

L'uso di questa procedura è semplice:

 // attiva / disattiva lo stato controllatoinizio

   SetCheckedState (CheckBox1, NOT CheckBox1.Checked);

 fine;

SetCheckedState sopra attiva / disattiva la proprietà Checked della casella di controllo CheckBox1.

Hack protetto: ClicksDisabled: = true

Un altro modo per interrompere l'esecuzione di OnClick, quando si modifica a livello di codice la proprietà Checked di una casella di controllo, è quello di sfruttare il "nascosto" (protetto) ClicksDisabled proprietà.

Osservando la procedura SetState di TCheckBox che viene eseguita ogni volta che cambia la proprietà Checked, OnClick viene attivato se ClicksDisabled non è vero.

Poiché ClicksDisabled è protetto, non puoi accedervi dal tuo codice.

Fortunatamente, la tecnica di hacking protetto consente di accedere alle proprietà nascoste / protette di un controllo Delphi.