Sett CheckBox.Checked uten OnClick-hendelsen

Viser den beskyttede egenskapen ClicksDisabled

Markøren over

Getty Images/David Gould





TCheckBox Delphi kontroll viser en avkrysningsboks som kan være på (avmerket) eller av (ikke avmerket). De Sjekket eiendom angir om avmerkingsboksen er merket av eller ikke.

Når brukeren klikker på avmerkingsboksen for å endre dens avmerkede tilstand, utløses OnClick-hendelsen for avmerkingsboksen.



Endring av avkrysningsboksens avmerkede egenskap

Siden det er nei OnCheckedChanged hendelse, vil du sannsynligvis håndtere programlogikken avhengig av den sjekkede tilstanden til avmerkingsboksen i OnClick-hendelsen.

Imidlertid, hvis du endrer avkrysset egenskap programmatisk, vil OnClick-hendelsen utløses -- selv om ingen brukerinteraksjon fant sted.



Det er (minst) to måter å programmatisk endre den avkryssede egenskapen til avmerkingsboksen mens du 'deaktiverer' OnClick-hendelsen.

Fjern OnClick Handler, Endre merket, sett tilbake den opprinnelige OnClick-behandleren

I Delphi for Win32 kan en hendelse bare ha én hendelsesbehandler (prosedyre) knyttet til seg (selv om det er en måte å etterligne multicast-hendelser i Delphi for Win32). OnClick-hendelsens signatur for en TCheckBox-kontroll er 'type TNotifyEvent = prosedyre(Sender: TObject) av objektet;'

Hvis du tilordner NIL til OnClick-hendelsen før du endrer statusen til avmerkingsboksen, går du tilbake til den opprinnelige OnClick-hendelseshåndteringsprosedyren - OnClick-hendelsen vil ikke bli utløst.

|_+_||_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
Sjekket := sjekk;
OnClick := onClickHandler;
|_+_|
|_+_|

Bruken av denne prosedyren er enkel:



|_+_||_+_|
|_+_|
|_+_|

SetCheckedState ovenfor veksler mellom Checked-egenskapen til CheckBox1-avmerkingsboksen.

Beskyttet hack: ClicksDisabled: = sant

En annen måte å stoppe OnClick fra å kjøre, når du programmatisk endrer avkrysningsegenskapen til en avmerkingsboks, er å dra nytte av 'skjult' (beskyttet) Klikk deaktivert eiendom.



Ved å se på TCheckBox's SetState-prosedyre som blir utført når egenskapen Checked endres, utløses OnClick hvis ClicksDisabled ikke er sant.

Siden ClicksDisabled er beskyttet, kan du ikke få tilgang til det fra din kode .



Heldigvis lar den beskyttede hackteknikken deg få tilgang til de skjulte/beskyttede egenskapene til en Delphi-kontroll.

Tilgang til beskyttede medlemmer av en komponent gir mer informasjon om emnet.



Det du trenger å gjøre er å erklære en enkel dummy-klasse som utvider TCheckBox i samme enhet som du vil bruke ClicksDisabled-egenskapen.

Når du har fått tak i ClicksDisabled, setter du den til true, endrer egenskapen Checked, og setter deretter ClicksDisabled tilbake til false (standardverdi):

|_+_||_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|

Merk: koden ovenfor veksler mellom avkrysningsegenskapen til avmerkingsboksen kalt 'CheckBox1' ved å bruke den beskyttede ClicksDisabled-egenskapen.

Bygge applikasjoner med Delphi