Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Problem mit checkbox.checked := true (https://www.delphipraxis.net/28291-problem-mit-checkbox-checked-%3D-true.html)

MarcusB 22. Aug 2004 20:52


Problem mit checkbox.checked := true
 
Wie in einem älteren Thread beschrieben habe auch ich ein Problem, dass wenn man

Delphi-Quellcode:
checkbox.checked := true
schreibt, auch gleich das OnClick-Event der Checkbox ausgelöst wird.

In diesem Thread wurde als Workaround folgendes vorgeschlagen :

Delphi-Quellcode:
SendMessage(checkbox.Handle, BM_SETCHECK, Integer(cbChecked), 0);
Das funktioniert auch (die Checkbox ist - optisch zumindest - "checked"), allerdings liefert eine Abfrage auf

Delphi-Quellcode:
if (checkbox.checked) then ...
leider ein false zurück :gruebel:

Wer kann mir da weiterhelfen ?

scp 22. Aug 2004 21:11

Re: Problem mit checkbox.checked := true
 
z.B. so (nicht getestet):

Delphi-Quellcode:
var
  SavedOnClick: TNotifyEvent;
begin
  SavedOnClick := checkbox1.OnClick;
  checkbox1.OnClick := nil;
  checkbox1.checked := true;
  checkbox1.OnClick := SavedOnClick;
end;

MarcusB 23. Aug 2004 06:54

Re: Problem mit checkbox.checked := true
 
So, war mir leider gestern schon ein bischen spät um das auszuprobieren, aber ganz ehrlich gesagt kapiere ich deinen Ansatz nicht.
Was passiert da eigentlich?

Und warum ist das eigentlich so, das das OnClick-Event sofort mit aufgerufen wird? :gruebel:

Wäre schön wenn mich da jemand aufklären könnte :-D

[edit]:
Ich habe noch was gefunden :

Delphi-Quellcode:
checkbox.Perform(BM_SETCHECK, 1, 0);
Das funktioniert auch, aber auch nur für die Optik!
Wer kann mir in dem Zusammenhang mal die Parameter LParam und WParam bei Messages erklären?
[/edit]

MarcusB 23. Aug 2004 08:34

Re: Problem mit checkbox.checked := true
 
Ich schieb mich mal :zwinker:
Weiss denn keiner was, bin schon etwas verzweifelt :wall:

Stevie 23. Aug 2004 08:50

Re: Problem mit checkbox.checked := true
 
Zitat:

Zitat von MarcusB
So, war mir leider gestern schon ein bischen spät um das auszuprobieren, aber ganz ehrlich gesagt kapiere ich deinen Ansatz nicht.
Was passiert da eigentlich?

Und warum ist das eigentlich so, das das OnClick-Event sofort mit aufgerufen wird? :gruebel:

Wäre schön wenn mich da jemand aufklären könnte :-D

Das ist so, weil die SetState-Methode der CheckBox die ererbte Methode Click vom TButtonControl aufruft. Die Methode ruft - wenn gesetzt - die Ereignisbehandlungsmethode OnClick auf. Deshalb der Ansatz von scp, die OnClick temporär zu umgehen, indem er sie auf nil setzt, den Checked-Status ändert und sie dann wieder setzt...

MarcusB 23. Aug 2004 09:05

Re: Problem mit checkbox.checked := true
 
Ok, danke, wobei mir da immer noch ein paar Fragen offen bleiben :gruebel:

Ich habe mein Problem jetzt so gelöst, dass ich eine einfache boolsche Variable benutze, die in den betreffenden
OnClick-Routinen auf Wahrheit geprüft wird. Diese setzte ich nun einfach auf false, solange ich intern den Checkbox Status
ändern will.

:-D

Stevie 23. Aug 2004 09:10

Re: Problem mit checkbox.checked := true
 
Zitat:

Zitat von MarcusB
Ok, danke, wobei mir da immer noch ein paar Fragen offen bleiben :gruebel:

Und zwar?

sakura 23. Aug 2004 09:15

Re: Problem mit checkbox.checked := true
 
Zitat:

Zitat von MarcusB
Ich schieb mich mal :zwinker:
Weiss denn keiner was, bin schon etwas verzweifelt :wall:

:warn: Das Schieben ist frühestens nach 24 Stunden erlaubt!

...:cat:...

MarcusB 23. Aug 2004 09:38

Re: Problem mit checkbox.checked := true
 
@Sakura:

Sorry, kommt nicht wieder vor :duck:

@Stevie

Warum setzt

Delphi-Quellcode:
  checkbox.Perform(BM_SETCHECK, 1, 0);
zwar den Haken in die Checkbox, aber die Property "Checked" ist immer noch false?

Und bei der Lösung von scp

Delphi-Quellcode:
  checkbox1.OnClick := nil;
  checkbox1.checked := true;
verstehe ich nicht, dass nach OnClick := nil doch wieder checked:=true aufgerufen wird, was doch eigentlich wieder OnClick auslöst :drunken:

dizzy 23. Aug 2004 09:44

Re: Problem mit checkbox.checked := true
 
Warum das Perform die Eigenschaft nicht setzt weiss ich nicht, aber es scheint Tatsache zu sein :)

Bei der anderen Variante:
Du merkst dir den Pointer auf die Prozedur die OnClick eigentlich ausgeführt werden soll in einer Variablen, und setzt aber OnClick selber auf NIL. Das heisst, dass OnClick jetzt einfach nichts mehr passiert. Dann setzt du ganz in Ruhe die Eigenschaft neu -> OnClick wird zwar gesendet, aber es steht ja keine Prozedur mehr dahinter. Wenn du dann mit der Eigenschaft fertig bist übergibst du an OnClick wieder die vorher gesicherte Prozedur, und OnClick passiert wieder was.

gruss,
dizzy


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:35 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz