Ställ in CheckBox.Checked utan OnClick-händelsen

TCheckBox Delphi-kontrollen visar en kryssruta som kan vara på (markerad) eller av (avmarkerad). De Kontrollerad egendom anger om kryssrutan är markerad eller inte.

När användaren klickar i kryssrutan för att ändra dess kontrollerade tillstånd avfyras OnClick-händelsen för kryssrutan.

Ändra kryssrutans kontrollerade egendom

Eftersom det inte finns något OnCheckedChanged händelse, kommer du förmodligen att hantera programlogiken beroende på kryssrutans kontrollerade tillstånd i sin OnClick-händelse.

Men om du programmatiskt ändra egenskapen Kontrollerad kommer OnClick-händelsen att avfyras -- även om ingen användarinteraktion skedde.

Det finns (åtminstone) två sätt att programmatiskt ändra den markerade egenskapen i kryssrutan medan "inaktivera" OnClick-händelsen.

Ta bort OnClick-hanteraren, ändra kontrollerad, sätt tillbaka den ursprungliga OnClick-hanteraren

I Delphi för Win32 kan en händelse endast ha en händelseshanterare (procedur) kopplad till den (även om det finns ett sätt att härma multicast-händelser i Delphi för Win32). OnClick-händelsens signatur av en TCheckBox-kontroll är "typ TNotifyEvent = procedur (avsändare: TObject) av objekt;"

Om du tilldelar NIL till OnClick-händelsen innan du ändrar kryssrutans tillstånd återgår du till den ursprungliga proceduren för Händelsehantering - OnClick-händelsen avfyras inte.

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

var

   onClickHandler: TNotifyEvent;

 Börja

   med kryssruta do

   Börja

     onClickHandler: = OnClick;

     OnClick: = noll;

    Kontrollerad: = kontroll;
    OnClick: = onClickHandler;
  
slutet;

slutet; 

Användningen av denna procedur är enkel:

 // växla Kontrollerat tillståndBörja

   SetCheckedState (CheckBox1, NOT CheckBox1.Checked);

 slutet;

SetCheckedState ovan växlar till kontrollerad egenskap i kryssrutan CheckBox1.

Protected Hack: ClicksDisabled: = true

Ett annat sätt att hindra OnClick från att köra, när du programmerar att ändra egenskapen Kontrollerad i en kryssruta, är att dra nytta av den "dolda" (skyddade) ClicksDisabled fast egendom.

Genom att titta på TCheckBox SetState-procedur som körs varje gång den kontrollerade egenskapen ändras, avfyras OnClick om ClicksDisabled inte är sant.

Eftersom ClicksDisabled är skyddat kan du inte komma åt det från din kod.

Lyckligtvis kan den skyddade hacktekniken få åtkomst till de dolda / skyddade egenskaperna hos en Delphi-kontroll.