Nach drücken eines Buttons steht das Programm

  • Hallo Leute, hab mal wieder ein kleines eigenartiges Problem:
    Ich kann das Programm mal toll ausführen, kann zb im Menü auf Hinzufügen klicken, das neue GUI öffnet sich, gebe alles ein, füge es hinzu und "bam" - das wars... nachher werden keine eingaben mehr entgegengenommen. Close-Button geht auch nicht mehr (aber das X).

    Das Programm soll als Lagerprogramm dienen und greift auf eine MySQL-Datenbank zu.

    Ablauf:
    Zeile 105 ;Hinzufügefenster wird aufgerufen
    Zeile 208 ;In der while-Schleife wird andauernd ein Buttondruck abgefragt
    Zeile 229 ; wird noch richtig ausgeführt!
    Zeile 90-132 ;Hier reagiert nichts mehr!?!???!?

    Ich hoffe, ihr habt noch einen Überblick und könnt mir helfen!

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <GDIPlus.au3>
    #include <GuiListView.au3>
    #include <GuiMenu.au3>
    #include <mysql.au3>
    #include <Array.au3>
    Global $sConnected=0
    Global $sql
    _Main()
    Func _Main()
    Local $filemenu, $fileitem, $separator1
    Local $exititem, $helpmenu, $aboutitem, $okbutton, $cancelbutton
    Local $msg, $file
    #forceref $separator1
    $iGUIWidth = 1000
    $iGUIHeight = 600
    $hWnd = GUICreate("Lagerliste", $iGUIWidth, $iGUIHeight)
    #region Datei
    $filemenu = GUICtrlCreateMenu("Datei")
    $connectitem = GUICtrlCreateMenuItem("Verbinden", $filemenu)
    $separator1 = GUICtrlCreateMenuItem("", $filemenu)
    $fileitem = GUICtrlCreateMenuItem("Öffnen...", $filemenu)
    $separator2 = GUICtrlCreateMenuItem("", $filemenu)
    $exititem = GUICtrlCreateMenuItem("Schließen", $filemenu)
    #endregion Datei
    #region Bearbeiten
    $editmenu = GUICtrlCreateMenu("Bearbeiten")
    $additem = GUICtrlCreateMenuItem("Hinzufügen", $editmenu)
    $delitem = GUICtrlCreateMenuItem("Löschen", $editmenu)
    #endregion Bearbeiten
    #region Hilfe
    $helpmenu = GUICtrlCreateMenu("?")
    $aboutitem = GUICtrlCreateMenuItem("Über", $helpmenu)
    #endregion Hilfe
    $refreshbutton = GUICtrlCreateButton("Aktualisieren", 10, 550, 70, 20)
    $cancelbutton = GUICtrlCreateButton("Cancel", 920, 550, 70, 20)
    GUISetState()
    _GDIPlus_Startup()
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics($iGUIWidth, $iGUIHeight, $hGraphic)
    $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    $hBitmap2 = _GDIPlus_BitmapCreateFromGraphics($iGUIWidth, $iGUIHeight, $hGraphic)
    $hBuffer2 = _GDIPlus_ImageGetGraphicsContext($hBitmap2)
    _GDIPlus_GraphicsSetSmoothingMode($hBuffer, 2)
    _GDIPlus_GraphicsSetSmoothingMode($hBuffer2, 2)
    Global $table = GUICtrlCreateListView("Artikel# |Beschreibung |Lagerstand |Preis",10,10,400,500)
    _GDIPlus_GraphicsDrawLine($hBuffer,410,300,1000,300)
    $outArtikel = GUICtrlCreateInput("1",430,320,30,20)
    $outbutton = GUICtrlCreateButton("- Abbuchen", 470, 320, 80, 20)
    $inArtikel =GUICtrlCreateInput("1",430,350,30,20)
    $inbutton = GUICtrlCreateButton("+ Aufbuchen", 470, 350, 80, 20)
    _refreshListView($table)
    While 1;Sleep(20)
    $msg = GUIGetMsg()
    ; Sleep(2000)
    ; MsgBox(0,"Debug",GUICtrlRead($table))
    ;Produktinformationen schreiben:
    Global $artikel = StringSplit(GUICtrlRead(GUICtrlRead($table)),"|")
    If GUICtrlRead($table) > 20 Then
    _GDIPlus_GraphicsClear($hBuffer2, 0xFFEEEEEE)
    $image=_GDIPlus_ImageLoadFromFile(@WorkingDir&"\Produktbilder\" & $artikel[1] &".jpg") ;Produktbild laden
    _GDIPlus_GraphicsDrawImageRect($hBuffer2,$image,0,0,350,600) ;Produktbild zeichnen
    _GDIPlus_GraphicsDrawString($hBuffer2,"Artikelnummer: " & $artikel[1],370,10,"Arial",22) ;Artikelnummer
    _GDIPlus_GraphicsDrawString($hBuffer2,"Beschreibung:" & @CRLF & " " &$artikel[2],370,50,"Arial",22) ;Beschreibung
    _GDIPlus_GraphicsDrawString($hBuffer2,"Lagerstand: " & $artikel[3] & " Stück",370,120,"Arial",22) ;Lagerstand
    _GDIPlus_GraphicsDrawString($hBuffer2,"Preis: " & $artikel[4] & " €",370,160,"Arial",22) ;Preis
    EndIf
    Select
    Case $msg = $GUI_EVENT_CLOSE Or $msg = $cancelbutton
    ;_disconnectSQL() ;nicht mehr benötigt, da nach jedem SQL-Befehl die Verbindung abgebaut wird
    ;If _disconnectSQL() == 0 Then
    ; MsgBox(0,"Status","Verbindung konnte nicht getrennt werden")
    ;EndIf
    ExitLoop
    Case $msg = $connectitem
    _connectSQL()
    If _connectSQL() == 0 Then
    if @error = 1 Then
    MsgBox(0,"Status","Error opening connection")
    ElseIf @error = 2 Then
    MsgBox(0,"Status","MySQL ODBC Driver not installed.")
    EndIf
    Else
    MsgBox(0,"Status","Verbindung wurde erfolgreich hergestellt!")
    EndIf
    Case $msg = $fileitem
    $file = FileOpenDialog("Datei auswählen...", @TempDir, "All (*.*)")
    Case $msg = $additem
    _addToDatabase()
    Case $msg = $delitem
    _delFromDatabase()
    Case $msg = $inbutton ;Artikel plus Eins
    _bucheArtikel(+1,$inArtikel)

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

    Case $msg = $outbutton ;Artikel minus Eins
    _connectSQL()
    $outArtikel = Number(GUICtrlRead($outArtikel))
    $query = "UPDATE produkte SET Lagerstand='"&$artikel[3]-$outArtikel&"' WHERE Artikelnummer='"&$artikel[1]&"';"
    If GUICtrlRead($table) > 20 Then
    _Query($sql, $query)
    MsgBox(0,"Debug","Wurde abgebucht")
    EndIf
    _refreshListView($table)
    Case $msg = $exititem
    ExitLoop
    Case $msg = $refreshbutton
    _refreshListView($table)
    Case $msg = $aboutitem
    MsgBox(0, "Über", "written by Palmers Julian 2012")
    EndSelect
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap2, 415,10,575,280)
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, $iGUIWidth, $iGUIHeight)
    WEnd
    GUIDelete()
    Exit
    EndFunc ;==>_Main
    Func _connectSQL()
    $sUsername = "bn"
    $sPassword = "******"
    $sDatabase = "lagerliste"
    $sServer = "localhost"
    $sql = _MySQLConnect($sUsername, $sPassword, $sDatabase, $sServer)
    If $sql <> 0 Then $sConnected = 1
    Return($sql)
    EndFunc
    Func _disconnectSQL()
    local $dis = _MySQLEnd($sql)
    If $dis <> 0 Then $sConnected = 0
    Return($dis)
    EndFunc
    Func _bucheArtikel($bucheRichtung,$bucheFeld)
    _connectSQL()
    $bucheFeld = Number(GUICtrlRead($bucheFeld))
    If GUICtrlRead($table) > 20 AND ($artikel[1]<>0 Or $artikel[2]<>0 Or $artikel[3]<>0 Or $artikel[4]<>0) Then
    $query = "UPDATE produkte SET Lagerstand='"&$artikel[3]+($bucheFeld*$bucheRichtung)&"' WHERE Artikelnummer='"&$artikel[1]&"';"
    _Query($sql, $query)
    _refreshListView($table)
    MsgBox(0,"Debug","Wurde gebucht")
    EndIf
    _disconnectSQL()
    EndFunc
    Func _refreshListView($listView)
    _GUICtrlListView_DeleteAllItems($listView)
    _connectSQL()
    $rCount = _CountRecords($sql, "produkte", "Artikelnummer", "")
    Global $rList[$rCount][4]
    $rArtikelnummer = _GetColVals($sql, "produkte", "Artikelnummer")
    $rBeschreibung = _GetColVals($sql, "produkte", "Beschreibung")
    $rLagerstand = _GetColVals($sql, "produkte", "Lagerstand")
    $rPreis = _GetColVals($sql, "produkte", "Preis")
    For $i=1 To $rCount Step +1
    $rList[$i-1][0] = $rArtikelnummer[$i]
    $rList[$i-1][1] = $rBeschreibung[$i]
    $rList[$i-1][2] = $rLagerstand[$i]
    $rList[$i-1][3] = $rPreis[$i]
    GUICtrlCreateListViewItem($rList[$i-1][0]&"|"&$rList[$i-1][1]&"|"&$rList[$i-1][2]&"|"&$rList[$i-1][3],$listView)
    Next
    _ArrayDisplay($rList) ;Debug
    _disconnectSQL()
    EndFunc
    Func _addToDatabase()
    $hAddWnd = GUICreate("Hinzufügen", 400, 170)
    GUISetState()
    GUICtrlCreateLabel("Artikelnummer:",10,10)
    $AddArtikelnummer = GUICtrlCreateInput("",100,8,100,20)
    GUICtrlCreateLabel("Beschreibung:",10,40)
    $AddBeschreibung = GUICtrlCreateInput("",100,38,290,20)
    GUICtrlCreateLabel("Lagermenge:",10,70)
    $AddMenge = GUICtrlCreateInput("",100,68,80,20)
    GUICtrlCreateLabel("Preis[€]:",10,100)
    $AddPreis = GUICtrlCreateInput("",100,98,80,20)
    $AddPlus = GUICtrlCreateButton("Hinzufügen", 10, 140, 80, 20)
    $AddClose = GUICtrlCreateButton("Abbrechen", 310, 140, 80, 20)
    While 1
    $msg1 = GUIGetMsg()
    Select
    Case $msg1 = $GUI_EVENT_CLOSE OR $msg1 = $AddClose
    GUIDelete()
    _refreshListView($table)
    ExitLoop
    Case $msg1 = $AddPlus
    $AddArtikelnummer = GUICtrlRead($AddArtikelnummer)
    $AddBeschreibung = GUICtrlRead($AddBeschreibung)
    $AddMenge = Number(GUICtrlRead($AddMenge))
    $AddPreis = Number(GUICtrlRead($AddPreis))
    ;Zu Datenbank hinzufügen
    If $AddArtikelnummer <> "" And $AddBeschreibung <> "" Then
    _connectSQL()
    _Query($sql, "USE lagerliste;")
    $query = "INSERT INTO produkte (Artikelnummer, Beschreibung, Lagerstand, Preis) VALUES ('"&$AddArtikelnummer&"','"&$AddBeschreibung&"',"&$AddMenge&","&$AddPreis&");"
    _Query($sql, $query)
    MsgBox(0,"Status","Artikel wurde angelegt!")
    GUIDelete()
    _disconnectSQL()
    _refreshListView($table)
    Else
    MsgBox(0,"Fehler","Artikelnummer, Beschreibung oder Preis fehlt!")
    GUIDelete()
    _addToDatabase()
    EndIf
    EndSelect
    WEnd
    EndFunc
    Func _delFromDatabase()
    $hDelWnd = GUICreate("Löschen", 400, 170)
    GUISetState()
    GUICtrlCreateLabel("Artikelnummer:",10,10)
    $AddArtikelnummer = GUICtrlCreateInput("",100,8,100,20)
    $DelMinus = GUICtrlCreateButton("Löschen", 10, 140, 80, 20)
    $DelClose = GUICtrlCreateButton("Abbrechen", 310, 140, 80, 20)
    While 1
    $msg2 = GUIGetMsg()
    Select
    Case $msg2 = $GUI_EVENT_CLOSE OR $msg2 = $DelClose
    GUIDelete()
    _refreshListView($table)
    ExitLoop
    Case $msg2 = $DelMinus
    $AddArtikelnummer = GUICtrlRead($AddArtikelnummer)
    ;Von Datenbank löschen
    If $AddArtikelnummer <> "" Then
    _connectSQL()
    _Query($sql, "USE lagerliste;")
    $query = "DELETE FROM produkte WHERE Artikelnummer='"&$AddArtikelnummer&"';"
    _Query($sql, $query)
    MsgBox(0,"Status","Artikel wurde gelöscht!")
    Else
    MsgBox(0,"Fehler","Zu löschende Artikelnummer eingeben!")
    EndIf
    EndSelect
    WEnd
    EndFunc

    [/autoit]

    Einmal editiert, zuletzt von palmers7 (21. Dezember 2012 um 11:44)

  • Also, nach bisl nachforschen:

    die Funktion:

    Spoiler anzeigen
    [autoit]

    Func _addToDatabase()
    $hAddWnd = GUICreate("Hinzufügen", 400, 170)
    GUISetState()
    GUICtrlCreateLabel("Artikelnummer:",10,10)
    $AddArtikelnummer = GUICtrlCreateInput("",100,8,100,20)
    GUICtrlCreateLabel("Beschreibung:",10,40)
    $AddBeschreibung = GUICtrlCreateInput("",100,38,290,20)
    GUICtrlCreateLabel("Lagermenge:",10,70)
    $AddMenge = GUICtrlCreateInput("",100,68,80,20)
    GUICtrlCreateLabel("Preis[€]:",10,100)
    $AddPreis = GUICtrlCreateInput("",100,98,80,20)
    $AddPlus = GUICtrlCreateButton("Hinzufügen", 10, 140, 80, 20)
    $AddClose = GUICtrlCreateButton("Abbrechen", 310, 140, 80, 20)
    While 1
    $msg1 = GUIGetMsg()
    Select
    Case $msg1 = $GUI_EVENT_CLOSE OR $msg1 = $AddClose
    GUIDelete()
    _refreshListView($table)
    ExitLoop
    Case $msg1 = $AddPlus
    $AddArtikelnummer = GUICtrlRead($AddArtikelnummer)
    $AddBeschreibung = GUICtrlRead($AddBeschreibung)
    $AddMenge = Number(GUICtrlRead($AddMenge))
    $AddPreis = Number(GUICtrlRead($AddPreis))
    ;Zu Datenbank hinzufügen
    If $AddArtikelnummer <> "" And $AddBeschreibung <> "" Then
    _connectSQL()
    _Query($sql, "USE lagerliste;")
    $query = "INSERT INTO produkte (Artikelnummer, Beschreibung, Lagerstand, Preis) VALUES ('"&$AddArtikelnummer&"','"&$AddBeschreibung&"',"&$AddMenge&","&$AddPreis&");"
    _Query($sql, $query)
    MsgBox(0,"Status","Artikel wurde angelegt!")
    GUIDelete()
    _disconnectSQL()
    _refreshListView($table)
    Else
    MsgBox(0,"Fehler","Artikelnummer, Beschreibung oder Preis fehlt!")
    GUIDelete()
    _addToDatabase()
    EndIf
    EndSelect
    WEnd
    EndFunc

    [/autoit]

    und hier der aufruf:

    Spoiler anzeigen
    [autoit]

    While 1;Sleep(20)
    $msg = GUIGetMsg()
    ; Sleep(2000)
    ; MsgBox(0,"Debug",GUICtrlRead($table))
    ;Produktinformationen schreiben:
    Global $artikel = StringSplit(GUICtrlRead(GUICtrlRead($table)),"|")
    If GUICtrlRead($table) > 20 Then
    _GDIPlus_GraphicsClear($hBuffer2, 0xFFEEEEEE)
    $image=_GDIPlus_ImageLoadFromFile(@WorkingDir&"\Produktbilder\" & $artikel[1] &".jpg") ;Produktbild laden
    _GDIPlus_GraphicsDrawImageRect($hBuffer2,$image,0,0,350,600) ;Produktbild zeichnen
    _GDIPlus_GraphicsDrawString($hBuffer2,"Artikelnummer: " & $artikel[1],370,10,"Arial",22) ;Artikelnummer
    _GDIPlus_GraphicsDrawString($hBuffer2,"Beschreibung:" & @CRLF & " " &$artikel[2],370,50,"Arial",22) ;Beschreibung
    _GDIPlus_GraphicsDrawString($hBuffer2,"Lagerstand: " & $artikel[3] & " Stück",370,120,"Arial",22) ;Lagerstand
    _GDIPlus_GraphicsDrawString($hBuffer2,"Preis: " & $artikel[4] & " €",370,160,"Arial",22) ;Preis
    EndIf
    Select
    Case $msg = $GUI_EVENT_CLOSE Or $msg = $cancelbutton
    ;_disconnectSQL() ;nicht mehr benötigt, da nach jedem SQL-Befehl die Verbindung abgebaut wird
    ;If _disconnectSQL() == 0 Then
    ; MsgBox(0,"Status","Verbindung konnte nicht getrennt werden")
    ;EndIf
    ExitLoop
    Case $msg = $additem
    _addToDatabase()
    MsgBox(0,"Debug","kommt es noch hier her?")

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

    EndSelect
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap2, 415,10,575,280)
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, $iGUIWidth, $iGUIHeight)
    WEnd

    [/autoit]

    also die Funktion wird aufgerufen (erfolgreich), aber das Exitloop zur ersten While zurück geht nicht!

    EDIT: Ich Schlaukopf denk mir noch, das Exitloop geht nicht, daweil fehlts mir bei allen Buttens wo der Fehler auftaucht!

  • Also, nach bisl nachforschen:

    die Funktion:
    ...
    und hier der aufruf:
    ...
    also die Funktion wird aufgerufen (erfolgreich), aber das Exitloop zur ersten While zurück geht nicht!


    In Deiner Func _addToDatabase() sehe ich nur in Zeile 20 einen Ausstieg (sonst nirgends). Für $AddPlus sehe ich aber keine Anweisung, was sie nach _refreshListView($table) machen soll - darum springt sie nach dem EndSelect wieder rauf zum Anfang der While-Schleife.