Ställ in CheckBox. Kontrollerad 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 programmera ä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;"

instagram viewer

Om du tilldelar NIL till OnClick-händelsen innan du ändrar kryssrutans tillstånd, återgår du till den ursprungliga proceduren för Händelsehändelse - 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 ditt koda.

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

De åtkomna skyddade medlemmarna i en komponent ger mer information om ämnet.

Vad du behöver göra är att förklara en enkel dummy-klass som utökar TCheckBox i samma enhet där du använder egenskapen ClicksDisabled.

När du har tagit hand om ClicksDisabled, ställer du bara in den till true, ändrar egenskapen Kontrollerad och ställer sedan ClicksDisabled tillbaka till falsk (standardvärde):

typ


 TCheckBoxEx = klass (TCheckBox);


 ...


med TCheckBoxEx (CheckBox1) dobegin

 ClicksDisabled: = true;

 Kontrollerad: = INTE Kontrollerad;

 ClicksDisabled: = falsk;

slutet;

Obs: koden ovan växlar den kontrollerade egenskapen i kryssrutan med namnet "CheckBox1" med den skyddade egenskapen ClicksDisabled.

Bygg applikationer med Delphi

  • Nybörjarguide för Delphi-databasprogrammering
  • Integrera grundläggande diagram i Delphi-applikationer
  • Hur man flyttar och ändrar storlek på kontroller vid körning
  • Multithreaded Delphi-databasfrågor
instagram story viewer