Conseils

Définir CheckBox.Checked sans l'événement OnClick

Définir CheckBox.Checked sans l'événement OnClick

Le contrôle Delphi de TCheckBox affiche une case à cocher qui peut être activée (cochée) ou désactivée (non cochée). le Propriété vérifiée spécifie si la case à cocher est cochée ou non.

Lorsque l'utilisateur clique sur la case à cocher pour modifier son état Checked, l'événement OnClick correspondant à la case à cocher est déclenché.

Changer la propriété cochée de la case à cocher

Puisqu'il n'y a pas OnCheckedChanged événement, vous allez probablement gérer la logique du programme en fonction de l’état coché de la case à cocher dans son événement OnClick.

Cependant, si vous modifier par programme la propriété Checked, l'événement OnClick sera déclenché - même si aucune interaction de l'utilisateur n'a eu lieu.

Il existe (au moins) deux façons de modifier par programme la propriété cochée de la case à cocher tout en "désactivant" l'événement OnClick.

Supprimer le gestionnaire OnClick, Modifier coché, remettre le gestionnaire d'origine OnClick

Dans Delphi pour Win32, un événement ne peut être associé qu'à un seul gestionnaire d'événements (procédure) (même s'il existe un moyen de simuler des événements de multidiffusion dans Delphi pour Win32). La signature de l'événement OnClick d'un contrôle TCheckBox est "type TNotifyEvent = procedure (Sender: TObject) de l'objet;"

Si vous affectez NIL à l'événement OnClick avant de modifier l'état de la case à cocher, vous revenez à la procédure de gestion des événements OnClick d'origine - l'événement OnClick ne sera pas déclenché.

procédure SetCheckedState (const checkBox: TCheckBox; const vérifier: booléen);

var

onClickHandler: TNotifyEvent;

commencer

  avec checkbox faire

  commencer

onClickHandler: = OnClick;

OnClick: = néant;
Vérifié: = vérifier;
OnClick: = onClickHandler;
  

fin;

fin;

L'utilisation de cette procédure est simple:

 // bascule l'état Checkedcommencer

SetCheckedState (CheckBox1, PAS CheckBox1.Checked);

fin;

La valeur SetCheckedState ci-dessus bascule la propriété Checked de la case à cocher CheckBox1.

Piratage protégé: ClicksDisabled: = true

Un autre moyen d'empêcher l'exécution d'OnClick, lorsque vous modifiez par programme la propriété Checked d'une case à cocher, consiste à tirer parti de l'option "hidden" (protected) ClicksDisabled propriété.

En examinant la procédure SetState de TCheckBox qui est exécutée chaque fois que la propriété Checked est modifiée, OnClick est déclenché si ClicksDisabled n'est pas true.

ClicksDisabled étant protégé, vous ne pouvez pas y accéder à partir de votre code.

Heureusement, la technique du hack protégé vous permet d'accéder aux propriétés masquées / protégées d'un contrôle Delphi.

L'accès aux membres protégés d'un composant fournit plus d'informations sur le sujet.

Ce que vous devez faire est de déclarer une classe factice simple étendant TCheckBox dans la même unité que celle où vous utiliserez la propriété ClicksDisabled.

Une fois que vous avez mis la main sur ClicksDisabled, définissez-le simplement sur true, modifiez la propriété Checked, puis redéfinissez ClicksDisabled sur false (valeur par défaut):

type

TCheckBoxEx = classe (TCheckBox);



avec TCheckBoxEx (CheckBox1) dobegin

ClicksDisabled: = true;

Vérifié: = NON vérifié;

ClicksDisabled: = false;

fin;

Remarque: le code ci-dessus active ou désactive la propriété Checked de la case à cocher "CheckBox1" à l'aide de la propriété protected ClicksDisabled.

Construire des applications avec Delphi