Nun, es scheint hier wohl einige Missverständnisse zu geben. Dieser Beitrag ist ein bisschen länger geworden als eigentlich geplant, aber wer dies vorher noch nicht wusste, dem rate ich
dringenst, sich das durchzulesen.
Zuerst einmal:
PHP Code:
If $checkbox1 = True Then
; oder
If $checkbox1 = 1 Then
; oder
If $checkbox1 Then
Das wird
nicht richtig funktionieren.
Warum?
Ein von GUICtrlCreate... zurückgegebener Wert ist ein
Handle. Ein Handle repräsentiert einen Wert, der für interne Funktionen wichtig ist und ihnen deswegen auch übergeben werden muss, damit diese Funktionen wissen, mit welchem Element sie ihre Aktionen durchführen müssten, z.B.
GUICtrlSetData. Für den Programmierer hat dieser Handle erstmal keinen sinnvollen wert, da er erstes bei jedem Ausführen wechseln kann und zweitens willkürlich ist. (Um genau zu sein handelt es sich hier um eine sogenannte
Control-Id, welche wie ein Counter für jedes Steuerelement erhöht wird. Man könnte deswegen davon ausgehen, dass das zweite Element, das man in einem GUI erzeugt, eine Id haben wird, die um eins höher ist als die des Elements zuvor. Eine Abfrage auf diese Id ist jedoch in den seltensten Fällen angebracht, z.B. bei sehr vielen Controls.)
Eine Abfrage auf solch einen Wert würde also nicht dem abgehakten Status ensprechen sondern ein Vergleich mit dieser Id sein.
Dementsprechen würden also die erste und die letzte Abfrage
immer True zurückliefern, falls das Element erfolgreich erstellt wurde.
PHP Code:
If GUICtrlRead($checkbox1) Then
; oder
If GUICtrlRead($checkbox1) = 1 Then
ist allerdings ebenfalls
falsch. Nicht aus demselben Grund, aber es kann irreführend sein - vor allem das erste Beispiel. Dieses wird immer
True sein.
GUICtrlRead liefert nach Definition bei Checkboxen und Radiobuttons denselben Wert wie
GUICtrlGetState.
Dieser Wert entspricht jedoch dem Status und besteht aus Bit-Flags. Eine Liste dieser Flags findet sich in der Hilfe. Darunter befinden sich unter
$GUI_UNCHECKED (welcher
4 entspricht) und
$GUI_CHECKED (bekanntlich
1) auch noch
$GUI_HIDE oder
$GUI_DISABLE usw. Wenn die Checkbox nicht selektiert ist, dann ist sie
unselektiert und es würde (unter anderem)
$GUI_UNCHECKED zurückgegeben werden, was ja auch ein Wert ungleich
0 ist.
Aber was ist ein Bitflag?
Wer programmiert, der sollte wissen, dass ein Computer oder generell ein technisches Gerät im
Dualen System arbeitet. Er unterscheidet also zwischen zwei Werten: 1 und 0, oder auch An und Aus.
Auf diese Weise werden auch Variablen gespeichert. Demzufolge ergibt sich dann ein Wert wie
0010 0011 1101 0011 0011 1101 1001 0001b für einen 32-bit Integer (1 Bit = 1 Zeichen). Das
b steht dabei für "binär".
Ein "Bitflag" nennt man es, wenn ein bestimmtes Bit dieser Variable auf 1 gesetzt wird. Zur Vereinfachung mal mit 4 Bit verdeutlicht:
0010b
Hier ist das 1. Bit gesetzt (0-basierend und rückwärts), dies ist also das 1. Bitflag.
Der Clou bei den Bitflags ist, dass man mehrere setzen kann. So könnte der Wert auch
0110b lauten und wir hätten 2 Bitflags gesetzt.
Wie arbeite ich damit?
Von der Funktion
GUICtrlGetState oder auch
GUICtrlRead erhalten wir nun also eine Variable, die verschiedene Bitflags enthalten kann. Wir müssen nun überprüfen, ob das entsprechende Flag für unseren Wert, den wir überprüfen möchten,
gesetzt ist.
Dies funktioniert über
BitAND, da diese Funktion Werte (in diesem Fall die Variable
$GUI_CHECKED und den obigen Rückgabewert) miteinander vergleicht und nur die Bits setzt, die bei
beiden (bzw. allen, wenn es mehrere Werte sind) Werten gesetzt sind.
Beispiel:
Der Rückgabewert von
GUICtrlRead($checkbox1) beträgt
0111b,
$GUI_CHECKED beträgt
1 bzw.
0001b.
Code:
[COLOR="DarkOrange"]0[/COLOR][COLOR="DarkRed"]11[/COLOR][COLOR="Green"]1[/COLOR]b
[COLOR="DarkOrange"]000[/COLOR][COLOR="Green"]1[/COLOR]b
[COLOR="Blue"][B]BitAnd[/B][/COLOR] -----
[COLOR="DarkOrange"]000[/COLOR][COLOR="Green"]1[/COLOR]b
Es bleibt also eine Zahl übrig, nämlich der Wert des Flags, das unsere Variable definiert, welcher diesem Fall
1 ist. Und dann reicht eine einfache Abfrage, ob dieser Wert ungleich
0 ist.
Was bedeutet das nun?
Eine korrekte Abfrage, bei der man sicher sein kann, dass die Checkbox auch
wirklich selektiert ist, sähe so aus:
PHP Code:
If BitAND(GUICtrlRead($checkbox1), $GUI_CHECKED) Then
Man findet auch oftmals die
noch genauere Methode
PHP Code:
If BitAND(GUICtrlRead($checkbox1), $GUI_CHECKED) = $GUI_CHECKED Then
, was allerdings unnötig ist - zumindest, wenn es sich um
reine Bitflags handelt. Sollte die Variable
$GUI_CHECKED aus mehreren gesetzten Bits bestehen, so würde das erste Beispiel auch "True" sein, wenn nur eines der benötigten Bits gesetzt ist. Bei der zweiten Variante wird anschließend noch überprüft, ob der Wert genau
$GUI_CHECKED entspricht.
Das war es eigentlich, was die Sache mit GUICtrlRead, Checkboxen, $GUI_CHECKED und diesen merkwürdigen Bitflags angeht. Ich hoffe, dass dies dem ein oder anderen weiterhilft und er vielleicht endlich den Ursprung seines Fehlers findet, den er einfach zum Erbrechen nicht finden konnte.
Sollte etwas von den Informationen falsch sein, so tut mir das leid, allerdings glaube ich das nicht und wäre wirklich sehr verwundert. Einfach melden, dann werde ich es korrigieren.