Egal, ob $wert True oder False ist, es wird als True behandelt! :o

  • Hallo liebes Forum,

    ich habe da ein Problem mit einer Funktion, welche einen Wert vom Typ Boolean in ein Checked/Unchecked für mein GUI umwandelt:

    [autoit]

    Func _Bool2Check($wert);
    Select
    Case $wert = True ; <-- Egal, ob $wert True oder False ist, es wird ausschließlich dieser Case ausgeführt!!!
    MsgBox(0,"True:", $wert); <-- Egal, ob $wert True oder False ist, es wird ausschließlich dieser Case ausgeführt!!!
    Return $GUI_CHECKED ; <-- Egal, ob $wert True oder False ist, es wird ausschließlich dieser Case ausgeführt!!!
    Case $wert = False
    MsgBox(0,"False:", $wert);
    Return $GUI_UNCHECKED
    Case Else
    MsgBox(0,"Select Case Else", "Dieser Fall sollte NIEMALS eintreten!");
    EndSelect
    EndFunc

    [/autoit]

    Natürlich hatte ich anfangs If verwendet, als dort das Problem auftrag, habe ich es mit Switch und Select probiert (um ggf. einen Bug zu umgehen), das Ergebnis ist jedoch immer dasselbe...

    Könnt Ihr mir weiterhelfen?

    Viele Grüße
    Jens

    Einmal editiert, zuletzt von Jens Blumberg (29. August 2012 um 14:23) aus folgendem Grund: Eigenes Thema als gelöst markiert

    • Offizieller Beitrag

    Das Problem ist die automatische Typverwaltung von Variablen bei AutoIt. Wenn der Variablen nicht direkt True/False zugewiesen wird (sondern Null/Eins), dann wird das als String interpretiert, was bei einer If-Abfrage immer zu True führt.
    Umgehen kann man das mit Execute oder Number. Siehe hier:

    [autoit]


    $var = '0'
    $var = Execute($var)
    If $var Then
    ConsoleWrite('Execute = $GUI_CHECKED' & @CR)
    Else
    ConsoleWrite('Execute = $GUI_UNCHECKED' & @CR)
    EndIf

    [/autoit][autoit][/autoit][autoit]

    $var = '0'
    $var = Number($var)
    If $var Then
    ConsoleWrite('Number = $GUI_CHECKED' & @CR)
    Else
    ConsoleWrite('Number = $GUI_UNCHECKED' & @CR)
    EndIf

    [/autoit]
  • Wenn der Typ der Variable nicht genau feststeht könnte ich mir so etwas vorstellen:

    [autoit]

    Func _Bool($f)
    If Not IsString($f) Then Return $f = True
    Switch $f
    Case "yes", "true", "y", "t"
    Return True
    EndSwitch
    Return False
    EndFunc

    [/autoit][autoit][/autoit][autoit]

    If _Bool($var) Then
    ...
    Else
    ...
    EndIf

    [/autoit]
  • Also da der Wert - wie du gesagt hast - IMMER als TRUE behandelt wird, frage ich mich, wie du die Funktion aufrufst, bei mir geht nämlich beides:

    Spoiler anzeigen
    [autoit]

    #include<GUIConstantsEx.au3>
    local $wert1 = false
    _Bool2Check($wert1)
    Func _Bool2Check($wert);
    Select
    Case $wert = True ; <-- Egal, ob $wert True oder False ist, es wird ausschließlich dieser Case ausgeführt!!!
    MsgBox(0,"True:", $wert); <-- Egal, ob $wert True oder False ist, es wird ausschließlich dieser Case ausgeführt!!!
    Return $GUI_CHECKED ; <-- Egal, ob $wert True oder False ist, es wird ausschließlich dieser Case ausgeführt!!!
    Case $wert = False
    MsgBox(0,"False:", $wert);
    Return $GUI_UNCHECKED
    Case Else
    MsgBox(0,"Select Case Else", "Dieser Fall sollte NIEMALS eintreten!");
    EndSelect
    EndFunc

    [/autoit]

    mfg
    Hauke

  • Moin,
    Ich würde das ganze mit Int und Execute machen.
    Dann funktionierts bei mir folgendes:

    Zahlen: |n|<1 -> False, |n|>=1 -> True
    Strings: "0" -> False, "n" -> True (Hier gilt auch das mit |n|)
    Strings: "False" -> False, "True" -> True, "Hallo" = False (Sofern es keine Funktion Hallo() mit einem Rückgabewert gibt)
    Bool: False -> False, True -> True

    Ich wüsste nicht was man sonst noch alles abdecken kann^^

    [autoit]

    #include <GUIConstantsEx.au3>

    [/autoit][autoit][/autoit][autoit]

    local $wert1 = "-0.57876876"

    [/autoit][autoit][/autoit][autoit]

    _Bool2Check($wert1)

    [/autoit][autoit][/autoit][autoit]

    Func _Bool2Check($wert);
    ConsoleWrite(Int($wert))
    Select
    Case Int(Execute($wert)) ; <-- Egal, ob $wert True oder False ist, es wird ausschließlich dieser Case ausgeführt!!!
    MsgBox(0,"True:", $wert); <-- Egal, ob $wert True oder False ist, es wird ausschließlich dieser Case ausgeführt!!!
    Return $GUI_CHECKED ; <-- Egal, ob $wert True oder False ist, es wird ausschließlich dieser Case ausgeführt!!!
    Case Not Int(Execute($wert))
    MsgBox(0,"False:", $wert);
    Return $GUI_UNCHECKED
    Case Else
    MsgBox(0,"Select Case Else", "Dieser Fall sollte NIEMALS eintreten!");
    EndSelect
    EndFunc

    [/autoit]
  • Vielen Dank für Eure Hilfen, ich habe das Problem gleich mit dem ersten Vorschlag beseitigen können:

    [autoit]

    Func _Bool2Check($wert);
    $tmp = Execute($wert);
    If $tmp = True Then
    MsgBox(0,"True:", $wert);
    Return $GUI_CHECKED;
    ElseIf $tmp = False Then
    MsgBox(0,"False:", $wert);
    Return $GUI_UNCHECKED;
    Else
    MsgBox(0,"If Else", "Dieser Fall sollte NIEMALS eintreten!");
    EndIf
    EndFunc

    [/autoit]

    Also da der Wert - wie du gesagt hast - IMMER als TRUE behandelt wird, frage ich mich, wie du die Funktion aufrufst

    Die Funktion folgt auf ein IniRead():

    [autoit]

    GUICtrlSetState($StartWithWindows, _Bool2Check(IniRead($inifile, "Autologin", "Starte mit Windows", False)));
    GUICtrlSetState($AskOnStart, _Bool2Check(IniRead($inifile, "Autologin", "Erst fragen, dann starten", True)));

    [/autoit]

    Viele Grüße
    Jens

  • Die Funktion folgt auf ein IniRead():


    Verwende niemals Execute für Ini-Einträge. Da könnte jemand ein hübsches AutoIt-Kommando einschleichen wie z.B. DirRemove(@MyDocumentsDir)
    Wenn du einen String hast mach wie in meinem Beispiel eine Abfrage auf gängige wahre Werte, dann kann der Nutzer auch y oder yes oder 1 angeben wenn er die Ini von Hand verändert.

  • Vielen Dank für die Warnung!

    Ich verwende in der Funktion jetzt den Stringvergleich.

    Viele Grüße
    Jens