![]() |
Problem mit checkbox.checked := true
Wie in einem
![]()
Delphi-Quellcode:
schreibt, auch gleich das OnClick-Event der Checkbox ausgelöst wird.
checkbox.checked := true
In diesem Thread wurde als Workaround folgendes vorgeschlagen :
Delphi-Quellcode:
Das funktioniert auch (die Checkbox ist - optisch zumindest - "checked"), allerdings liefert eine Abfrage auf
SendMessage(checkbox.Handle, BM_SETCHECK, Integer(cbChecked), 0);
Delphi-Quellcode:
leider ein false zurück :gruebel:
if (checkbox.checked) then ...
Wer kann mir da weiterhelfen ? |
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; |
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:
Das funktioniert auch, aber auch nur für die Optik!
checkbox.Perform(BM_SETCHECK, 1, 0);
Wer kann mir in dem Zusammenhang mal die Parameter LParam und WParam bei Messages erklären? [/edit] |
Re: Problem mit checkbox.checked := true
Ich schieb mich mal :zwinker:
Weiss denn keiner was, bin schon etwas verzweifelt :wall: |
Re: Problem mit checkbox.checked := true
Zitat:
|
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 |
Re: Problem mit checkbox.checked := true
Zitat:
|
Re: Problem mit checkbox.checked := true
Zitat:
...:cat:... |
Re: Problem mit checkbox.checked := true
@Sakura:
Sorry, kommt nicht wieder vor :duck: @Stevie Warum setzt
Delphi-Quellcode:
zwar den Haken in die Checkbox, aber die Property "Checked" ist immer noch false?
checkbox.Perform(BM_SETCHECK, 1, 0);
Und bei der Lösung von scp
Delphi-Quellcode:
verstehe ich nicht, dass nach OnClick := nil doch wieder checked:=true aufgerufen wird, was doch eigentlich wieder OnClick auslöst :drunken:
checkbox1.OnClick := nil;
checkbox1.checked := true; |
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 |
Re: Problem mit checkbox.checked := true
Zitat:
2. Intern wird die Funktion Click aufgerufen und die macht folgenden Befehl (vereinfacht):
Delphi-Quellcode:
Das heißt, wenn OnClick (ist ja nur ein Methodenzeiger) nicht gesetzt ist (was ja mit dem := nil bewerkstelligt wurde), dann wird die Funktion auch nicht aufgerufen, wenn du Checked setzt.
if Assigned(FOnClick) then
FOnClick(Self); |
Re: Problem mit checkbox.checked := true
Wow, danke, ich glaube nun wird Licht im Kopf :idea:
:thumb: Wieder was gelernt, danke für Eure Mühe :) |
Re: Problem mit checkbox.checked := true
da du den checked-status über die windows-message togglest, kannst du auch die abfrage über winapi-funktionen machen...
mithilfe von
Delphi-Quellcode:
bekommst du (bei einer normalen delphi-checkbox) entweder BST_CHECKED oder BST_UNCHECKED als ergebnis zurück, bedeutung dürfte klar sein, dann machst du halt statt
CheckBox1.Perform(BM_GETCHECK,0,0)
Delphi-Quellcode:
ein
if CheckBox1.Checked then
Delphi-Quellcode:
und schon is das problem gelöst :roll:
if CheckBox1.Perform(BM_GETCHECK,0,0) = BST_CHECKED then
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:55 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz