Stel CheckBox.Checked in zonder de OnClick-gebeurtenis

Het TCheckBox Delphi-besturingselement geeft een selectievakje weer dat kan worden ingeschakeld (aangevinkt) of uitgeschakeld (niet aangevinkt). De Gecontroleerde eigendom geeft aan of het selectievakje is ingeschakeld of niet.

Wanneer de gebruiker op het selectievakje klikt om de status Gecontroleerd te wijzigen, wordt de OnClick-gebeurtenis voor het selectievakje geactiveerd.

De aangevinkte eigenschap van het selectievakje wijzigen

Aangezien er geen is OnCheckedChanged gebeurtenis, zult u waarschijnlijk de programmalogica afhandelen, afhankelijk van de aangevinkte status van het selectievakje in de OnClick-gebeurtenis.

Echter, als u verander de eigenschap Gecontroleerd, de OnClick-gebeurtenis wordt geactiveerd -- hoewel er geen gebruikersinteractie plaatsvond.

Er zijn (ten minste) twee manieren om de aangevinkte eigenschap van het selectievakje programmatisch te wijzigen terwijl de OnClick-gebeurtenis wordt "uitgeschakeld".

Verwijder de OnClick-handler, wijzig gecontroleerd, plaats de originele OnClick-handler terug

In Delphi voor Win32 kan aan een gebeurtenis slechts één gebeurtenishandler (procedure) zijn gekoppeld (hoewel er een manier is om multicast-gebeurtenissen na te bootsen in Delphi voor Win32). De handtekening van de OnClick-gebeurtenis van een TCheckBox-besturingselement is "type TNotifyEvent = procedure (Sender: TObject) of object;"

Als u NIL toewijst aan de OnClick-gebeurtenis voordat u de status van het selectievakje wijzigt, keert u terug naar de oorspronkelijke OnClick-gebeurtenisafhandelingsprocedure - de OnClick-gebeurtenis wordt niet geactiveerd.

 procedure SetCheckedState (const checkBox: TCheckBox; const selectievakje: boolean);

var

   onClickHandler: TNotifyEvent;

 beginnen

   met checkbox Doen

   beginnen

     onClickHandler: = OnClick;

     OnClick: = nul;

    Gecontroleerd: = controleren;
    OnClick: = onClickHandler;
  
einde;

einde; 

Het gebruik van deze procedure is eenvoudig:

 // schakelen Gecontroleerde statusbeginnen

   SetCheckedState (CheckBox1, NIET CheckBox1.Checked);

 einde;

De SetCheckedState hierboven schakelt de eigenschap Gecontroleerd van het selectievakje CheckBox1 in.

Beschermde hack: ClicksDisabled: = true

Een andere manier om te stoppen met het uitvoeren van OnClick, wanneer u de eigenschap Gecontroleerd van een selectievakje programmatisch wijzigt, is om te profiteren van de "verborgen" (beschermd) ClicksDisabled eigendom.

Door te kijken naar de SetState-procedure van de TCheckBox die wordt uitgevoerd wanneer de eigenschap Gecontroleerd verandert, wordt de OnClick geactiveerd als ClicksDisabled niet waar is.

Omdat ClicksDisabled is beveiligd, hebt u er geen toegang toe vanuit uw code.

Gelukkig kun je met de beveiligde hacktechniek toegang krijgen tot die verborgen / beschermde eigenschappen van een Delphi-besturingselement.