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.
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.
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;
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.
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.