Seltsame Fehler... Warum greift IF nicht?

  • Guten Tag!

    Ich Habe ein Problem: Ich schreibe gerade eine IDE für au3Irr2 und AutoIT IrrKlang. Jetzt bin ich gerade beim interpreter und ich will abfragen, ob der alte Knopf immer noch gedrückt wird. Ich Wähle den anderen Knopf und nichts passiert.

    Erst hab ich gedacht ich hätte nen grundliegenden Fehler gemach und hab das Ergebnis mit ner MsgBox gecheckt richtig - also greift das If statement nicht. Kann mir einer helfen?

    Hier der Code:

    Spoiler anzeigen
    [autoit]

    Func _AIDKAPI_Interpret2DMenu($strAIDKMENUFile, $iRed = 255, $iGreen = 255, $iBlue = 255, $bRenderScene = False, $strCallbackFunction = "")
    Local $strFileText = FileRead($strAIDKMENUFile)
    Local $aCommands = StringSplit($strFileText, @CRLF)
    Local $aParameters, $aButtonParameters
    Local $iWidth, $iHeight, $aTmpTextureInformation
    Local $aMousePosition
    Local $iSelectedButton = 1, $iOldSelectedButton = 1, $aButtons[1] = [0], $fButtonTopX, $fButtonTopY, $fButtonBottomX, $fButtonBottomY
    Local $vButtonClick = False, $vButtonSwitch = False
    For $i = 1 To $aCommands[0]
    $aParameters = StringSplit($aCommands[$i], "|")
    If $aParameters[1] = "ButtonSettings" Then
    If Not $aParameters[2] = False Then $vButtonClick = Eval($aParameters[2])
    If Not $aParameters[3] = False Then $vButtonSwitch = Eval($aParameters[3])
    EndIf
    If $aParameters[1] = "Button" Then
    _ArrayAdd($aButtons, $aCommands[$i])
    $aButtons[0] += 1
    EndIf
    Next
    While True
    _IrrGetScreenSize($iWidth, $iHeight)
    $aMousePosition = _IrrGetAbsoluteMousePosition()
    _IrrBeginScene($iRed, $iGreen, $iBlue)
    If $bRenderScene = True Then _IrrDrawScene()
    If Not $strCallbackFunction = "" Then Execute($strCallbackFunction)
    ;[...]
    For $i = 0 To $aButtons[0]-1
    $aButtonParameters = StringSplit($aButtons[$i+1], "|")
    $fButtonTopX = _AIDKAPI_PercentToPixel($aButtonParameters[2], $iWidth)
    $fButtonTopY = _AIDKAPI_PercentToPixel($aButtonParameters[3], $iHeight)
    $fButtonBottomX = _AIDKAPI_PercentToPixel($aButtonParameters[4], $iWidth)
    $fButtonBottomY = _AIDKAPI_PercentToPixel($aButtonParameters[5], $iHeight)
    If $aMousePosition[0] >= $fButtonTopX And $aMousePosition[1] >= $fButtonTopY And $aMousePosition[0] <= $fButtonBottomX And $aMousePosition[1] <= $fButtonBottomY Then $iSelectedButton = $i+1
    If _IsPressed(25) Or _IsPressed(26) Then
    While _IsPressed(25) Or _IsPressed(26)
    WEnd
    $iSelectedButton -= 1
    If $iSelectedButton < 1 Then $iSelectedButton = $aButtons[0]
    EndIf
    If _IsPressed(27) Or _IsPressed(28) Then
    While _IsPressed(27) Or _IsPressed(28)
    WEnd
    $iSelectedButton += 1
    If $iSelectedButton > $aButtons[0] Then $iSelectedButton = 1
    EndIf
    MsgBox(0,0,$iOldSelectedButton&@LF&$iSelectedButton)
    ;Check if it the old selected button is not the same as the actual and play the select sound
    If Not $iOldSelectedButton = $iSelectedButton Then
    MsgBox(0,"","YOLO")
    If Not $vButtonClick = False Then _AIK_EnginePlay2DSource($vButtonClick)
    If Not $vButtonSwitch = False Then _AIK_EnginePlay2DSource($vButtonSwitch)
    EndIf
    ;Check if it's selected and draw
    If $iSelectedButton = $i+1 Then
    $aTmpTextureInformation = _IrrGetTextureInformation(Eval($aButtonParameters[6]))
    _IrrDraw2DImageElementStretch(Eval($aButtonParameters[6]), $fButtonTopX, $fButtonTopY, $fButtonBottomX, $fButtonBottomY, _AIDKAPI_PercentToPixel($aButtonParameters[7], $aTmpTextureInformation[0]), _AIDKAPI_PercentToPixel($aButtonParameters[8], $aTmpTextureInformation[1]), _AIDKAPI_PercentToPixel($aButtonParameters[9], $aTmpTextureInformation[0]), _AIDKAPI_PercentToPixel($aButtonParameters[10], $aTmpTextureInformation[1]), $aButtonParameters[11])
    Else
    $aTmpTextureInformation = _IrrGetTextureInformation(Eval($aButtonParameters[12]))
    _IrrDraw2DImageElementStretch(Eval($aButtonParameters[12]), $fButtonTopX, $fButtonTopY, $fButtonBottomX, $fButtonBottomY, _AIDKAPI_PercentToPixel($aButtonParameters[13], $aTmpTextureInformation[0]), _AIDKAPI_PercentToPixel($aButtonParameters[14], $aTmpTextureInformation[1]), _AIDKAPI_PercentToPixel($aButtonParameters[15], $aTmpTextureInformation[0]), _AIDKAPI_PercentToPixel($aButtonParameters[16], $aTmpTextureInformation[1]), $aButtonParameters[17])
    EndIf
    Next
    ;[...]
    $iOldSelectedButton = $iSelectedButton
    _IrrEndScene()
    WEnd
    EndFunc

    [/autoit]

    Sorry, dass der Code so umständlich ist aber ich bin noch mittendrin. Danke schon mal im Vorraus

    Euer Grimbizo

  • Lies dir mal folgende Prioritätenliste der AutoIt-Operatoren durch: http://translation.autoit.de/onlinehilfe/in…g_operators.htm.
    Dann nimm dir einfach mal eine deiner problematischen If-Then-Zeile vor und und versuche zu rekonstruieren wie AutoIt den Ausdruck Schritt für Schritt (in Reihenfolge der Priorität der Operatoren) auseinander nimmt und auswertet.

    Ja, mann!!! Danke! "<>" hat funktioniert. Ich hab zwar keine Ahnung warum das standard "Not =" nicht funktioniert hat aber egal (Erklärung wär trotzdem nicht schlecht :D)

    Danke nochmal.

  • Wie ich schon schrieb: Die Priorisierung der Operatoren.
    In dem Ausdruck wird "Not" vor dem "=" ausgewertet.
    Es wird also implizit folgendes ausgewertet:

    Code
    If (Not $iOldSelectedButton) = $iSelectedButton Then


    Du willst ja hingegen aber eigentlich eher folgendes:

    Code
    If Not ($iOldSelectedButton = $iSelectedButton) Then

    Und jetzt musst du nur überlegen was bei "Not $iOldSelectedButton" als Ergebnis herauskommt wenn $iOldSelectedButton z.B. eine Zahl ist denn dieses Ergebnis wird dann ja schlussendlich mit "$iSelectedButton" per "="-Operator auf Gleichheit überprüft.

  • Wie ich schon schrieb: Die Priorisierung der Operatoren.
    In dem Ausdruck wird "Not" vor dem "=" ausgewertet.
    Es wird also implizit folgendes ausgewertet:

    Code
    If (Not $iOldSelectedButton) = $iSelectedButton Then


    Du willst ja hingegen aber eigentlich eher folgendes:

    Code
    If Not ($iOldSelectedButton = $iSelectedButton) Then

    Und jetzt musst du nur überlegen was bei "Not $iOldSelectedButton" als Ergebnis herauskommt wenn $iOldSelectedButton z.B. eine Zahl ist denn dieses Ergebnis wird dann ja schlussendlich mit "$iSelectedButton" per "="-Operator auf Gleichheit überprüft.

    Aha. Dann muss ich in Zukunft mit Not Operatoren mehr aufpassen. So lernt man immer wieder was dazu. Danke AspirinJunkie