1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. Code-Jack

Beiträge von Code-Jack

  • Forum Problemsammlung

    • Code-Jack
    • 8. Juni 2016 um 00:19

    Hmm, nicht ganz verstanden, ich mache sicherheitshalber mal 'nen Test.
    Hierbei verwende ich nur die "Code"-Tags.

    Oben eingefügt habe ich die drei Zeilen aus Posting 64, um zu testen, ob die Linefeeds verschwinden (Dein Hinweis aus Posting 65).
    Dann folgt ein längerer Codeschnippsel, um zu sehen, ob der Code automatisch verkürzt wird.


    C: Dieses ist nur ein Test.
    ; Codezeile 1
    ; Codezeile 2
    ; Codezeile 3
    #Region Header #################################################################################################################\
    Global Const $sProgrammname = "Inputboxen verschieben"
    
    
    #include <Date.au3>
    #include <GUIConstantsEx.au3>
    #include <GuiListView.au3>
    #include <GuiStatusBar.au3>
    #include <GUIConstantsEx.au3>
    #include <ComboConstants.au3>
    #include <GuiListView.au3>
    #include <String.au3>
    #include <StaticConstants.au3>   ;Erweiterte Einstellungen für Labels
    #include <EditConstants.au3>      ;Test
    #include <Array.au3>              ;Test
    #include <GDIPlus.au3>
    #include <EditConstants.au3>
    #include <WindowsConstants.au3>
    #Include <Misc.au3>
    #include <WindowsConstants.au3>
    #include <WinAPI.au3>
    
    
    _GDIPlus_Startup()
    #EndRegion Header ##############################################################################################################/
    
    
    #Region Constanten & Variablen deklarieren und belegen #########################################################################\
    ; --- Globale Variablen deklarieren ---------------------------------------------------------------------------------------\
    Opt("MustDeclareVars", 1) ;Zwingt den Programmierer, Variablen ordentlich zu deklarieren, vor der ersten Benutzung.
    Global $FormKombiansicht, $MenuItem
    Global $sTmp, $sText, $i
    Global $sListViewHeader, $iDBFeldanzahl
    Global $hGUI, $aMousePos
    Global $sUserMessageOld, $sUserMessageNew
    Global $bGUIRedesign
    Global $iDoItOnlyOnce = 0
    
    
    Opt("MouseCoordMode", 0)
    Global $iPressed = 0, $iLastCtrlID = -1
    $iDBFeldanzahl = 30  ;So viele Felder gibt es in der Datenbank
    ; --- Globale Variablen deklarieren ---------------------------------------------------------------------------------------/
    
    
    #EndRegion Constanten & Variablen deklarieren und belegen ######################################################################/
    
    
    #Region Bedienoberfläche zeichnen ##############################################################################################\
    ; --- Fenster & Menü erzeugen-----------------------------------------------------------\
    Global $FormKombiansicht = GUICreate($sProgrammname, 1200, 768, 10, 10)  ;Das Hauptfenster erzeugen.
    GUICtrlCreatePic(@ScriptDir & '\Example Images\background.jpg', 0, 0, 1200, 768)
    
    
    ; --- Menüzweig 1
    Global $MenuA = GUICtrlCreateMenu("Datei")
    Global $MenuItemAExit = GUICtrlCreateMenuItem("Schließen", $MenuA)
    
    
    ; --- Menüzweig 2
    Global $MenuB = GUICtrlCreateMenu("Einstellungen")
    Global $MenuItemOptionen = GUICtrlCreateMenuItem("Maske umgestalten", $MenuB)
    
    
    ; --- Menüzweig 3
    Global $MenuC = GUICtrlCreateMenu("?")
    Global $MenuItemCProgramminfo = GUICtrlCreateMenuItem("Programminfo", $MenuC)
    Global $MenuItemCHistory = GUICtrlCreateMenuItem("History && Danksagung", $MenuC)
    
    
    GUISetState(@SW_SHOW)   ;??? Was macht dieser Befehl?
    ; --- Fenster & Menü erzeugen-----------------------------------------------------------/
    
    
    Global $aHandleGUIElement[$iDBFeldanzahl + 1]
    Global $asGUI_Element[22]     ;Array mit 30 elementen - so viele GUI-Elemente gibt es.
    
    
    ; --- GUI-Parameter der Input-Boxen und deren Labels ------------------------------------------------------------\
    ;                       1   2   3  4 5      6 7        8 9   10 11  12  1314     1516 17
    $asGUI_Element[0]  = "Inputbox| 15|320|100| 22|L|0x0000|0|Zeile 0    |U|   0| 0|110| 22|L|0x0000|0|Datensatz-ID"
    $asGUI_Element[1]  = "Inputbox|150|375|100| 22|L|0x0000|0|Zeile 1    |R|  -5| 0|110| 22|L|0x0000|0|Annahmedatum"
    $asGUI_Element[2]  = "Inputbox|150|400|100| 22|L|0x0000|0|Zeile 2    |R|  -5| 0|110| 22|R|0x0000|0|Abholdatum"
    $asGUI_Element[3]  = "Inputbox|390|375|200| 22|L|0x0000|0|Zeile 3    |O|  -5| 0|110| 22|R|0x0000|0|Gerät"
    $asGUI_Element[4]  = "Inputbox|390|400|200| 22|L|0x0000|0|Zeile 4    |U|   0| 0|110| 22|R|0x0000|0|Schadenskürzel"
    $asGUI_Element[5]  = "Inputbox|150|495|100| 22|L|0x0000|0|Zeile 5    |L|  -5| 0|110| 22|R|0x0000|0|Firma"
    $asGUI_Element[6]  = "Inputbox|150|520|100| 22|L|0x0000|0|Zeile 6    |L|  -5| 0|110| 22|R|0x0000|0|Vorname"
    $asGUI_Element[7]  = "Inputbox|150|545|100| 22|L|0x0000|0|Zeile 7    |L|  -5| 0|110| 22|R|0x0000|0|Nachname"
    $asGUI_Element[8]  = "Inputbox|450|550|100| 22|R|0x0000|0|Zeile 8    |L|  -5| 0|110| 22|R|0x0000|0|Endpreis"
    $asGUI_Element[9]  = "Inputbox|450|575|100| 22|R|0x0000|0|Zeile 9    |L|  -5| 0|110| 22|R|0x0000|0|Re-Nr."
    $asGUI_Element[10] = "Inputbox|450|450|100| 22|R|0x0000|0|Zeile 10   |L|  -5| 0|110| 22|R|0x0000|0|Anzahlung"
    $asGUI_Element[11] = "Inputbox|450|475|100| 22|L|0x0000|0|Zeile 11   |L|  -5| 0|110| 22|R|0x0000|0|Leihteile"
    $asGUI_Element[12] = "Inputbox|450|500|100| 22|R|0x0000|0|Zeile 12   |L|  -5| 0|110| 22|R|0x0000|0|Voranschlag"
    $asGUI_Element[13] = "Inputbox|140|320|100| 22|L|0x0000|0|Zeile 13   |U|   0| 0| 85| 22|L|0x0000|0|Rekla"
    $asGUI_Element[14] = "Inputbox|270|320|500| 22|L|0x0000|0|Zeile 14   |U|   0| 0|130| 22|L|0x0000|0|Projektordner"
    $asGUI_Element[15] = "Inputbox|750|475|100| 22|L|0x0000|0|Zeile 15   |L|  -5| 0|110| 22|R|0x0000|0|Gesprächsnotiz"
    $asGUI_Element[16] = "Inputbox|750|350|100| 22|L|0x0000|0|Zeile 16   |L|  -5| 0|120| 22|R|0x0000|0|Reparaturbericht"
    $asGUI_Element[17] = "Inputbox|750|375|100| 22|L|0x0000|0|Zeile 17   |L|  -5| 0|110| 22|R|0x0000|0|Festnetz"
    $asGUI_Element[18] = "Inputbox|750|400|100| 22|L|0x0000|0|Zeile 18   |L|  -5| 0|110| 22|R|0x0000|0|Mobil-Nr."
    $asGUI_Element[19] = "Inputbox|750|425|100| 22|L|0x0000|0|Zeile 19   |L|  -5| 0|110| 22|R|0x0000|0|E-Mail"
    $asGUI_Element[20] = "Inputbox|750|450|100| 22|L|0x0000|0|Zeile 20   |L|  -5| 0|110| 22|R|0x0000|0|Status"
    $asGUI_Element[21] = "Inputbox|270| 10|250| 22|L|0x0000|0|Zeile 21   |L|   0| 0| 70| 22|R|0x0000|0|Suche:"
    ; --- GUI-Parameter der Input-Boxen und deren Labels ------------------------------------------------------------/
    
    
    ; --- Input-Boxen (und Labels) für Datenbankfelder --------------------------------------------------------------\
    Global $avGUI_Parameter[19]  ;Anzahl der Parameter eines Parametersatzes.
    Global $sF_Obj
    Global $iX_Obj, $iY_Obj, $iW_Obj, $iH_Obj, $hE_Obj, $sT_Obj
    
    
    For $iGUI_ElementNr = 0 to Ubound($asGUI_Element)-1  ;30 Zeilen
      ; --- Pro Schleifendurchlauf die Parameter je eines GUI-Elements auslesen --------------------------------\
      $avGUI_Parameter=Stringsplit($asGUI_Element[$iGUI_ElementNr], "|")    ;Aufgesplittete Parameter
    
    
      $sF_Obj = StringStripWS ($avGUI_Parameter[1], 3)    ;Funktion des Objektes (von Leerzeichen links und Rechts befreit)
    
    
      $iX_Obj = $avGUI_Parameter[2]            ;X-Position des Objektes
      $iY_Obj = $avGUI_Parameter[3]            ;Y-Position des Objektes
      $iW_Obj = $avGUI_Parameter[4]            ;Weite des Objektes
      $iH_Obj = $avGUI_Parameter[5]            ;Höhe des Objektes
      $hE_Obj = $avGUI_Parameter[6]            ;Erweiterte Parameter, siehe AutoIt Help: GUICtrlCreateLabel, bzw. GUI Control Styles
      $sT_Obj = $avGUI_Parameter[9]            ;Textvorbelegung (wenn Inputbox)
     ; --- Pro Schleifendurchlauf die Parameter je eines GUI-Elements auslesen --------------------------------/
    
    
      if $sF_Obj="Inputbox" then
        $aHandleGUIElement[$iGUI_ElementNr] = GUICtrlCreateInput($sT_Obj, $iX_Obj, $iY_Obj, $iW_Obj, $iH_Obj, $hE_Obj, 0)   ;Inputbox
      EndIf
    
    
    Next
    ; --- Input-Boxen (und Labels) für Datenbankfelder --------------------------------------------------------------/
    #EndRegion Bedienoberfläche zeichnen ###########################################################################################/
    
    
    ; --- Statusbar am untersten Fensterrand ----------------------------------------------------------------------------------\
    Global $idStatusbar = _GUICtrlStatusBar_Create($FormKombiansicht)
    
    
    GUISetState(@SW_SHOW)
    
    
    Global $idStatusbar_PartsWidth[4]
    $idStatusbar_PartsWidth[0]=700
    $idStatusbar_PartsWidth[1]=$idStatusbar_PartsWidth[0]+180
    $idStatusbar_PartsWidth[2]=$idStatusbar_PartsWidth[1]+150
    $idStatusbar_PartsWidth[3]=-1 ;$idStatusbar_PartsWidth[2]+200
    
    
    _GUICtrlStatusBar_SetParts($idStatusbar, $idStatusbar_PartsWidth) ;200, 400, 700, -1) ;$idStatusbar_PartsWidth)
    Global $sMausXY
    _GUICtrlStatusBar_SetText($idStatusbar, $sMausXY, 0)
    _GUICtrlStatusBar_SetText($idStatusbar, " ", 1)
    
    
    _GUICtrlStatusBar_SetMinHeight($idStatusbar, 20)  ;!!!
    ; --- Statusbar am untersten Fensterrand ----------------------------------------------------------------------------------/
    
    
    #Region Hauptschleife ##########################################################################################################\
    $hGUI = $FormKombiansicht
    Global Const $SC_DRAGMOVE = 0xF012
    Global $iMouseButtonLeft
    Global $aRect[4]
    AutoItSetOption ("MouseCoordMode", 2 )  ;Mauskoordinaten sollen sich auf den Bereich unterhalb der Menüleiste beziehen.
    
    
    While True
    
    
      ; --- Mauskoordinaten erfassen und darstellen -------------------------------------\
      $sMausXY=MouseGetPos()
      _GUICtrlStatusBar_SetText($idStatusbar, $sMausXY[0] & " / " & $sMausXY[1], 0)
      ; --- Mauskoordinaten erfassen und darstellen -------------------------------------/
    
    
      Switch GUIGetMsg()
    
    
      Case -3
        _Exit()
    
    
      Case $MenuItemAExit
        _Exit()
    
    
      Case $MenuItemOptionen
        Optionen()
    
    
      Case $GUI_EVENT_PRIMARYDOWN                                      ;Test
        ConsoleWrite("Linker Mausbutton gedrückt" & @CRLF)
        $iMouseButtonLeft = 1
    
    
      Case $GUI_EVENT_PRIMARYUP                                      ;Test
        ConsoleWrite("Linker Mausbutton losgel." & @CRLF)
        $iMouseButtonLeft = 0
    
    
      Case $GUI_EVENT_SECONDARYDOWN                                      ;Test
        ConsoleWrite("Rechtsklick" & @CRLF)
    
    
      EndSwitch
    
    
      ; --- Verhindern, dass sich während des Verschiebens ein anderes GUI-Element angesprochen fühlt -----\
      if $iMouseButtonLeft then  ;$sMausXY[2] = 1 then
        $iDoItOnlyOnce += 1
        if $iDoItOnlyOnce > 2 Then  ;Integer-Überlauf verhindern.
          $iDoItOnlyOnce =2
        EndIf
      Else
        $iDoItOnlyOnce = 0
      EndIf
      ; --- Verhindern, dass sich während des Verschiebens ein anderes GUI-Element angesprochen fühlt -----/
    
    
      if $bGUIRedesign=1 then   ;Im Menü wurde der Eintrag zum Umgestalten des GUI aktiviert.
        GUI_Redesign()
      EndIf
    
    
    WEnd
    #EndRegion Hauptschleife #######################################################################################################/
    
    
    ; ### Functions ################################################################################################################\
    Func Optionen()
      $bGUIRedesign = BitXOR($bGUIRedesign, 0x1)  ;Binärwert von $bGUIRedesign toggeln.
      if $bGUIRedesign=1 then   ;Im Menü wurde der Eintrag zum Umgestalten des GUI aktiviert.
        MsgBox(0, "", "" _
        & "Sie können nun einzelne Bedienelemente" _
        & @CRLF & "mit der Maus verschieben." _
        & @CRLF & "Zum Beenden diesen Menüeintrag erneut anwählen!")
      EndIf
    EndFunc
    ; #############################################################################
    FUNC GUI_Redesign()  ; Ermöglicht es, ein einzelnes GUI-Element mit der Maus zu verschieben.
    
    
    $sUserMessageNew=""
    
    
      ; --- Ermitteln, über welchem GUI-Element der Hauszeiger hoovert. ---------------\
      ;if $iDoItOnlyOnce = 1 then
        For $iGUI_ElementNr = 0 to Ubound($asGUI_Element)-1
          $avGUI_Parameter=Stringsplit($asGUI_Element[$iGUI_ElementNr], "|")    ;Aufgesplittete Parameter
          if $sMausXY[0] > $avGUI_Parameter[2] and $sMausXY[0] < ($avGUI_Parameter[2]+$avGUI_Parameter[4]) and $sMausXY[1] > $avGUI_Parameter[3] and $sMausXY[1] < ($avGUI_Parameter[3]+$avGUI_Parameter[5])then
            $sUserMessageNew="Feld-Nr. " & $iGUI_ElementNr
            ExitLoop
          EndIf
        Next
      ;EndIf
      ; --- Ermitteln, über welchem GUI-Element der Hauszeiger hoovert. ---------------/
    
    
      if $sUserMessageNew <> $sUserMessageOld then
        _GUICtrlStatusBar_SetText($idStatusbar, $sUserMessageNew, 1)
        $sUserMessageOld=$sUserMessageNew
      EndIf
    
    
      if $iMouseButtonLeft then  ;$sMausXY[2] = 1 then
        GUICtrlSetPos($aHandleGUIElement[$iGUI_ElementNr], $sMausXY[0], $sMausXY[1])
      EndIf
    
    
    EndFunc ;GUI_Redesign
    ; #############################################################################
    Func _Exit() ;Datenbank schließen und Programmende.
      _GDIPlus_ShutDown()
      Exit
    EndFunc   ;==>_Exit
    ; ### Functions ################################################################################################################/
    Alles anzeigen
  • Koordinaten einer InputBox auslesen

    • Code-Jack
    • 7. Juni 2016 um 23:59

    Eingedampft auf 237 Zeilen:

    Code
    #Region Header #################################################################################################################\
    Global Const $sProgrammname = "Inputboxen verschieben"
    
    
    #include <Date.au3>
    #include <GUIConstantsEx.au3>
    #include <GuiListView.au3>
    #include <GuiStatusBar.au3>
    #include <GUIConstantsEx.au3>
    #include <ComboConstants.au3>
    #include <GuiListView.au3>
    #include <String.au3>
    #include <StaticConstants.au3>   ;Erweiterte Einstellungen für Labels
    #include <EditConstants.au3>      ;Test
    #include <Array.au3>              ;Test
    #include <GDIPlus.au3>
    #include <EditConstants.au3>
    #include <WindowsConstants.au3>
    #Include <Misc.au3>
    #include <WindowsConstants.au3>
    #include <WinAPI.au3>
    
    
    _GDIPlus_Startup()
    #EndRegion Header ##############################################################################################################/
    
    
    #Region Constanten & Variablen deklarieren und belegen #########################################################################\
    ; --- Globale Variablen deklarieren ---------------------------------------------------------------------------------------\
    Opt("MustDeclareVars", 1) ;Zwingt den Programmierer, Variablen ordentlich zu deklarieren, vor der ersten Benutzung.
    Global $FormKombiansicht, $MenuItem
    Global $sTmp, $sText, $i
    Global $sListViewHeader, $iDBFeldanzahl
    Global $hGUI, $aMousePos
    Global $sUserMessageOld, $sUserMessageNew
    Global $bGUIRedesign
    Global $iDoItOnlyOnce = 0
    
    
    Opt("MouseCoordMode", 0)
    Global $iPressed = 0, $iLastCtrlID = -1
    $iDBFeldanzahl = 30  ;So viele Felder gibt es in der Datenbank
    ; --- Globale Variablen deklarieren ---------------------------------------------------------------------------------------/
    
    
    #EndRegion Constanten & Variablen deklarieren und belegen ######################################################################/
    
    
    #Region Bedienoberfläche zeichnen ##############################################################################################\
    ; --- Fenster & Menü erzeugen-----------------------------------------------------------\
    Global $FormKombiansicht = GUICreate($sProgrammname, 1200, 768, 10, 10)  ;Das Hauptfenster erzeugen.
    GUICtrlCreatePic(@ScriptDir & '\Example Images\background.jpg', 0, 0, 1200, 768)
    
    
    ; --- Menüzweig 1
    Global $MenuA = GUICtrlCreateMenu("Datei")
    Global $MenuItemAExit = GUICtrlCreateMenuItem("Schließen", $MenuA)
    
    
    ; --- Menüzweig 2
    Global $MenuB = GUICtrlCreateMenu("Einstellungen")
    Global $MenuItemOptionen = GUICtrlCreateMenuItem("Maske umgestalten", $MenuB)
    
    
    ; --- Menüzweig 3
    Global $MenuC = GUICtrlCreateMenu("?")
    Global $MenuItemCProgramminfo = GUICtrlCreateMenuItem("Programminfo", $MenuC)
    Global $MenuItemCHistory = GUICtrlCreateMenuItem("History && Danksagung", $MenuC)
    
    
    GUISetState(@SW_SHOW)   ;??? Was macht dieser Befehl?
    ; --- Fenster & Menü erzeugen-----------------------------------------------------------/
    
    
    Global $aHandleGUIElement[$iDBFeldanzahl + 1]
    Global $asGUI_Element[22]     ;Array mit 30 elementen - so viele GUI-Elemente gibt es.
    
    
    ; --- GUI-Parameter der Input-Boxen und deren Labels ------------------------------------------------------------\
    ;                       1   2   3  4 5      6 7        8 9   10 11  12  1314     1516 17
    $asGUI_Element[0]  = "Inputbox| 15|320|100| 22|L|0x0000|0|Zeile 0    |U|   0| 0|110| 22|L|0x0000|0|Datensatz-ID"
    $asGUI_Element[1]  = "Inputbox|150|375|100| 22|L|0x0000|0|Zeile 1    |R|  -5| 0|110| 22|L|0x0000|0|Annahmedatum"
    $asGUI_Element[2]  = "Inputbox|150|400|100| 22|L|0x0000|0|Zeile 2    |R|  -5| 0|110| 22|R|0x0000|0|Abholdatum"
    $asGUI_Element[3]  = "Inputbox|390|375|200| 22|L|0x0000|0|Zeile 3    |O|  -5| 0|110| 22|R|0x0000|0|Gerät"
    $asGUI_Element[4]  = "Inputbox|390|400|200| 22|L|0x0000|0|Zeile 4    |U|   0| 0|110| 22|R|0x0000|0|Schadenskürzel"
    $asGUI_Element[5]  = "Inputbox|150|495|100| 22|L|0x0000|0|Zeile 5    |L|  -5| 0|110| 22|R|0x0000|0|Firma"
    $asGUI_Element[6]  = "Inputbox|150|520|100| 22|L|0x0000|0|Zeile 6    |L|  -5| 0|110| 22|R|0x0000|0|Vorname"
    $asGUI_Element[7]  = "Inputbox|150|545|100| 22|L|0x0000|0|Zeile 7    |L|  -5| 0|110| 22|R|0x0000|0|Nachname"
    $asGUI_Element[8]  = "Inputbox|450|550|100| 22|R|0x0000|0|Zeile 8    |L|  -5| 0|110| 22|R|0x0000|0|Endpreis"
    $asGUI_Element[9]  = "Inputbox|450|575|100| 22|R|0x0000|0|Zeile 9    |L|  -5| 0|110| 22|R|0x0000|0|Re-Nr."
    $asGUI_Element[10] = "Inputbox|450|450|100| 22|R|0x0000|0|Zeile 10   |L|  -5| 0|110| 22|R|0x0000|0|Anzahlung"
    $asGUI_Element[11] = "Inputbox|450|475|100| 22|L|0x0000|0|Zeile 11   |L|  -5| 0|110| 22|R|0x0000|0|Leihteile"
    $asGUI_Element[12] = "Inputbox|450|500|100| 22|R|0x0000|0|Zeile 12   |L|  -5| 0|110| 22|R|0x0000|0|Voranschlag"
    $asGUI_Element[13] = "Inputbox|140|320|100| 22|L|0x0000|0|Zeile 13   |U|   0| 0| 85| 22|L|0x0000|0|Rekla"
    $asGUI_Element[14] = "Inputbox|270|320|500| 22|L|0x0000|0|Zeile 14   |U|   0| 0|130| 22|L|0x0000|0|Projektordner"
    $asGUI_Element[15] = "Inputbox|750|475|100| 22|L|0x0000|0|Zeile 15   |L|  -5| 0|110| 22|R|0x0000|0|Gesprächsnotiz"
    $asGUI_Element[16] = "Inputbox|750|350|100| 22|L|0x0000|0|Zeile 16   |L|  -5| 0|120| 22|R|0x0000|0|Reparaturbericht"
    $asGUI_Element[17] = "Inputbox|750|375|100| 22|L|0x0000|0|Zeile 17   |L|  -5| 0|110| 22|R|0x0000|0|Festnetz"
    $asGUI_Element[18] = "Inputbox|750|400|100| 22|L|0x0000|0|Zeile 18   |L|  -5| 0|110| 22|R|0x0000|0|Mobil-Nr."
    $asGUI_Element[19] = "Inputbox|750|425|100| 22|L|0x0000|0|Zeile 19   |L|  -5| 0|110| 22|R|0x0000|0|E-Mail"
    $asGUI_Element[20] = "Inputbox|750|450|100| 22|L|0x0000|0|Zeile 20   |L|  -5| 0|110| 22|R|0x0000|0|Status"
    $asGUI_Element[21] = "Inputbox|270| 10|250| 22|L|0x0000|0|Zeile 21   |L|   0| 0| 70| 22|R|0x0000|0|Suche:"
    ; --- GUI-Parameter der Input-Boxen und deren Labels ------------------------------------------------------------/
    
    
    ; --- Input-Boxen (und Labels) für Datenbankfelder --------------------------------------------------------------\
    Global $avGUI_Parameter[19]  ;Anzahl der Parameter eines Parametersatzes.
    Global $sF_Obj
    Global $iX_Obj, $iY_Obj, $iW_Obj, $iH_Obj, $hE_Obj, $sT_Obj
    
    
    For $iGUI_ElementNr = 0 to Ubound($asGUI_Element)-1  ;30 Zeilen
      ; --- Pro Schleifendurchlauf die Parameter je eines GUI-Elements auslesen --------------------------------\
      $avGUI_Parameter=Stringsplit($asGUI_Element[$iGUI_ElementNr], "|")    ;Aufgesplittete Parameter
    
    
      $sF_Obj = StringStripWS ($avGUI_Parameter[1], 3)    ;Funktion des Objektes (von Leerzeichen links und Rechts befreit)
    
    
      $iX_Obj = $avGUI_Parameter[2]            ;X-Position des Objektes
      $iY_Obj = $avGUI_Parameter[3]            ;Y-Position des Objektes
      $iW_Obj = $avGUI_Parameter[4]            ;Weite des Objektes
      $iH_Obj = $avGUI_Parameter[5]            ;Höhe des Objektes
      $hE_Obj = $avGUI_Parameter[6]            ;Erweiterte Parameter, siehe AutoIt Help: GUICtrlCreateLabel, bzw. GUI Control Styles
      $sT_Obj = $avGUI_Parameter[9]            ;Textvorbelegung (wenn Inputbox)
     ; --- Pro Schleifendurchlauf die Parameter je eines GUI-Elements auslesen --------------------------------/
    
    
      if $sF_Obj="Inputbox" then
        $aHandleGUIElement[$iGUI_ElementNr] = GUICtrlCreateInput($sT_Obj, $iX_Obj, $iY_Obj, $iW_Obj, $iH_Obj, $hE_Obj, 0)   ;Inputbox
      EndIf
    
    
    Next
    ; --- Input-Boxen (und Labels) für Datenbankfelder --------------------------------------------------------------/
    #EndRegion Bedienoberfläche zeichnen ###########################################################################################/
    
    
    ; --- Statusbar am untersten Fensterrand ----------------------------------------------------------------------------------\
    Global $idStatusbar = _GUICtrlStatusBar_Create($FormKombiansicht)
    
    
    GUISetState(@SW_SHOW)
    
    
    Global $idStatusbar_PartsWidth[4]
    $idStatusbar_PartsWidth[0]=700
    $idStatusbar_PartsWidth[1]=$idStatusbar_PartsWidth[0]+180
    $idStatusbar_PartsWidth[2]=$idStatusbar_PartsWidth[1]+150
    $idStatusbar_PartsWidth[3]=-1 ;$idStatusbar_PartsWidth[2]+200
    
    
    _GUICtrlStatusBar_SetParts($idStatusbar, $idStatusbar_PartsWidth) ;200, 400, 700, -1) ;$idStatusbar_PartsWidth)
    Global $sMausXY
    _GUICtrlStatusBar_SetText($idStatusbar, $sMausXY, 0)
    _GUICtrlStatusBar_SetText($idStatusbar, " ", 1)
    
    
    _GUICtrlStatusBar_SetMinHeight($idStatusbar, 20)  ;!!!
    ; --- Statusbar am untersten Fensterrand ----------------------------------------------------------------------------------/
    
    
    #Region Hauptschleife ##########################################################################################################\
    $hGUI = $FormKombiansicht
    Global Const $SC_DRAGMOVE = 0xF012
    Global $iMouseButtonLeft
    Global $aRect[4]
    AutoItSetOption ("MouseCoordMode", 2 )  ;Mauskoordinaten sollen sich auf den Bereich unterhalb der Menüleiste beziehen.
    
    
    While True
    
    
      ; --- Mauskoordinaten erfassen und darstellen -------------------------------------\
      $sMausXY=MouseGetPos()
      _GUICtrlStatusBar_SetText($idStatusbar, $sMausXY[0] & " / " & $sMausXY[1], 0)
      ; --- Mauskoordinaten erfassen und darstellen -------------------------------------/
    
    
      Switch GUIGetMsg()
    
    
      Case -3
        _Exit()
    
    
      Case $MenuItemAExit
        _Exit()
    
    
      Case $MenuItemOptionen
        Optionen()
    
    
      Case $GUI_EVENT_PRIMARYDOWN                                      ;Test
        ConsoleWrite("Linker Mausbutton gedrückt" & @CRLF)
        $iMouseButtonLeft = 1
    
    
      Case $GUI_EVENT_PRIMARYUP                                      ;Test
        ConsoleWrite("Linker Mausbutton losgel." & @CRLF)
        $iMouseButtonLeft = 0
    
    
      Case $GUI_EVENT_SECONDARYDOWN                                      ;Test
        ConsoleWrite("Rechtsklick" & @CRLF)
    
    
      EndSwitch
    
    
      ; --- Verhindern, dass sich während des Verschiebens ein anderes GUI-Element angesprochen fühlt -----\
      if $iMouseButtonLeft then  ;$sMausXY[2] = 1 then
        $iDoItOnlyOnce += 1
        if $iDoItOnlyOnce > 2 Then  ;Integer-Überlauf verhindern.
          $iDoItOnlyOnce =2
        EndIf
      Else
        $iDoItOnlyOnce = 0
      EndIf
      ; --- Verhindern, dass sich während des Verschiebens ein anderes GUI-Element angesprochen fühlt -----/
    
    
      if $bGUIRedesign=1 then   ;Im Menü wurde der Eintrag zum Umgestalten des GUI aktiviert.
        GUI_Redesign()
      EndIf
    
    
    WEnd
    #EndRegion Hauptschleife #######################################################################################################/
    
    
    ; ### Functions ################################################################################################################\
    Func Optionen()
      $bGUIRedesign = BitXOR($bGUIRedesign, 0x1)  ;Binärwert von $bGUIRedesign toggeln.
      if $bGUIRedesign=1 then   ;Im Menü wurde der Eintrag zum Umgestalten des GUI aktiviert.
        MsgBox(0, "", "" _
        & "Sie können nun einzelne Bedienelemente" _
        & @CRLF & "mit der Maus verschieben." _
        & @CRLF & "Zum Beenden diesen Menüeintrag erneut anwählen!")
      EndIf
    EndFunc
    ; #############################################################################
    FUNC GUI_Redesign()  ; Ermöglicht es, ein einzelnes GUI-Element mit der Maus zu verschieben.
    
    
    $sUserMessageNew=""
    
    
      ; --- Ermitteln, über welchem GUI-Element der Hauszeiger hoovert. ---------------\
      ;if $iDoItOnlyOnce = 1 then
        For $iGUI_ElementNr = 0 to Ubound($asGUI_Element)-1
          $avGUI_Parameter=Stringsplit($asGUI_Element[$iGUI_ElementNr], "|")    ;Aufgesplittete Parameter
          if $sMausXY[0] > $avGUI_Parameter[2] and $sMausXY[0] < ($avGUI_Parameter[2]+$avGUI_Parameter[4]) and $sMausXY[1] > $avGUI_Parameter[3] and $sMausXY[1] < ($avGUI_Parameter[3]+$avGUI_Parameter[5])then
            $sUserMessageNew="Feld-Nr. " & $iGUI_ElementNr
            ExitLoop
          EndIf
        Next
      ;EndIf
      ; --- Ermitteln, über welchem GUI-Element der Hauszeiger hoovert. ---------------/
    
    
      if $sUserMessageNew <> $sUserMessageOld then
        _GUICtrlStatusBar_SetText($idStatusbar, $sUserMessageNew, 1)
        $sUserMessageOld=$sUserMessageNew
      EndIf
    
    
      if $iMouseButtonLeft then  ;$sMausXY[2] = 1 then
        GUICtrlSetPos($aHandleGUIElement[$iGUI_ElementNr], $sMausXY[0], $sMausXY[1])
      EndIf
    
    
    EndFunc ;GUI_Redesign
    ; #############################################################################
    Func _Exit() ;Datenbank schließen und Programmende.
      _GDIPlus_ShutDown()
      Exit
    EndFunc   ;==>_Exit
    ; ### Functions ################################################################################################################/
    Alles anzeigen
  • Forum Problemsammlung

    • Code-Jack
    • 7. Juni 2016 um 22:32

    @Raupi:

    Ich Dummerle bin gerade darauf hereingefallen, die in deinen Postings 63 und 65 erwähnte Methode direkt zu übernehmen.
    Also mit den Sternchen in den BBCode-Tags.

    Öh, die Sternchen müssen wohl wegfallen, damit das klappt ...
    Können die Postings bitte editiert werden, damit nicht noch mehr Neulinge darauf hereinfallen?

  • Koordinaten einer InputBox auslesen

    • Code-Jack
    • 7. Juni 2016 um 22:20

    Liebe Profis,
    nach nunmehr zwei Tagen RTFM und Google und Experimenten erbitte ich Eure Hilfe!

    Folgendes Problem:
    Ich möchte es dem Anwender gestatten, die GUI per Maus umzugestalten.
    Nach Anwahl des entsprechenden Menüpunktes können InputBoxen per Drag & Drop verschoben werden.

    Egal was ich anstelle: Ich hadere ich immer wieder mit einem der beiden folgenden Probleme:

    1) Entweder bekomme ich es gebacken, dass eine Listbox der Mausbewegung folgt. Dann aber nur so lange sich die Maus innerhalb des Rechtecks dieser InputBox befindet.
    Ganz doof: Hoovert die Maus während dessen über einer anderen ListBox, so fühlt diese sich angesprochen und klebt plötzlich am Mauszeiger.

    2) Oder: Um obiges Problem zu vermeiden, führte ich die Variable $iDoItOnlyOnce ein, die dafür sorgen soll, dass das jeweilige GUI-Element (hier also die InputBox) nur einmalig, beim Klicken der linken Maustaste, ermittelt wird.
    Dann aber, folgt die gewählte InputBox der Maus nicht mehr flüssig, sondern sie springt bei jedem Klick.
    Derzeit ist diese Option deaktiviert, durch Auskommentieren der Zeilen 893 (If ... Then) und 906 (EndIf)

    Die fehlerhaft Funktion heißt "GUI_Redesign()" (ab Zeile 887).
    Mit beteiligt ist die Funktion Optionen(), die sich direkt darüber befindet.
    Weiterhin mit beteilig ist in der Hauptschleife der Bereich zwischen Zeile 664 und 677.

    Offensichtlichen Schwachsinn treibe ich in der Zeile 898, wo ich ermittle, über welchem GUI-Element die Maus hoovert.
    Dort lese ich die Koordinaten aus, mit denen zu Anfang die GUI aufgebaut wurde.
    Ich müsste aber eigentlich die Parameter auslesen, wo sich die gewünschte InputBox derzeit befindet, denn immerhin kann die ja verschoben werden!
    Doch ich bekomme es trotz ausuferndem RTFM und reichlich Forensuche nicht hin, die gegenwärtigen Koordinaten einer InputBox auszulesen.
    Koordinaten zu verändern klappt, aber nicht das Auslesen. Und den Workarround über Hilfsvariablen möchte ich vermeiden.

    Übrigens vermute ich ganz stark, dass es einen wesentlich eleganteren Weg gibt, zu ermitteln, über welchem Element der Mauszeiger hoovert (und welches Element gerade angeklickt wird), als das, was ich in der Funktion "GUI_Redesign()" treibe.
    Das berühmte UDF GUICtrl_SetOnHover möchte ich aber nicht verwenden (zu buggy).

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    ; output.code.page=65001 ;Deutsche Umlaute ermöglichen. Klappt dennoch nur manchmal ...
    #Region Header #################################################################################################################\
    ; Erstellt mit AutoIt-Version v3.3.14.2

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

    Global Const $sProgrammname = "Reparaturverwaltung"
    Global Const $sVersion = "0.26"
    Global Const $sRevisionsdatum = "07.06.2016"
    Global Const $sAutor = "EDV-Dompteur, Stefan Denk"
    Global Const $sWebsite = "http://www.EDV-Dompteur.de"

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

    ; --- P r o g r a m m b e s c h r e i b u n g -----------------------------------------------------------------------------\
    Global Const $sAbout = "Programmname: " & $sProgrammname & @CRLF & "Version: " & $sVersion & @CRLF & "Autor: " & $sAutor & @CRLF & "Website: " & $sWebsite & @CRLF _
    & @CRLF & "P r o g r a m m b e s c h r e i b u n g" _
    & @CRLF & "---------------------------------------" _
    & @CRLF & "Die hier vorliegende Software ist Freeware, also zur kostenlosen Nutzung freigegeben!" _
    & @CRLF & "Das Programm dient kleinen Reparaturbetrieben dazu, den Überblick über ihre ausgeführten Arbeiten zu behalten." _
    & @CRLF & "Die Details einer jeden Reparatur werden in einem eigenen Datensatz einer SQLite-Datenbank gespeichert." _
    & @CRLF & "Eine Übersicht, in Form einer frei sortierbaren Liste, ermöglicht es rasch nach Datum, Kunde, Gerät etc. zu sortieren."
    ; --- P r o g r a m m b e s c h r e i b u n g -----------------------------------------------------------------------------/

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

    ; --- History -------------------------------------------------------------------------------------------------------------\
    Global Const $sHistory = "" _
    & @CRLF & "D a n k s a g u n g:" _
    & @CRLF & "----------------------" _
    & @CRLF & "Die Code-Vorlage, auf der dieses Programm aufbaut, stammt vom User ""RR04"", aus dem großartigen Forum https://autoit.de/www.AutoIt.de" _
    & @CRLF & "Hier der Foren-Thread mit der Ursprungsversion:" _
    & @CRLF & "https://autoit.de/index.php/Thread/83862-Alinas-SQLite-BuchVw/" _
    & @CRLF & "Vielen Dank an ""RR04"", für die tolle Vorarbeit, die mir sicherlich mehrere Tage Arbeit erspart hat!" _
    & @CRLF _
    & @CRLF & "Weiterhin enthält das Programm einzelne Routinen von ""BugFix"" ([email='bugfix@autoit.de'][/email])" _
    & @CRLF & "Vielen Dank daher auch an ""BugFix""!" _
    & @CRLF & "" _
    & @CRLF & "Ab hier beginnen nun die Änderngen und Erweiterungen durch Fa. EDV-Dompteur, Stefan Denk:" _
    & @CRLF _
    & @CRLF & "H i s t or y:" _
    & @CRLF & "-------------" _
    & @CRLF & "V0.01 vom 28.05.2016:" _
    & @CRLF & "- Programm umbenannt und erste Umgestaltungen der Quelltext-Vorlage von RR04." _
    & @CRLF & "- Programmbeschreibung und History im Quelltext-Header implementiert; derart, dass auch eine Ausgabe dieser Texte möglich wird." _
    & @CRLF & "- Die Tabelle wird nun bei Programmstart automatisch mit Datensätzen gefüllt (wenn DB noch nicht vorhanden, wird sie zuvor erzeugt)." _
    & @CRLF _
    & @CRLF & "V0.06 vom 29.05.2016:" _
    & @CRLF & "- Der ListView-Header ist nun eine Variable, zwecks späterer Möglichkeit zum Einlesen aus einer ini-Datei." _
    & @CRLF & "- Die Beispiel-Datensätze der usprünglichen Reparaturverwaltung umgestrickt auf die Belange einer Reparaturverwaltung." _
    & @CRLF & "- Die Feldbezeichner der SQL-Datenbank verallgemeinert, zwecks leichterer Modifizierbarkeit." _
    & @CRLF & "- Neue Datenfelder definiert: Projektordner, Gesprächsnotiz, Reparaturbericht." _
    & @CRLF & "- Bugfix: Nach dem letzten Quelltext-Umbau wurden Datensätze nicht mehr aktualisiert, nach entsprechender Button-Betätigung." _
    & @CRLF & "- Programmbeschreibung und History werden jetzt mit Zeilenumbrüchen formatiert ausgegeben." _
    & @CRLF & "- Bugfix: Datenfeld 20 wurde nicht mit aktualisiert, nach dem Editieren eines Datensatzes." _
    & @CRLF & "- Menüleiste hinzugefügt. Funktionen: Exit, Programminfo, History (der Menüzweig ""Einstellungen"" ist noch ohne Funktion)." _
    & @CRLF & "- Listview: Spaltenbreiten und Textausrichtung eingestellt. Erste Vorbereitung für späteres Laden der Werte aus ini-Datei." _
    & @CRLF _
    & @CRLF & "V0.07 vom 30.05.2016:" _
    & @CRLF & "- Harmloser Bugfix: Die Einstellmöglichkeit für die Breite von ListView-Spalte 20 fehlte im Quellcode." _
    & @CRLF & "- Anzahl der Datenfelder von 20 auf 30 erhöht. Dadurch GUI-Erscheinungsbild derzeit desolat" _
    & @CRLF _
    & @CRLF & "V0.08 vom 31.05.2016:" _
    & @CRLF & "- Momentan überflüssige Felder auskommentiert und Befehl zum Verstecken von ListView-Spalten implementiert." _
    & @CRLF & "- Vorbereitungen für späteres Laden der GUI-Parameter aus einer Datei." _
    & @CRLF _
    & @CRLF & "V0.09 vom 31.05.2016:" _
    & @CRLF & "- Elegantere Methode zur GUI-Gestaltung implementiert, für späteres Laden aus Datei." _
    & @CRLF _
    & @CRLF & "V0.10 vom 31.05.2016:" _
    & @CRLF & "- Alle InBoxen sind nun bequem Parametrierbar, voll vorbereitet für späteres Laden aus CSV-Datei." _
    & @CRLF & "- Zu jeder Inputbox gehört nun ein Label, deren Ausrichtung ebenfalls bequem einstellbar ist." _
    & @CRLF _
    & @CRLF & "V0.20 vom 04.06.2016:" _
    & @CRLF & "- Die Maus-Koordinaten werden jetzt erfasst und links in der Fußzeile angezeigt." _
    & @CRLF _
    & @CRLF & "V0.21 vom 04.06.2016:" _
    & @CRLF & "- Auch das Suchfeld kann nun einfach parametriert werden." _
    & @CRLF & "- Experimentell eine Groupbox hinzugefügt." _
    & @CRLF _
    & @CRLF & "V0.22 vom 04.06.2016:" _
    & @CRLF & "- Auch Groupboxen können nun einfach parametriert werden." _
    & @CRLF _
    & @CRLF & "V0.23 vom 04.06.2016:" _
    & @CRLF & "- Statusleiste am unteren Fensterrand debugt und erweitert. Jetzt perfekt." _
    & @CRLF & "- Inputboxen lassen sich jetzt erstmals anstazweise per Maus verschieben (noch reichlich buggy)." _
    & @CRLF _
    & @CRLF & "V0.24 vom 06.06.2016:" _
    & @CRLF & "- Fehler beseitigt bei den Koordinaten der Objekt-Label. Nun auch bei Editbox in Ordnung." _
    & @CRLF & "Absturzfehler beseitigt (trat auf bei Klick außerhalb des Fensters): Mauspositionen werden nun durch MouseGetPos ermittelt, statt durch GUIGetCursorInfo." _
    & @CRLF & "Hintergrundbild für das Hauptfenster implementiert." _
    & @CRLF _
    & @CRLF & "V0.25 vom 07.06.2016:" _
    & @CRLF & "- Der Modus zum Umgestalten des GUI kann nun per Menü aktiviert/deaktiviert werden." _
    & @CRLF & "- Bug bemerkt: Inputboxen und ListView nicht betretbar, wenn Hintergrundbild geladen." _
    & @CRLF _
    & @CRLF & "V0.26 vom 07.06.2016:" _
    & @CRLF & "- "
    ; --- History -------------------------------------------------------------------------------------------------------------/

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

    ; --- Aktuelle Aufgaben ---------------------------------------------------------------------------------------------------\
    Global Const $sProgrammieraufgaben = "" _
    & @CRLF & "Folgende drei Darstellungsmodi implementieren: Kombi (Tabelle und Datensatz, wie gehabt), Tabelle (volle Größe), Datensatz (ohne Tabelle)" _
    & @CRLF & "Positionen und Parameter der GUI-Elemente aus ini-Datei laden." _
    & @CRLF & "Bug: Inputboxen und ListView nicht betretbar, wenn Hintergrundbild geladen."
    ; --- Aktuelle Aufgaben ---------------------------------------------------------------------------------------------------/

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

    #include <Date.au3>
    #include <GUIConstantsEx.au3>
    #include <GuiListView.au3>
    #include <GuiStatusBar.au3>
    #include <GUIConstantsEx.au3>
    #include <ComboConstants.au3>
    #include <GuiListView.au3>
    #include <String.au3>
    #include <SQLite.au3>
    #include <sqlite3101_dll.au3>
    #include <StaticConstants.au3> ;Erweiterte Einstellungen für Labels
    #include <EditConstants.au3> ;Test
    #include <Array.au3> ;Test

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

    #include <GDIPlus.au3>
    #include <EditConstants.au3>
    #include <WindowsConstants.au3>
    #Include <Misc.au3>

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

    #include <WindowsConstants.au3>
    #include <WinAPI.au3>

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

    _GDIPlus_Startup()
    #EndRegion Header ##############################################################################################################/

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

    #Region Constanten & Variablen deklarieren und belegen #########################################################################\
    ; --- Globale Constanten deklarieren --------------------------------------------------------------------------------------\
    Global Const $asWDAYger[7] = ["Sonntag, ", "Montag, ", "Dienstag, ", "Mittwoch, ", "Donnerstag, ", "Freitag, ", "Samstag, "]
    ; --- Globale Constanten deklarieren --------------------------------------------------------------------------------------/

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

    ; --- Globale Variablen deklarieren ---------------------------------------------------------------------------------------\
    Opt("MustDeclareVars", 1) ;Zwingt den Programmierer, Variablen ordentlich zu deklarieren, vor der ersten Benutzung.
    Global $cboSerch, $iptSerch, $FormKombiansicht, $Label, $ListView, $ContextMenu, $MenuItem, $btnUpdate, $btnDelete, $iptSearch
    Global $cboSearch, $btnSearch, $btnDBladen, $btnClear, $lblBottomLine, $btnSave, $btnBackUp, $Result, $sDatenbankVollpfad
    Global $sTmp, $sText, $i
    Global $sListViewHeader, $iDBFeldanzahl
    Global $hGUI, $hImage1, $hImage2, $aMousePos
    Global $sUserMessageOld, $sUserMessageNew
    Global $bGUIRedesign
    Global $iDoItOnlyOnce = 0

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

    Opt("MouseCoordMode", 0)
    Global $iPressed = 0, $iLastCtrlID = -1
    ; --- Globale Variablen deklarieren ---------------------------------------------------------------------------------------/

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

    ; ---Globale Variablen mit Werten belegen ---------------------------------------------------------------------------------\
    $sDatenbankVollpfad = @ScriptDir & "\Reparaturverwaltung.rr04"
    $iDBFeldanzahl = 30 ;So viele Felder gibt es in der Datenbank
    ; ---Globale Variablen mit Werten belegen ---------------------------------------------------------------------------------/
    #EndRegion Constanten & Variablen deklarieren und belegen ######################################################################/

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

    #Region Bedienoberfläche zeichnen ##############################################################################################\
    ; --- Fenster & Menü erzeugen-----------------------------------------------------------\
    Global $FormKombiansicht = GUICreate($sProgrammname, 1200, 768, 10, 10) ;Das Hauptfenster erzeugen.
    GUICtrlCreatePic(@ScriptDir & '\Example Images\background.jpg', 0, 0, 1200, 768)

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

    ; --- Menüzweig 1 ------------------------------------------------------------\
    Global $MenuA = GUICtrlCreateMenu("Datei")
    Global $MenuItemAExit = GUICtrlCreateMenuItem("Schließen", $MenuA)
    ; --- Menüzweig 1 ------------------------------------------------------------/

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

    ; --- Menüzweig 2 ------------------------------------------------------------\
    Global $MenuB = GUICtrlCreateMenu("Einstellungen")
    Global $MenuItemOptionen = GUICtrlCreateMenuItem("Maske umgestalten", $MenuB)
    ; --- Menüzweig 2 ------------------------------------------------------------/

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

    ; --- Menüzweig 3 ------------------------------------------------------------\
    Global $MenuC = GUICtrlCreateMenu("?")
    Global $MenuItemCProgramminfo = GUICtrlCreateMenuItem("Programminfo", $MenuC)
    Global $MenuItemCHistory = GUICtrlCreateMenuItem("History && Danksagung", $MenuC)
    ; --- Menüzweig 3 ------------------------------------------------------------/
    GUISetState(@SW_SHOW) ;??? Was macht dieser Befehl?
    ; --- Fenster & Menü erzeugen-----------------------------------------------------------/

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

    ; --- Programmname darstellen ----------------------------------------------------------\
    ;$Label = GUICtrlCreateLabel("~ ~ ~ " & $sProgrammname & " Version: " & $sVersion & " ~ ~ ~", 0, 8, 1125, 28, 0x01) ; $SS_CENTER=0x01
    ;GUICtrlSetFont(-1, 16, 800, 0, "Arial")
    ;GUICtrlSetColor(-1, 0x0000FF)
    ; --- Programmname darstellen ----------------------------------------------------------/

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

    ; --- Liestview aufbauen --------------------------------------------------------------------------------------------------\
    ; ---- Headerzeile der ListView --------------------------------------------------------\
    $sListViewHeader= "" _
    & "ID" _
    & "|Annahme" _
    & "|Abholung" _
    & "|Gerät" _
    & "|Schadenskürzel" _
    & "|Firma" _
    & "|Vorname" _
    & "|Nachname" _
    & "|Endpreis" _
    & "|Re-Nr." _
    & "|Anzahl." _
    & "|Leihteile" _
    & "|Voranschlag" _
    & "|Rekla" _
    & "|Projektordner" _
    & "|Gesprächsnotiz" _
    & "|Reparaturbericht" _
    & "|17" _
    & "|18" _
    & "|19" _
    & "|20" _
    & "|21" _
    & "|22" _
    & "|23" _
    & "|24" _
    & "|25" _
    & "|26" _
    & "|27" _
    & "|28" _
    & "|29" _
    & "|30"
    ; ---- Headerzeile der ListView --------------------------------------------------------/

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

    ; --- Listwiew erzeugen ----------------------------------------------------------------\
    Global $aHeader = StringSplit($sListViewHeader, '|')
    $ListView = GUICtrlCreateListView($sListViewHeader, 0, 40, 1125, 260)
    GUICtrlSetBkColor(-1, 0xFFFFFF) ; Color weiß
    GUICtrlSetBkColor(-1, $GUI_BKCOLOR_LV_ALTERNATE)
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    ; --- Listwiew erzeugen ----------------------------------------------------------------/

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

    ; --- Spaltenbreiten und Textausrichtung der Listview-Spalten festlegen ----------------\
    Global $GetHandleLV = GUICtrlGetHandle($ListView)
    _GUICtrlListView_SetColumn($GetHandleLV, 0, $aHeader[1], 40, 1) ;ID
    _GUICtrlListView_SetColumn($GetHandleLV, 1, $aHeader[2], 80, 0) ;Annahmedatum
    _GUICtrlListView_SetColumn($GetHandleLV, 2, $aHeader[3], 70, 0) ;Abholdatum
    _GUICtrlListView_SetColumn($GetHandleLV, 3, $aHeader[4], 120, 0) ;Gerät
    _GUICtrlListView_SetColumn($GetHandleLV, 4, $aHeader[5], 100, 0) ;Schadenskürzel
    _GUICtrlListView_SetColumn($GetHandleLV, 5, $aHeader[6], 110, 0) ;Firma
    _GUICtrlListView_SetColumn($GetHandleLV, 6, $aHeader[7], 110, 1) ;Vorname
    _GUICtrlListView_SetColumn($GetHandleLV, 7, $aHeader[8], 110, 0) ;Nachname
    _GUICtrlListView_SetColumn($GetHandleLV, 8, $aHeader[9], 60, 1) ;Endpreis
    _GUICtrlListView_SetColumn($GetHandleLV, 9, $aHeader[10], 60, 1) ;Rechnungsnummer
    _GUICtrlListView_SetColumn($GetHandleLV, 10, $aHeader[11], 60, 1) ;Anzahlung
    _GUICtrlListView_SetColumn($GetHandleLV, 11, $aHeader[12], 150, 0) ;Leihteile
    _GUICtrlListView_SetColumn($GetHandleLV, 12, $aHeader[13], 60, 1) ;Voranschlag
    _GUICtrlListView_SetColumn($GetHandleLV, 13, $aHeader[14], 70, 0) ;Reklamation (Verknüpfung auf neuen Datensatz)
    _GUICtrlListView_SetColumn($GetHandleLV, 14, $aHeader[15], 100, 0) ;Projektordner
    _GUICtrlListView_SetColumn($GetHandleLV, 15, $aHeader[16], 100, 0) ;Gesprächsnotiz
    _GUICtrlListView_SetColumn($GetHandleLV, 16, $aHeader[17], 100, 0) ;Reparaturbericht
    _GUICtrlListView_SetColumn($GetHandleLV, 17, $aHeader[18], 40, 0) ;Festnetz
    _GUICtrlListView_SetColumn($GetHandleLV, 18, $aHeader[19], 40, 0) ;Mobil
    _GUICtrlListView_SetColumn($GetHandleLV, 19, $aHeader[20], 40, 0) ;E-Mail
    _GUICtrlListView_SetColumn($GetHandleLV, 20, $aHeader[21], 80, 0) ;Status (In Arbeit / Abholbereit / Abgeholt)
    _GUICtrlListView_SetColumn($GetHandleLV, 21, $aHeader[22], 40, 0) ;
    _GUICtrlListView_SetColumn($GetHandleLV, 22, $aHeader[23], 40, 0) ;
    _GUICtrlListView_SetColumn($GetHandleLV, 23, $aHeader[24], 40, 0) ;
    _GUICtrlListView_SetColumn($GetHandleLV, 24, $aHeader[25], 40, 0) ;
    _GUICtrlListView_SetColumn($GetHandleLV, 25, $aHeader[26], 40, 0) ;
    _GUICtrlListView_SetColumn($GetHandleLV, 26, $aHeader[27], 40, 0) ;
    _GUICtrlListView_SetColumn($GetHandleLV, 27, $aHeader[28], 40, 0) ;
    _GUICtrlListView_SetColumn($GetHandleLV, 28, $aHeader[29], 40, 0) ;
    _GUICtrlListView_SetColumn($GetHandleLV, 29, $aHeader[30], 40, 0) ;
    _GUICtrlListView_SetColumn($GetHandleLV, 30, $aHeader[31], 40, 0) ;
    ; --- Spaltenbreiten und Textausrichtung der Listview-Spalten festlegen ----------------/

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

    $ContextMenu = GUICtrlCreateContextMenu($ListView)
    $MenuItem = GUICtrlCreateMenuItem("Datensatz bearbeiten", $ContextMenu)
    ; --- Liestview aufbauen --------------------------------------------------------------------------------------------------/

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

    ; --- Main Area -----------------------------------------------------------------------------------------------------------\
    ; --- Buttons, Labels und Inputfelder erzeugen -----------------------------------------------------------------------\
    Global $aCtrlLabel[$iDBFeldanzahl + 1], $aHandleGUIElement[$iDBFeldanzahl + 1]
    Global $asGUI_Element[24] ;Array mit 30 elementen - so viele GUI-Elemente gibt es.
    Global $iYSchrittweite = 35

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

    ; --- GUI-Parameter der Input-Boxen und deren Labels ------------------------------------------------------------\
    ; 1 2 3 4 5 6 7 8 9 10 11 12 1314 1516 17
    $asGUI_Element[0] = "Inputbox| 15|320|100| 22|L|0x0000|0|Zeile 0 |U| 0| 0|110| 22|L|0x0000|0|Datensatz-ID"
    $asGUI_Element[1] = "Inputbox|150|375|100| 22|L|0x0000|0|Zeile 1 |R| -5| 0|110| 22|L|0x0000|0|Annahmedatum"
    $asGUI_Element[2] = "Inputbox|150|400|100| 22|L|0x0000|0|Zeile 2 |R| -5| 0|110| 22|R|0x0000|0|Abholdatum"
    $asGUI_Element[3] = "Inputbox|390|375|200| 22|L|0x0000|0|Zeile 3 |O| -5| 0|110| 22|R|0x0000|0|Gerät"
    $asGUI_Element[4] = "Inputbox|390|400|200| 22|L|0x0000|0|Zeile 4 |U| 0| 0|110| 22|R|0x0000|0|Schadenskürzel"
    $asGUI_Element[5] = "Inputbox|150|495|100| 22|L|0x0000|0|Zeile 5 |L| -5| 0|110| 22|R|0x0000|0|Firma"
    $asGUI_Element[6] = "Inputbox|150|520|100| 22|L|0x0000|0|Zeile 6 |L| -5| 0|110| 22|R|0x0000|0|Vorname"
    $asGUI_Element[7] = "Inputbox|150|545|100| 22|L|0x0000|0|Zeile 7 |L| -5| 0|110| 22|R|0x0000|0|Nachname"
    $asGUI_Element[8] = "Inputbox|450|550|100| 22|R|0x0000|0|Zeile 8 |L| -5| 0|110| 22|R|0x0000|0|Endpreis"
    $asGUI_Element[9] = "Inputbox|450|575|100| 22|R|0x0000|0|Zeile 9 |L| -5| 0|110| 22|R|0x0000|0|Re-Nr."
    $asGUI_Element[10] = "Inputbox|450|450|100| 22|R|0x0000|0|Zeile 10 |L| -5| 0|110| 22|R|0x0000|0|Anzahlung"
    $asGUI_Element[11] = "Inputbox|450|475|100| 22|L|0x0000|0|Zeile 11 |L| -5| 0|110| 22|R|0x0000|0|Leihteile"
    $asGUI_Element[12] = "Inputbox|450|500|100| 22|R|0x0000|0|Zeile 12 |L| -5| 0|110| 22|R|0x0000|0|Voranschlag"
    $asGUI_Element[13] = "Inputbox|140|320|100| 22|L|0x0000|0|Zeile 13 |U| 0| 0| 85| 22|L|0x0000|0|Rekla"
    $asGUI_Element[14] = "Inputbox|270|320|500| 22|L|0x0000|0|Zeile 14 |U| 0| 0|130| 22|L|0x0000|0|Projektordner"
    $asGUI_Element[15] = "Inputbox|750|475|100| 22|L|0x0000|0|Zeile 15 |L| -5| 0|110| 22|R|0x0000|0|Gesprächsnotiz"
    $asGUI_Element[16] = "Inputbox|750|350|100| 22|L|0x0000|0|Zeile 16 |L| -5| 0|120| 22|R|0x0000|0|Reparaturbericht"
    $asGUI_Element[17] = "Inputbox|750|375|100| 22|L|0x0000|0|Zeile 17 |L| -5| 0|110| 22|R|0x0000|0|Festnetz"
    $asGUI_Element[18] = "Inputbox|750|400|100| 22|L|0x0000|0|Zeile 18 |L| -5| 0|110| 22|R|0x0000|0|Mobil-Nr."
    $asGUI_Element[19] = "Inputbox|750|425|100| 22|L|0x0000|0|Zeile 19 |L| -5| 0|110| 22|R|0x0000|0|E-Mail"
    $asGUI_Element[20] = "Inputbox|750|450|100| 22|L|0x0000|0|Zeile 20 |L| -5| 0|110| 22|R|0x0000|0|Status"
    $asGUI_Element[21] = "Inputbox|270| 10|250| 22|L|0x0000|0|Zeile 21 |L| 0| 0| 70| 22|R|0x0000|0|Suche:"
    $asGUI_Element[22] = "Groupbox| 20|310|500|300|L|0x0000|0|Adressdaten|R| 0| 0| 70| 22|L|0x0000|0|Adresse"
    $asGUI_Element[23] = "Editbox |895|400|217|160|L|0x0000|0|Memo |U| -5| 0| 70| 22|L|0x0000|0|Gesprächsnotiz"
    ; --- GUI-Parameter der Input-Boxen und deren Labels ------------------------------------------------------------/

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

    ;_ArrayDisplay($asGUI_Element, "Array-Inhalt") ; Debugausgabe (besserer Ersatz für MsgBox, um ein ganzes Array auf einen Schlag anzeigen zu lassen).

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

    ; --- Input-Boxen (und Labels) für Datenbankfelder --------------------------------------------------------------\
    Global $avGUI_Parameter[19] ;Anzahl der Parameter eines Parametersatzes.
    Global $sF_Obj
    Global $iX_Obj, $iY_Obj, $iW_Obj, $iH_Obj, $hE_Obj, $sT_Obj
    Global $sA_Lbl, $sA_LblTxt
    Global $iX_Lbl, $iY_Lbl, $iW_Lbl, $iH_Lbl, $hE_Lbl, $sT_Lbl
    Global $iStrgW

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

    For $iGUI_ElementNr = 0 to Ubound($asGUI_Element)-1 ;30 Zeilen
    ; --- Pro Schleifendurchlauf die Parameter je eines GUI-Elements auslesen --------------------------------\
    $avGUI_Parameter=Stringsplit($asGUI_Element[$iGUI_ElementNr], "|") ;Aufgesplittete Parameter
    ;MsgBox(0,"",$avGUI_Parametersatz[2])

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

    $sF_Obj = StringStripWS ($avGUI_Parameter[1], 3) ;Funktion des Objektes (von Leerzeichen links und Rechts befreit)

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

    $iX_Obj = $avGUI_Parameter[2] ;X-Position des Objektes
    $iY_Obj = $avGUI_Parameter[3] ;Y-Position des Objektes
    $iW_Obj = $avGUI_Parameter[4] ;Weite des Objektes
    $iH_Obj = $avGUI_Parameter[5] ;Höhe des Objektes
    $hE_Obj = $avGUI_Parameter[6] ;Erweiterte Parameter, siehe AutoIt Help: GUICtrlCreateLabel, bzw. GUI Control Styles
    $sT_Obj = $avGUI_Parameter[9] ;Textvorbelegung (wenn Inputbox)

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

    $sA_Lbl = $avGUI_Parameter[10] ;Positionsangabe, bezogen auf das Objekt: "L"=Links / "U"=Unten / "R"=Rechts / "O"=Oben.

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

    $iX_Lbl = $avGUI_Parameter[11] ; + $iX_Obj ;X-Position des Labels
    $iY_Lbl = $avGUI_Parameter[12] ;+ $iY_Obj ;Y-Position des Labels
    $iW_Lbl = $avGUI_Parameter[13] ;Weite des Labels
    $iH_Lbl = $avGUI_Parameter[14] ;Höhe des Labels
    $sA_LblTxt= $avGUI_Parameter[15] ;Ausrichtung des Labeltextes (linksbündig/rechtsbündig)
    $hE_Lbl = $avGUI_Parameter[16] ;Erweiterte Parameter, siehe AutoIt Help: GUICtrlCreateLabel, bzw. GUI Control Styles
    $sT_Lbl = $avGUI_Parameter[18] ;Text des Labels

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

    $iStrgW=Stringbreite($sT_Lbl) ;Breite des vordefinierten Label-Strings in Pixeln.
    ; --- Pro Schleifendurchlauf die Parameter je eines GUI-Elements auslesen --------------------------------/

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

    ; --- Positionen der Labels (in Bezug auf deren Inputboxen), sowie deren Textausrichtung festlegen -------\
    Select ;Label-Position (L/U/R/O) und Textausrichtung (L/R) des Labels
    Case $sA_Lbl="L" and $sA_LblTxt="L" ;LL - Labelposition (L)inks, Textausrichtung (L)inksbündig
    $iX_Lbl = $iX_Obj + $iX_Lbl - $iW_Lbl
    $iY_Lbl = $iY_Obj + $iY_Lbl

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

    Case $sA_Lbl="L" and $sA_LblTxt="R" ;LR - Labelposition (L)inks, Textausrichtung (R)echtsbündig
    $iX_Lbl = $iX_Obj + $iX_Lbl - $iW_Lbl ; + $iStrgW
    $hE_Lbl=BitOR($hE_Lbl, 0x0002)
    $iY_Lbl = $iY_Obj + $iY_Lbl

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

    Case $sA_Lbl="U" and $sA_LblTxt="L" ;UL - Labelposition (U)nten, Textausrichtung (L)inksbündig
    $iX_Lbl = $iX_Obj + $iX_Lbl
    $iY_Lbl = $iY_Obj + $iY_Lbl + $iH_Obj

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

    Case $sA_Lbl="U" and $sA_LblTxt="R" ;UR - Labelposition (U)nten, Textausrichtung (R)echtsbündig
    $iX_Lbl = $iX_Obj + $iX_Lbl + $iW_Obj - $iW_Lbl
    $hE_Lbl=BitOR($hE_Lbl, 0x0002)
    $iY_Lbl = $iY_Obj + $iY_Lbl + $iH_Lbl

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

    Case $sA_Lbl="R" and $sA_LblTxt="L" ;RL - Labelposition (R)echts, Textausrichtung (L)inksbündig
    $iX_Lbl = $iX_Obj + $iX_Lbl + $iW_Obj
    $iY_Lbl = $iY_Obj + $iY_Lbl

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

    Case $sA_Lbl="R" and $sA_LblTxt="R" ;RR - Labelposition (R)echts, Textausrichtung (R)echtsbündig
    $iX_Lbl = $iX_Obj + $iX_Lbl + $iW_Obj ;- $iW_Lbl
    $hE_Lbl=BitOR($hE_Lbl, 0x0002)
    $iY_Lbl = $iY_Obj + $iY_Lbl

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

    Case $sA_Lbl="O" and $sA_LblTxt="L" ;OL - Labelposition (O)ben, Textausrichtung (L)inksbündig
    $iX_Lbl = $iX_Obj + $iX_Lbl
    $iY_Lbl = $iY_Obj + $iY_Lbl - $iH_Lbl

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

    Case $sA_Lbl="O" and $sA_LblTxt="R" ;OR - Labelposition (O)ben, Textausrichtung (R)echtsbündig
    $iX_Lbl = $iX_Obj + $iX_Lbl ;+ $iW_Lbl
    $hE_Lbl=BitOR($hE_Lbl, 0x0002)
    $iY_Lbl = $iY_Obj + $iY_Lbl - $iH_Obj

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

    EndSelect
    ; --- Positionen der Labels (in Bezug auf deren Inputboxen), sowie deren Textausrichtung festlegen -------/

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

    if $sF_Obj="Inputbox" then
    ;if $GUIElement_Nr=1 Then ;Die erste Inputbox enthält die ID des Datensatzes. Daher auf nicht editierbar schalten.
    ;BitXOR $ES_READONLY
    ;EndIf
    $aHandleGUIElement[$iGUI_ElementNr] = GUICtrlCreateInput($sT_Obj, $iX_Obj, $iY_Obj, $iW_Obj, $iH_Obj, $hE_Obj, 0) ;Inputbox
    EndIf

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

    if $sF_Obj="Groupbox" then
    $aHandleGUIElement[$iGUI_ElementNr] = GUICtrlCreateGroup($sT_Obj, $iX_Obj, $iY_Obj, $iW_Obj, $iH_Obj)
    EndIf

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

    if $sF_Obj="Editbox" then
    $aHandleGUIElement[$iGUI_ElementNr] = GUICtrlCreateEdit($sT_Obj, $iX_Obj, $iY_Obj, $iW_Obj, $iH_Obj)
    EndIf

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

    ; --- Label erzeugen -----------------------------------------------------------------------------\
    $aCtrlLabel[$iGUI_ElementNr] = GUICtrlCreateLabel($sT_Lbl, $iX_Lbl, $iY_Lbl, $iW_Lbl, $iH_Lbl, $hE_Lbl, 0) ;Label, zugehörig zu obiger Inputbox.
    GUICtrlSetFont($aCtrlLabel[$iGUI_ElementNr], 12, 400, 0, "Arial")
    GUICtrlSetFont($aHandleGUIElement[$iGUI_ElementNr], 12, 400, 0, "Arial")
    ; --- Label erzeugen -----------------------------------------------------------------------------/

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

    Next
    ; --- Input-Boxen (und Labels) für Datenbankfelder --------------------------------------------------------------/
    GUICtrlSetFont(-1, 12, 400, 0, "Arial")

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

    ; --- Information
    ;$aHandleGUIElement[$iDBFeldanzahl] = GUICtrlCreateEdit("Gesprächsnotiz", 895, 400, 217, 160)
    ;$aCtrlLabel[$iDBFeldanzahl] = GUICtrlCreateLabel($aHeader[$iDBFeldanzahl + 1], 895, 372, 100, 22)

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

    ; --- Button "Datensatz Update"
    $btnUpdate = GUICtrlCreateButton("DS Update", 895, 583, 105, 28)
    GUICtrlSetFont(-1, 12, 400, 0, "Arial")

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

    ; --- Button "Datensatz löschen"
    $btnDelete = GUICtrlCreateButton("DS Löschen", 1010, 583, 105, 28)
    GUICtrlSetFont(-1, 12, 400, 0, "Arial")

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

    ; --- Suche
    $cboSearch = GUICtrlCreateCombo("Suche im Feld:", 50, 8, 150, 25, BitOR($GUI_SS_DEFAULT_COMBO, $CBS_DROPDOWNLIST))
    GUICtrlSetData(-1, $sListViewHeader)
    GUICtrlSetFont(-1, 12, 400, 0, "Arial")

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

    $btnSearch = GUICtrlCreateButton("Suche starten", 570, 8, 110, 25)
    GUICtrlSetFont(-1, 12, 400, 0, "Arial")

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

    ; --- Button "Datenbank laden"
    $btnDBladen = GUICtrlCreateButton("Suche beenden", 700, 8, 130, 25)
    GUICtrlSetFont(-1, 12, 400, 0, "Arial")

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

    ; --- Button "Eingabefelder leeren"
    $btnClear = GUICtrlCreateButton("Eingabefelder leeren", 620, 583, 241, 28)
    GUICtrlSetFont(-1, 12, 400, 0, "Arial")
    ; --- Buttons, Labels und Inputfelder erzeugen -----------------------------------------------------------------------/
    ; --- Main Area -----------------------------------------------------------------------------------------------------------/

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

    ; --- Horizontale, gestrichelte Linie erzeugen -------------------------------\
    Const $trR = _StringRepeat("-", 368)
    $lblBottomLine = GUICtrlCreateLabel($trR, 10, 615, 1110, 8)
    ; --- Horizontale, gestrichelte Linie erzeugen -------------------------------/

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

    ; --- Bottom Area ---------------------------------------------------------------------------------------------------------\
    ; --- Untere Inputfelder erzeugen --------------------------------------------\
    Global $aCtrllbl[3], $aCtrlipt[3], $aLblTxt[3] = ["Auftragsanzahl:", "Ges. Seitenzahl:", "Ges. Buch NP:"]
    For $l = 0 To 2
    $aCtrllbl[$l] = GUICtrlCreateLabel($aLblTxt[$l], 10 + ($l) * 260, 640, 120, 22)
    GUICtrlSetFont(-1, 12, 400, 0, "Arial")
    $aCtrlipt[$l] = GUICtrlCreateInput($l, 140 + ($l) * 260, 638, 120, 26, 0x0002) ; $ES_RIGHT=0x0002
    GUICtrlSetFont(-1, 12, 400, 0, "Arial")
    Next
    ; --- Untere Inputfelder erzeugen --------------------------------------------/

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

    ; --- Button "Datensatz kopieren" erzeugen -----------------------------------\
    $btnSave = GUICtrlCreateButton("DS kopieren", 1010, 635, 105, 28)
    GUICtrlSetFont(-1, 12, 400, 0, "Arial")
    ; --- Button "Datensatz kopieren" erzeugen -----------------------------------/

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

    ; --- Button "Datenbank-Backup" erzeugen -------------------------------------\
    $btnBackUp = GUICtrlCreateButton("DB BackUp", 895, 635, 105, 28)
    GUICtrlSetFont(-1, 12, 400, 0, "Arial")
    ; --- Button "Datenbank-Backup" erzeugen -------------------------------------/
    ; --- Bottom Area ---------------------------------------------------------------------------------------------------------/

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

    #EndRegion Bedienoberfläche zeichnen ###########################################################################################/

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

    #Region SQL starten & Datenbank in Listview laden (DB gegebenenfalls zuerst erzeugen) ##########################################\
    _SQLite_Startup(@ScriptDir & "\sqlite3.dll", False, 1) ; BugFix Idee, da DLL ja nicht mehr mitgeliefert wird
    If @error Then
    $sTmp = "SQLite.dll konnte nicht geladen werden!"
    MsgBox($MB_SYSTEMMODAL, "SQLite Error", $sTmp)
    Exit -1
    EndIf

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

    Local $bTabelleErzeugen = 0
    If Not FileExists($sDatenbankVollpfad) Then
    $bTabelleErzeugen = True
    EndIf

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

    Global $g_db_Database = _SQLite_Open($sDatenbankVollpfad) ;Datenbank öffnen. Falls noch nicht vorhanden, dann erzeugen & öffnen.
    If @error Then
    $sTmp = "Die Datenbank:" & @CRLF & $sDatenbankVollpfad & @CRLF & "konnte nicht geöffnet werden!"
    MsgBox($MB_SYSTEMMODAL, "SQLite Error", $sTmp)
    Exit -1
    EndIf

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

    If $bTabelleErzeugen = True Then
    ; --- Datenbank-Tabelle erzeugen-----------------------------------------------------------------------------------------\
    Global $sDBHeader = "CREATE TABLE IF NOT EXISTS Reparaturverwaltung(ID INTEGER PRIMARY KEY AUTOINCREMENT," _
    & "F01," _ ;Annahme
    & "F02," _ ;Abholung
    & "F03," _ ;Gerät
    & "F04," _ ;Schadenskürzel
    & "F05," _ ;Firma
    & "F06," _ ;Vorname
    & "F07," _ ;Nachname
    & "F08," _ ;Endpreis
    & "F09," _ ;Rechnungsnummer
    & "F10," _ ;Anzahlung
    & "F11," _ ;Leihteile
    & "F12," _ ;Voranschlag
    & "F13," _ ;Reklamationsdatum
    & "F14," _ ;Projektordner
    & "F15," _ ;Gesprächsnotiz
    & "F16," _ ;Reparaturbericht
    & "F17," _
    & "F18," _
    & "F19," _
    & "F20," _
    & "F21," _
    & "F22," _
    & "F23," _
    & "F24," _
    & "F25," _
    & "F26," _
    & "F27," _
    & "F28," _
    & "F29," _
    & "F30);"
    ; --- Datenbank-Tabelle erzeugen ----------------------------------------------------------------------------------------/

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

    ; --- Mehrere Beispiel-Datensätze erzeugen ------------------------------------------------------------------------------\
    _SQLite_Exec($g_db_Database, $sDBHeader)
    _SQLite_Exec(-1, "INSERT INTO Reparaturverwaltung VALUES(NULL,'16-03-22 11','16-03-22 18','Medion Akoya 731','Buchse defekt','','Herbert','Mustermann','100,00','576','20.00','USB-HDD-Gehäuse','100.00','','','','','','','','','','','','','','','','','','');")
    _SQLite_Exec(-1, "INSERT INTO Reparaturverwaltung VALUES(NULL,'16-03-21 12','16-03-22 11','HP dv7','Buchse defekt','RA Rechtsverdreh','Ede','Knastmann','100,00','1039','','','100.00','','','','','','','','','','','','','','','','','','');")
    _SQLite_Exec(-1, "INSERT INTO Reparaturverwaltung VALUES(NULL,'16-03-27 16','16-03-28 11','Lenovo 730','Scharnier lose','','Cornelia','Turteltaub','120,00','1038','100.00','','100.00','','','','','','','','','','','','','','','','','','');")
    _SQLite_Exec(-1, "INSERT INTO Reparaturverwaltung VALUES(NULL,'16-04-22 09','16-04-27 11','Lenovo 1100','Einschaltproblem','','Waltrude','von der Weide','80,00','1040','10.00','','100.00','','','','','','','','','','','','','','','','','','');")
    _SQLite_Exec(-1, "INSERT INTO Reparaturverwaltung VALUES(NULL,'16-06-22 15','16-06-29 11','Toshiba Satellite 50','Stabilitätsproblem','Schokofabrik ABC','Ali','Bahbah','47,50','413','10.00','Leihgerät 4','-','','','','','','','','','','','','','','','','','','');")
    _SQLite_Exec(-1, "INSERT INTO Reparaturverwaltung VALUES(NULL,'16-07-22 13','16-07-22 17','Sony Vaio MG3000','Grafikfehler','','','Megenstadter','22,50','-','22.50','','-','','','','','','','','','','','','','','','','','','');")
    _SQLite_Exec(-1, "INSERT INTO Reparaturverwaltung VALUES(NULL,'16-03-22 11','16-03-28 15','Lenovo AS200','Sturzschaden','Druckerei Müller','Willybald','Mustermann','100,00','-','','','100.00','','','','','','','','','','','','','','','','','','');")
    _SQLite_Exec(-1, "INSERT INTO Reparaturverwaltung VALUES(NULL,'16-01-22 12','16-03-23 15','Toshiba Satellite X20','Flüssigkeitsschaden','','Fridolin','Kaiserschmarrn','90,00','1041','','','100.00','','','','','','','','','','','','','','','','','','');")
    _SQLite_Exec(-1, "INSERT INTO Reparaturverwaltung VALUES(NULL,'15-03-22 11','15-04-01 12','MSI XC70S','Buchse defekt','???','','Maienbaum','0,00','-','','','0.00','','','','','','','','','','','','','','','','','','');")
    _SQLite_Exec(-1, "INSERT INTO Reparaturverwaltung VALUES(NULL,'16-03-22 16','16-03-23 10','HP HDX18','Flüssigkeitsschaden','Werbeagentur DeLuxe','Veronika','Glitterstrass','1050,79','1042','500.00','','1000.00','','','','','','','','','','','','','','','','','','');")
    _SQLite_Exec(-1, "INSERT INTO Reparaturverwaltung VALUES(NULL,'16-05-27 16','','Asus X738','Einschaltproblem','Druckerei Müller','Willybald','Mustermann','','','','','100,00','','','','','','','','','','','','','','','','','','');")
    ; --- Mehrere Beispiel-Datensätze erzeugen ------------------------------------------------------------------------------/
    EndIf

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

    _SQLite_CountRows('Reparaturverwaltung')
    #EndRegion SQL starten & Datenbank in Listview laden (DB gegebenenfalls zuerst erzeugen) #######################################/

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

    ; --- Statusbar am untersten Fensterrand ----------------------------------------------------------------------------------\
    Global $idStatusbar = _GUICtrlStatusBar_Create($FormKombiansicht)

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

    GUISetState(@SW_SHOW)
    ;_timeStatus() ; Funktion aufrufen sofortige einmalige Ausführung nach Programmstart
    AdlibRegister('_timeStatus', 1000) ; Start alle 1000 milisec.

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

    Global $idStatusbar_PartsWidth[4]
    $idStatusbar_PartsWidth[0]=700
    $idStatusbar_PartsWidth[1]=$idStatusbar_PartsWidth[0]+180
    $idStatusbar_PartsWidth[2]=$idStatusbar_PartsWidth[1]+150
    $idStatusbar_PartsWidth[3]=-1 ;$idStatusbar_PartsWidth[2]+200

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

    _GUICtrlStatusBar_SetParts($idStatusbar, $idStatusbar_PartsWidth) ;200, 400, 700, -1) ;$idStatusbar_PartsWidth)
    Global $sMausXY
    _GUICtrlStatusBar_SetText($idStatusbar, $sMausXY, 0)
    _GUICtrlStatusBar_SetText($idStatusbar, " _SQLite_LibVersion = " & _SQLite_LibVersion(), 1)

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

    _GUICtrlStatusBar_SetMinHeight($idStatusbar, 20) ;!!!
    ; --- Statusbar am untersten Fensterrand ----------------------------------------------------------------------------------/
    #Region Listview Füllen und Darstellungs-Einstellungen vornehmen ###############################################################\
    _ListViewFill() ;Listview füllen, mit den Datensätzen der (nun garantiert vorhandenen und geöffneten) Datenbank-Datei.

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

    _GUICtrlListView_HideColumn($Listview, 17)
    _GUICtrlListView_HideColumn($Listview, 18)
    _GUICtrlListView_HideColumn($Listview, 19)
    _GUICtrlListView_HideColumn($Listview, 20)
    _GUICtrlListView_HideColumn($Listview, 21)
    _GUICtrlListView_HideColumn($Listview, 22)
    _GUICtrlListView_HideColumn($Listview, 23)
    _GUICtrlListView_HideColumn($Listview, 24)
    _GUICtrlListView_HideColumn($Listview, 25)
    _GUICtrlListView_HideColumn($Listview, 26)
    _GUICtrlListView_HideColumn($Listview, 27)
    _GUICtrlListView_HideColumn($Listview, 28)
    _GUICtrlListView_HideColumn($Listview, 29)
    _GUICtrlListView_HideColumn($Listview, 30)
    #EndRegion Listview Füllen und Darstellungs-Einstellungen vornehmen ############################################################/

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

    #Region Hauptschleife ##########################################################################################################\
    $hGUI = $FormKombiansicht ;GUICreate('Drag & Drop Images Example', 541, 340, -1, -1, BitOR($GUI_SS_DEFAULT_GUI, $WS_CLIPCHILDREN))
    Global Const $SC_DRAGMOVE = 0xF012
    Global $iMouseButtonLeft
    Global $aRect[4]
    AutoItSetOption ("MouseCoordMode", 2 ) ;Mauskoordinaten sollen sich auf den Bereich unterhalb der Menüleiste beziehen.

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

    ;do
    While True

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

    ; --- Mauskoordinaten erfassen und darstellen -------------------------------------\
    $sMausXY=MouseGetPos() ;GUIGetCursorInfo() ;Die Verwendung von MouseGetPos, statt GUIGetCursorInfo vermeidet Absturz wenn außerhalb des Fensters geklickt wird.
    _GUICtrlStatusBar_SetText($idStatusbar, $sMausXY[0] & " / " & $sMausXY[1], 0) ;!!!!!!!! Verursacht Absturz wenn Fenster Fokus verliert !!!!!!!
    ;_GUICtrlStatusBar_SetText($idStatusbar, "lala", 0) ;$sMausXY[0] & " / " & $sMausXY[1], 0) ;!!!!!!!! Verursacht den obigen Absturz nicht !!!!!!!
    ; --- Mauskoordinaten erfassen und darstellen -------------------------------------/

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

    Switch GUIGetMsg()

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

    Case -3
    _Exit()

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

    Case $ListView
    _GUICtrlListView_RegisterSortCallBack($ListView, false)
    _GUICtrlListView_SortItems($ListView, GUICtrlGetState($ListView))

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

    Case $btnSave
    _DsInsert()
    _ListViewFill()
    _iptClear()
    _SQLite_CountRows('Reparaturverwaltung')

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

    Case $btnDelete
    _DsDelete()
    _ListViewFill()
    _SQLite_CountRows('Reparaturverwaltung')

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

    Case $btnUpdate
    _DsUpdate()
    _ListViewFill()

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

    Case $btnSearch
    _ListViewFill("SELECT ROWID,* From Reparaturverwaltung WHERE " & GUICtrlRead($cboSearch) & " LIKE '" & GUICtrlRead($iptSearch) & "';")
    ; --- Obiges funktioniert derzeit nicht mehr, weil: -------------------------------\
    ; --> Query: SELECT ROWID,* From Reparaturverwaltung WHERE Annahme LIKE '0';
    ; --> Error: no such column: Annahme
    ; Problem sind die inzwischen abweichenden Namen der ListView Rows von den Datensatzfeldern
    ; --- Obiges funktioniert derzeit nicht mehr, weil: -------------------------------/

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

    Case $btnDBladen
    _ListViewFill()

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

    Case $btnClear
    _iptClear()

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

    Case $btnBackUp
    _DB_BackUp()

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

    Case $MenuItem
    _iptClear()
    _ListView2ipt()

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

    Case $MenuItemAExit
    _Exit()

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

    Case $MenuItemCProgramminfo
    msgbox(0, "", $sAbout)

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

    Case $MenuItemCHistory
    msgbox(0, "", $sHistory)

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

    Case $MenuItemOptionen
    Optionen()

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

    Case $GUI_EVENT_PRIMARYDOWN ;Test
    ;_SendMessage($aHandleGUIElement[4], $WM_SYSCOMMAND, $SC_DRAGMOVE, 0) ;Test
    ConsoleWrite("Linker Mausbutton gedrückt" & @CRLF)
    $iMouseButtonLeft = 1

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

    Case $GUI_EVENT_PRIMARYUP ;Test
    ;_SendMessage($aHandleGUIElement[4], $WM_SYSCOMMAND, $SC_DRAGMOVE, 0) ;Test
    ConsoleWrite("Linker Mausbutton losgel." & @CRLF)
    $iMouseButtonLeft = 0

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

    Case $GUI_EVENT_SECONDARYDOWN ;Test
    ;_SendMessage($aHandleGUIElement[4], $WM_SYSCOMMAND, $SC_DRAGMOVE, 0) ;Test
    ConsoleWrite("Rechtsklick" & @CRLF)

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

    EndSwitch

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

    ; --- Verhindern, dass sich während des Verschiebens ein anderes GUI-Element angesprochen fühlt -----\
    if $iMouseButtonLeft then ;$sMausXY[2] = 1 then
    $iDoItOnlyOnce += 1
    if $iDoItOnlyOnce > 2 Then ;Integer-Überlauf verhindern.
    $iDoItOnlyOnce =2
    EndIf
    Else
    $iDoItOnlyOnce = 0
    EndIf
    ; --- Verhindern, dass sich während des Verschiebens ein anderes GUI-Element angesprochen fühlt -----/

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

    if $bGUIRedesign=1 then ;Im Menü wurde der Eintrag zum Umgestalten des GUI aktiviert.
    GUI_Redesign()
    EndIf

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

    WEnd
    #EndRegion Hauptschleife #######################################################################################################/

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

    ; ### Functions ################################################################################################################\
    Func _timeStatus()
    Local $zeit = _DateTimeFormat(_NowCalc(), 5)
    _GUICtrlStatusBar_SetText($idStatusbar, " " & $asWDAYger[@WDAY - 1] & _DateTimeFormat(_NowCalc(), 2), 2)
    _GUICtrlStatusBar_SetText($idStatusbar, " Uhrzeit: " & $zeit, 3)
    EndFunc ;==>_timeStatus
    ; #############################################################################
    Func _ListViewFill($QLite = "SELECT ROWID,* FROM Reparaturverwaltung;")
    Local $hQuery, $aRow
    _GUICtrlListView_DeleteAllItems($ListView)
    ;~ _SQLite_Query(-1, "SELECT ROWID,* FROM Reparaturverwaltung;", $hQuery)
    _SQLite_Query(-1, $QLite, $hQuery)
    While _SQLite_FetchData($hQuery, $aRow, False, False) = $SQLITE_OK ; Read Out the next Row
    GUICtrlCreateListViewItem(_ArrayToString($aRow, '|', 1, 21), $ListView)
    GUICtrlSetBkColor(-1, 0xF0E68C) ; (0xF9F9F9) helles Grau (0xB9D1EA) helles blau (0xF0E68C)
    WEnd
    _SQLite_QueryFinalize($hQuery)
    _GUICtrlListView_RegisterSortCallBack($ListView) ; CallBack registrieren zum sortieren
    EndFunc ;==>_ListViewFill
    ; #############################################################################
    Func _DsDelete() ;Datensatz löschen.
    _SQLite_Exec(-1, "DELETE From Reparaturverwaltung WHERE ID = " & GUICtrlRead($aHandleGUIElement[0]) & ";")
    EndFunc ;==>_DsDelete
    ; #############################################################################
    Func _DsUpdate() ;Datensatz updaten
    _SQLite_Exec(-1, "UPDATE Reparaturverwaltung SET " _
    & "F01 = '" & GUICtrlRead($aHandleGUIElement[1]) & "'," _
    & "F02 = '" & GUICtrlRead($aHandleGUIElement[2]) & "'," _
    & "F03 = '" & GUICtrlRead($aHandleGUIElement[3]) & "'," _
    & "F04 = '" & GUICtrlRead($aHandleGUIElement[4]) & "'," _
    & "F05 = '" & GUICtrlRead($aHandleGUIElement[5]) & "'," _
    & "F06 = '" & GUICtrlRead($aHandleGUIElement[6]) & "'," _
    & "F07 = '" & GUICtrlRead($aHandleGUIElement[7]) & "'," _
    & "F08 = '" & GUICtrlRead($aHandleGUIElement[8]) & "'," _
    & "F09 = '" & GUICtrlRead($aHandleGUIElement[9]) & "'," _
    & "F10 = '" & GUICtrlRead($aHandleGUIElement[10]) & "'," _
    & "F11 = '" & GUICtrlRead($aHandleGUIElement[11]) & "'," _
    & "F12 = '" & GUICtrlRead($aHandleGUIElement[12]) & "'," _
    & "F13 = '" & GUICtrlRead($aHandleGUIElement[13]) & "'," _
    & "F15 = '" & GUICtrlRead($aHandleGUIElement[14]) & "'," _
    & "F15 = '" & GUICtrlRead($aHandleGUIElement[15]) & "'," _
    & "F16 = '" & GUICtrlRead($aHandleGUIElement[16]) & "'," _
    & "F17 = '" & GUICtrlRead($aHandleGUIElement[17]) & "'," _
    & "F18 = '" & GUICtrlRead($aHandleGUIElement[18]) & "'," _
    & "F19 = '" & GUICtrlRead($aHandleGUIElement[19]) & "'," _
    & "F20 = '" & GUICtrlRead($aHandleGUIElement[20]) & "'," _
    & "F21 = '" & GUICtrlRead($aHandleGUIElement[21]) & "'," _
    & "F22 = '" & GUICtrlRead($aHandleGUIElement[22]) & "'," _
    & "F23 = '" & GUICtrlRead($aHandleGUIElement[23]) & "'," _
    & "F24 = '" & GUICtrlRead($aHandleGUIElement[24]) & "'," _
    & "F25 = '" & GUICtrlRead($aHandleGUIElement[25]) & "'," _
    & "F26 = '" & GUICtrlRead($aHandleGUIElement[26]) & "'," _
    & "F27 = '" & GUICtrlRead($aHandleGUIElement[27]) & "'," _
    & "F28 = '" & GUICtrlRead($aHandleGUIElement[28]) & "'," _
    & "F29 = '" & GUICtrlRead($aHandleGUIElement[29]) & "'," _
    & "F30 = '" & GUICtrlRead($aHandleGUIElement[30]) & "'" _
    & "WHERE ID = " & GUICtrlRead($aHandleGUIElement[0]) & ";")
    EndFunc ;==>_DsUpdate
    ; #############################################################################
    Func _DsInsert() ;Neuen Datensatz hinzufügen.
    _SQLite_Exec(-1, "INSERT INTO Reparaturverwaltung VALUES(NULL, '" _
    & GUICtrlRead($aHandleGUIElement[1]) & "','" _
    & GUICtrlRead($aHandleGUIElement[2]) & "','" _
    & GUICtrlRead($aHandleGUIElement[3]) & "','" _
    & GUICtrlRead($aHandleGUIElement[4]) & "','" _
    & GUICtrlRead($aHandleGUIElement[5]) & "','" _
    & GUICtrlRead($aHandleGUIElement[6]) & "','" _
    & GUICtrlRead($aHandleGUIElement[7]) & "','" _
    & GUICtrlRead($aHandleGUIElement[8]) & "','" _
    & GUICtrlRead($aHandleGUIElement[9]) & "','" _
    & GUICtrlRead($aHandleGUIElement[10]) & "','" _
    & GUICtrlRead($aHandleGUIElement[11]) & "','" _
    & GUICtrlRead($aHandleGUIElement[12]) & "','" _
    & GUICtrlRead($aHandleGUIElement[13]) & "','" _
    & GUICtrlRead($aHandleGUIElement[14]) & "','" _
    & GUICtrlRead($aHandleGUIElement[15]) & "','" _
    & GUICtrlRead($aHandleGUIElement[16]) & "','" _
    & GUICtrlRead($aHandleGUIElement[17]) & "','" _
    & GUICtrlRead($aHandleGUIElement[18]) & "','" _
    & GUICtrlRead($aHandleGUIElement[19]) & "','" _
    & GUICtrlRead($aHandleGUIElement[20]) & "','" _
    & GUICtrlRead($aHandleGUIElement[21]) & "','" _
    & GUICtrlRead($aHandleGUIElement[22]) & "','" _
    & GUICtrlRead($aHandleGUIElement[23]) & "','" _
    & GUICtrlRead($aHandleGUIElement[24]) & "','" _
    & GUICtrlRead($aHandleGUIElement[25]) & "','" _
    & GUICtrlRead($aHandleGUIElement[26]) & "','" _
    & GUICtrlRead($aHandleGUIElement[27]) & "','" _
    & GUICtrlRead($aHandleGUIElement[28]) & "','" _
    & GUICtrlRead($aHandleGUIElement[29]) & "','" _
    & GUICtrlRead($aHandleGUIElement[30]) & "');")
    EndFunc ;==>_DsInsert
    ; #############################################################################
    Func _ListView2ipt()
    ;~ MsgBox(0, "Information", "Selected Mark: " & _GUICtrlListView_GetSelectionMark($ListView))
    Local $electionMark = _GUICtrlListView_GetSelectionMark($ListView)
    If $electionMark > -1 Then
    Local $aLVitem = _GUICtrlListView_GetItemTextArray($ListView, $electionMark)
    For $i = 1 To $aLVitem[0]
    ;~ MsgBox(0, "Information", "ItemTextArray: " & $aIpt[$i-1] & " " & $aLVitem[$i])
    GUICtrlSetData($aHandleGUIElement[$i - 1], $aLVitem[$i])
    Next
    EndIf
    EndFunc ;==>_ListView2ipt
    ; #############################################################################
    Func _iptClear()
    For $i = 0 To 30
    GUICtrlSetData($aHandleGUIElement[$i], "")
    Next
    EndFunc ;==>_iptClear
    ; #############################################################################
    ;==========================================================================
    ; Function Name....: _SQLite_CountRows
    ; Description......: Ermittelt die Anzahl von Datensätzen für eine Tabelle
    ; Parameter(s).....: $_sTable Tabellenname
    ; Requirement(s)...: Eine mit _SQLite_Open() geöffnete DB
    ; .................: #include <SQLite.au3>
    ; Return Value(s)..: Erfolg: Anzahl der Datensätze
    ; .................: Fehler: -1 @error = 1, @extended = SQLite-@error
    ; Author(s)........: BugFix ([email='bugfix@autoit.de'][/email])
    ;==========================================================================
    Func _SQLite_CountRows($_sTable)
    Local $hQuery, $aQuery, $iRet = 0, $iErr
    If $SQLITE_OK <> _SQLite_Query(-1, "SELECT count(*) FROM " & $_sTable & ";", $hQuery) Then
    $iErr = _SQLite_ErrCode()
    _SQLite_QueryFinalize($hQuery)
    Return SetError(1, $iErr, -1)
    EndIf
    While _SQLite_FetchData($hQuery, $aQuery) = $SQLITE_OK
    $iRet = $aQuery[0]
    WEnd
    _SQLite_QueryFinalize($hQuery)
    ;MsgBox(0, "", $iRet)
    ;~ Return $iRet
    GUICtrlSetData($aCtrlipt[0], $iRet)
    EndFunc ;==>_SQLite_CountRows
    ; #############################################################################
    Func _DB_BackUp()
    Local $BackUpFolder = @ScriptDir & "\_BackUps"
    If Not FileExists($BackUpFolder) Then DirCreate($BackUpFolder)
    Local $hFileOpen = FileOpen($BackUpFolder & "\" & @YEAR & "-" & @MON & "-" & @MDAY & "_BuchVw.db.txt", 2)
    If $hFileOpen = -1 Then Exit MsgBox(0, "Fehler", "Die Datei konnte nicht geöffnet werden.")

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

    Local $aResult, $iRows, $iColumns
    Local $iRval = _SQLite_GetTable2d(-1, "SELECT * FROM Reparaturverwaltung;", $aResult, $iRows, $iColumns) ;Variablen doppelt deklariert (siehe Vorzeile).

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

    FileWriteLine($hFileOpen, $sListViewHeader)

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

    For $iR = 1 To $iRows
    $sText = ""
    For $iC = 0 To $iColumns - 1
    $sText &= $aResult[$iR][$iC]
    If $iC < $iColumns - 1 Then $sText &= "|"
    Next
    FileWriteLine($hFileOpen, $sText)
    Next
    FileClose($hFileOpen)
    MsgBox(64, "Info", "DB BackUp ist fertig !", 3)
    EndFunc ;==>_DB_BackUp
    ; #############################################################################
    Func Stringbreite($sT_Lbl)
    ; Ermittelt die Breite des Strings in Pixeln.
    ; Basiert auf folgender Quelle:
    ; TextMeter
    ; Dank an den User "BugFix"!
    Local $nText = $sT_Lbl
    Local $aFont[8] = [8,0,'Courier New',10,400,0,0,0]
    Local $gui

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

    If $nText = '' Then Return
    ;_GDIPlus_Startup()
    Local $hFormat = _GDIPlus_StringFormatCreate(0)
    Local $hFamily = _GDIPlus_FontFamilyCreate($aFont[2])
    Local $hFont = _GDIPlus_FontCreate($hFamily, $aFont[3], $aFont[1], 3)
    Local $tLayout = _GDIPlus_RectFCreate(15, 171, 0, 0)
    Local $hGraphic = _GDIPlus_GraphicsCreateFromHWND($gui)
    Local $aInfo = _GDIPlus_GraphicsMeasureString($hGraphic, $nText, $hFont, $tLayout, $hFormat)
    Local $iWidth = Ceiling(DllStructGetData($aInfo[0], "Width"))
    ;Local $iHeight = Ceiling(DllStructGetData($aInfo[0], "Height"))
    ;_GDIPlus_StringFormatDispose($hFormat)
    ;_GDIPlus_FontDispose($hFont)
    ;_GDIPlus_FontFamilyDispose($hFamily)
    ;_GDIPlus_GraphicsDispose($hGraphic)
    ;_GDIPlus_ShutDown()
    ;GUICtrlSetData($inHeight, $iHeight)
    ;GUICtrlSetData($inWidth, $iWidth)
    Return $iWidth
    ;MsgBox(0, "", $iWidth)
    EndFunc
    ; #############################################################################
    Func Optionen()
    ;MsgBox(0, "Optionen", "Hallo")
    ;$aHandleGUIElement[$iGUI_ElementNr]
    $bGUIRedesign = BitXOR($bGUIRedesign, 0x1) ;Binärwert von $bGUIRedesign toggeln.
    if $bGUIRedesign=1 then ;Im Menü wurde der Eintrag zum Umgestalten des GUI aktiviert.
    MsgBox(0, "", "" _
    & "Sie können nun einzelne Bedienelemente" _
    & @CRLF & "mit der Maus verschieben." _
    & @CRLF & "Zum Beenden diesen Menüeintrag erneut anwählen!")
    EndIf
    EndFunc
    ; #############################################################################
    FUNC GUI_Redesign()
    ; Ermöglicht es, ein einzelnes GUI-Element mit der Maus zu verschieben.

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

    $sUserMessageNew=""

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

    ; --- Ermitteln, über welchem GUI-Element der Hauszeiger hoovert. ---------------\
    ;if $iDoItOnlyOnce = 1 then
    For $iGUI_ElementNr = 0 to Ubound($asGUI_Element)-1
    $avGUI_Parameter=Stringsplit($asGUI_Element[$iGUI_ElementNr], "|") ;Aufgesplittete Parameter
    ;$aRect = _GUICtrlHeader_GetItemRect($aHandleGUIElement[$iGUI_ElementNr], 3) ;$iGUI_ElementNr) ;test
    ;if $aHandleGUIElement[$iGUI_ElementNr]
    if $sMausXY[0] > $avGUI_Parameter[2] and $sMausXY[0] < ($avGUI_Parameter[2]+$avGUI_Parameter[4]) and $sMausXY[1] > $avGUI_Parameter[3] and $sMausXY[1] < ($avGUI_Parameter[3]+$avGUI_Parameter[5])then
    ;msgbox(0, "", "Rechteck: " & $aRect[0])
    ;if $sMausXY[0] > $aRect[0] and $sMausXY[0] < $aRect[2] then ; and $sMausXY[1] > $aRect[1] and $sMausXY[1] < ($aRect[1]+$aRect[3])then
    $sUserMessageNew="Feld-Nr. " & $iGUI_ElementNr
    ;_GDIPlus_GraphicsDrawLine($hGraphic, $center + $x1, $center + $y1, $center + $x2, $center + $y2, $hPen) ;quadrat
    ExitLoop
    EndIf
    Next
    ;EndIf
    ; --- Ermitteln, über welchem GUI-Element der Hauszeiger hoovert. ---------------/

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

    ;GUICtrlSetPos($aHandleGUIElement[1], 20, 20)

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

    if $sUserMessageNew <> $sUserMessageOld then
    _GUICtrlStatusBar_SetText($idStatusbar, $sUserMessageNew, 1)
    $sUserMessageOld=$sUserMessageNew
    EndIf

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

    if $iMouseButtonLeft then ;$sMausXY[2] = 1 then
    GUICtrlSetPos($aHandleGUIElement[$iGUI_ElementNr], $sMausXY[0], $sMausXY[1])
    ;GUICtrlSetFont($aHandleGUIElement[$iGUI_ElementNr], 12, 400, 0, "Arial")
    ;BitXOR $SS_SUNKEN
    EndIf

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

    ; --- test ----
    ;Switch GUIGetMsg()
    ; Case $GUI_EVENT_PRIMARYDOWN
    ; _SendMessage($aHandleGUIElement[4], $WM_SYSCOMMAND, $SC_DRAGMOVE, 0)
    ;Case $ribbonexit, -3
    ;Exit
    ;EndSwitch
    ; --- test ---

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

    EndFunc ;GUI_Redesign
    ; #############################################################################
    Func _Exit() ;Datenbank schließen und Programmende.
    _GUICtrlListView_UnRegisterSortCallBack($ListView)
    _SQLite_Close($g_db_Database)
    _SQLite_Shutdown()
    _GDIPlus_ShutDown()
    Exit
    EndFunc ;==>_Exit
    ; ### Functions ################################################################################################################/

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

    ;$maus_x = -(MouseGetPos(0) - $center)
    ;$maus_y = (MouseGetPos(1) - $center)
    ;_GDIPlus_GraphicsDrawLine($hGraphic, $center + $x1, $center + $y1, $center + $x2, $center + $y2, $hPen) ;quadrat
    ; Local $mpos = GUIGetCursorInfo() ;Mauskoordinaten relativ zum Fenster.

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit]
  • Best Practise: Dokumente als Ausgabe generieren

    • Code-Jack
    • 6. Juni 2016 um 22:34

    Wie wäre es, HTML auszugeben?
    Wenn man die meisten Formatierungen in eine CSS auslagert, dann ist der Aufbau der HTML betont einfach und das Generieren des Formulars ist mit ein paar simplen String-Befehlen erschlagen.
    Einfach die sich gelegentlich ändernden Werte per Stringmanipulation einflechten und gut.

    Ein Web-Browser ist garantiert überall vorhanden und ins Formular könnte man sogar noch Späße wie einen "Senden"-Button einbauen. Also falls man dem Kunden eine papierlose Rechnung zukommen lassen möchte, deren Erhalt er dann direkt bestätigt etc. etc.

    Ich programmiere ja derzeit an meiner Reparaturauftragsverwaltung, aus der ich später auch Rechnungen drucken will; schließlich sind da bereits alle notwendigen Daten erfasst!
    Hoffe, bald endlich mein verhasstes Lexware kicken zu können!
    Dazu hatte ich die HTML-Ausgabe ins Auge gefasst. Simpel zu erzeugen und ausreichend Gestaltungsmöglichkeiten.

    Die CSS kann man dann schön komfortabel mit einem dafür vorgesehenen WYSIWYG-Programm verändern, ohne endlos in Quelltexten herumparametrieren zu müssen, bis alles halbwegs so aussieht, wie es soll.

  • Hilfe - Barcode-Scanner

    • Code-Jack
    • 6. Juni 2016 um 21:31

    Der Thread ist zwar schon nicht mehr ganz frisch, aber ich denke, es gibt ein paar grundsätzlich erwähnenswerte Hinweise zu Scanner-Problemen:

    1) Man vergewissere sich, ob der Scanner so konfiguriert wurde, dass er am Ende wirklich CRLF sendet und nicht nur CR, oder LF.
    Oder gar LFCR ...
    Es ist eine sehr gute Idee und hat sich bestens bewährt, den Output eines Scanners zunächst mit einem geeigneten Terminalprogramm (bei seriellen Scannern) zu überprüfen, das auch Hexdarstellung beherrscht!
    Nur ein in Hex dargestellter String lügt nicht!
    "HTerm" ist dazu bestens geeignet: http://www.der-hammer.info/terminal/
    (Für USB-Scanner vielleicht direkt in einen Hexmonitor scannen).
    Man überprüfe penibel sowohl die exakte Anzahl der Zeichen, als auch das korrekte Zeilenende!

    2) Anschließend vergewissere man sich, dass das Programm, das den String empfängt, auch wirklich das gleiche Zeilenende haben will, das der Scanner sendet.
    Denn wenn der Scanner CRLF sendet, das jeweilige Programm aber bereits mit CR glücklich ist, dann wandert das "überflüssige" LF als führendes Zeichen in den nächsten String! Der nächste Barcode stimmt dann folglich nicht mehr, weil sich alles um ein Zeichen verschiebt.

    3) CRLF vom Scanner ist zwar praktisch, aber auch gefährlich! Ich hatte mal den Fall, dass Anwender meines Artikelverwaltungsprogrammes über ständigen Datenverlust klagten. 1000 Artikel gescannt, aber am Ende nur rund 800 neue Artikel in der Datenbank und solche Späße.
    Des Rätsels Lösung, der ich erst auf die Schliche kam, als ich den Leuten mal beim Arbeiten zusah: Der Bediener hatte zwischendurch einen Artikel aus der Datenbank gelöscht und den Mauszeiger einfach auf dem "Löschen"-Button stehen gelassen ...
    Da der Scanner am Ende CRLF sendete, was den Button "betätigte"(!) wurde mit jedem weiteren Scan daher ein weiterer Artikel aus der DB gelöscht!
    Und die Leute haben es gar nicht bemerkt, sondern einfach "blind" weiter gescannt!
    (Die Dialogbox "Löschen bestätigen" ist zuvor natürlich wegkonfiguriert worden, "weil die dauernd nervte"!)

    4) Man berücksichtige den Fall, dass das, was vom Scanner kommt, nicht unbedingt EAN-13 ist.
    Bei manchen Artikeln kommen auch (zumeist) kürzere, oder (seltener) längere Barcodes zum Einsatz.
    Das empfangende Programm darf dann nicht stur auf eine bestimmte Zeichenzahl eingestellt sein.

    Erst wenn all das überprüft wurde, kann man sich gezielt ans Programmieren machen, andernfalls erlebt man womöglich immer wieder tolle Überraschungen.

  • AutoIt und Arduino

    • Code-Jack
    • 5. Juni 2016 um 22:10
    Zitat von Andy

    Klein , es belegt immerhin die Hälfte des verfügbaren Speichers^^

    Ja muttu den 12E nehmen, der kostet nicht mehr, bietet aber 4 MB, statt 256 kB.


    Zitat von Andy

    Btw. wg dem Spannungsteiler und "Niederohmig", dir sagt ein 1-OHM-Leistungswiderstand was? Den hatte ich vor einigen Jahrzehnten "erfunden", da ich (Oscar hat den "fehlenden" Shunt angesprochen) damals kein Geld für ein Amperemeter hatte, aber ein "altes" (analoges) Voltmeter hatte. 1 Ohm war der absolute Knaller, ich habe einfach auf dem Meßgerät das V mit nem A überklebt, und hatte mein "Amperemeter" incl. komplett übernommener Skala. Für meine Belange war das Teil einwandfrei

    Ja, solche Tricks muss ich mir auch immer wieder mal aus dem Ärmel schütteln, wenn ich auf 'nem Service-Einsatz bei 'nem Kunden bin und ein dringend benötigtes Teil nicht vorhanden ist, die Maschine aber unbedingt wieder laufen soll.
    Da wird dann schon mal ein Toaster in 'nen Lastwiderstand umfunktioniert und so.
    Ich merke schon: Hier sind gestandene Praktiker unter sich! :)


    Zitat von Andy

    Übrigens konnte ich "früher" an keinem Sperrmüllhaufen vorbeigehen, ohne nach alten Radios und Fernsehern (das waren die Dinger mit der Bildröhre^^) zu gucken,

    Wilkommen im Club! :)
    Ich war ja sooo traurig, als damals (Mann, ist das schon lange her!) die Sperrmüll-Entsorgung umgestellt wurde!
    Und ich habe im Keller noch immer kistenweise auf solche Weise ergatterte Schätze.
    Aber ich wurde ruhiger, als ich anfing ernsthaft Geräte zu konstruieren. Da kommt bei mir der Perfektionist durch; alles muss Industriequalität sein und reichlich überdimensioniert & auf Langlebigkeit getrimmt. Niemals wäre ich je auf die Idee gekommen, bei solchen Projekten Krempel aus der Bastelkiste zu verbauen!
    Also bunkern die "Schätze" weiter im Keller, vielleicht darf ich sie ja eines Tages mit ins Grab nehmen ...


    Zitat von Andy

    Hat jemand eine Idee, wie ich das zerschossene Filesystem des ESP überschreiben/flashen könnte?

    Öh, einfach formatieren und das Basic neu flashen!?!
    Falls das nicht klappt, nimm mal das schick unkomplizierte Progi, mit dem man NodeMCU flasht. Das hat eine vertrauenserweckende Formatierroutine dabei:
    http://randomnerdtutorials.com/flashing-nodem…-using-windows/

    Spätestens danach sollte sich das Basic neu flashen lassen und dann dürfte auch das Filesystem wieder in Ordnung sein.


    Zitat von Andy

    Ich bin mittlerweile echt vom Basic begeistert, so wie es aussieht, wird da auch permanent dran gearbeitet und verbessert!

    Das freut mich sehr!
    Ja, dieses Basic ist auf so wundervoll charmante Art spartanisch und macht dennoch alles, was es muss. Und das auf maximal komfortable Weise!
    Ich wäre wirklich ser traurig, wenn ich doch genötigt wäre, auf das von mir so ungeliebte Arduino zu wechseln, wenn ich die Stabilitätsprobleme nicht in den Griff kriegen sollte.
    Jeden Abstrich, den ich von diesem genialen "over-the-air"-Prinzip machen müsste, würde ich als sehr schmerzhaft empfinden!

    Aber momentan ruht die ESP-Thematik bei mir. Ich hatte einen Interessenten dafür, der aber abgesprungen ist. Derzeit programmiere ich mir an meiner Reparaturverwaltung in AutoIt die Finger wund.

    Und an dieser Stelle möchte ich mal ein ganz dickes DANKE ins Forum brüllen!
    - Ich habe hier "von den üblichen Verdächtigen" jede Menge großartiger Routinen gefunden, mit teilweise total raffinierten Lösungsansätzen, auf die ich kaum jemals selbst gekommen wäre!
    Also da überkam mich schon so manche Woge der Dankbarkeit, beim nächtlichen Surfen, wenn ich die vielen Beispiele ausprobierte. Manchmal juckt es mich in den Fingern, unter etliche Threads ein überschwengliches Dankes-Posting zu setzen, aber ich verkneife es mir, um die Threads damit nicht aufzublähen, ohne was fachkundiges beizusteuern.
    Die Power-User mögen aber versichert sein: Ihre Beiträge werden beachtet und wirklich sehr, sehr wertgeschätzt!!!


    Zitat von Andy

    heute geht erstmal die Bestellung für 10 weitere 01er raus

    Ehrlich: Das verstehe ich jetzt nicht!
    Für ungefähr 2,60 EUR bekommst Du den guten -12E:
    http://www.ebay.de/itm/10pcs-ESP8…GUAAOSwNSxVdYD8

    Und für unter 6,- EUR bekommst Du Varianten des damit bestückten NodeMCU-Boards:
    http://www.ebay.de/itm/NodeMCU-Lu…-0AAOSw9N1V2-Ww

    Bzw. für etwa 5,50 EUR den doppelstöckigen Witty:
    http://www.ebay.de/itm/ESP8266-Se…iEAAOSwhDdXEJa0

    Da ist auf der (einzeln einsetzbaren) oberen Platine bereits ein Spannungsregler, 'ne RGB-LED, ein Lichtsensor und 'ne Stromversorgungsbuchse (USB-Mini) drauf.
    Die untere Platine dient nur zum Flashen und kann später weggelassen werden. Sie beinhaltet den USB-Seriell Baustein.

    Wenn Du natürlich aus konkretem Grund partout beim -01 bleiben willst, dann will ich Dir das nicht wegdiskutieren. Aber ich erwähne mal ganz dezent ein weiteres Mal die besseren Alternativen, falls deren Vorteile irgendwie doch noch nicht so voll zu Dir vorgedrungen sein sollten.

    Und ein weiterer Vorteil, der bislang noch nicht zur Sprache kam, sei hiermit explizit erwähnt:
    Der -12E hat eine FCC-Zulassung! Damit darf legal gefunkt werden!
    Auf den -01 trifft das nicht zu!

    Guggsu hier:
    http://www.esp8266.com/wiki/doku.php?…6-module-family

    Außerden sei darauf hingewiesen, dass vom -01 mal Chargen mit viel zu niedrigen Widerständen auf den Markt gelangten.
    Zitat von obiger Website:
    Note: Some batches of this module ship with LED Current limiting resistors of the wrong value (47Ohm vs 4.7KOhm). This usually results in the power LED vanishing in a puff of smoke.

    Angeblich gab es sogar mal Chargen des -01mit verkehrt herum eingelöteter LED ...


    Der -12E ist der Nachfolger des Nachfolgers des Nachfolgers ... mit diversen Verbesserungen, höherer Reichweite und ausgemerzten Kinderkrankheiten.
    Ich will all das nur noch mal erwähnt haben, falls noch nicht zu Dir durchgedrungen. Aber es ist natürlich Deine Entscheidung ...

  • AutoIt und Arduino

    • Code-Jack
    • 5. Juni 2016 um 15:55

    Hallo Andy,

    zunächst mal vielen Dank, für diesen umfangreichen Erfahrungsbericht!

    Zitat von Andy

    Das ESP hängt sich bei Datenübertragungen ab und zu auf. Die blaue LED, welche bei Datenübertragungen und beim Booten ab und zu flackert, ist dauerhaft am leuchten, der ESP beendet die Funktion als AP (abgestürzt/aufgehängt)


    Ich glaube, das hatte ich in dieser Form noch nie.


    Zitat von Andy

    Der Reset per "Reset-Pin" funktioniert übrigens nicht?!


    Ja, der Reset-Pin des ESP ist eben NICHT wirklich der Reset. Das ist da so eine bekannte Sonderbarkeit des ESP.
    Es ist ein anderer Pin, den man für einen Reset verwenden muss, ich weiß aber gerade aus dem Kopf nicht, welcher das beim ESP8266-01 ist. Muttu mal Tante Google befragen.


    Zitat von Andy

    auf Button "View" klicken, und "langsam" wird im Browser die JPG angezeigt


    Wegen dem "langsam" erinnere ich erneut an das bereits erwähnte "delayed ACK"; ein Problem, das unter jeder Windows-Version auftritt und durch zwei Einträge in der Registry beseitigt werden kann (steht in meinem Forum).
    Der Internet-Explorer (und nur der!) umschifft das Problem von sich aus, auch ohne Registry-Gefummel.

    Das Problem unter anderen Browsern hat seine Ursache in dem vom ESP verwendeten uIP. Es ist auf Größe und geringen Speicherbedarf optimiert.
    uIP arbeitet erst dann weiter, wenn es vom PC das ACK empfangen hat und sendet so lange keine weiteren Pakete, sondern wartet stur auf das ACK.
    Und Windows verzögert das Senden dieses ACK, weil es nicht ahnt, dass am anderen Ende eine so minimalistische Hardware hängt.

    Der Registry-Fix scheint keine Nebenwirkungen zu haben, ist also zu empfehlen.

    Unter Android (Smartphone) war bei mir die Datenübertragung vom/zum ESP immerhin schneller, als unter ungefixtem Windows, aber ebenfalls zu langsam. Da wüsste ich aber nicht, wie ich das delayed ACK abstellen könnte und war bislang zu faul zum Recherchieren.

    Nach dem Registry-Fix sollte Dein kleines Bild in 1-2 Sekunden geladen sein.


    Zitat von Andy

    habe ich ein 5V/2A Steckernetzteil per Spannungsteiler auf 3.3 V gebracht (vorsichtshalber doch Stützkondensatoren (1000µF-Elko, 100µF-Folien und einen von den "schnellen kleinen" 1µF )


    Du hast ernsthaft den ESP an einen (immerhin per Kondensatoren gestützten) Spannungsteiler gehängt?
    Da müssen Deine Widerstände ja mindestens 10x niederohmiger sein, als der Innenwiderstand des ESP, sonst hast Du Spannungseinbrüche.
    OK, die Kondensatoren puffern das ein gutes Stück, aber überprüfe mal lieber die Spannung am ESP mit dem Speicheroszi.

    Und ich erwähne es nochmals: Steckbretter sind für solche Sachen nicht brauchbar!
    Die Dinger sind eine ewige Problemquelle, das ist bekannt. Und das liegt nicht allein an der "Zuverlässigkeit" der Kontakte (und den Verbindungen der Leitungen, nimm mal die Schrumpfschläuche ab!). Sondern jeder Draht ist auch eine Induktivität und so weiter. Da passieren "tolle" Sachen ...
    Also immer 'nen Spannungsregler nehmen, dessen Ausgang auf kürzestem Wege an den ESP LÖTEN und dort noch zusätzlich die Stützkondensatoren hin, um jeden Zweifel an der Spannungsversorgung zu beseitigen.
    Vor den Spannungsregler wiederum ein weiterer, fetter Elko und ein Folienkondensator.
    DAMIT kann man dann Experimente machen.

    Gerade wenn man Stabilitätsproblemen auf die Schliche kommen will, müssen die vielfältigen Probleme, die fliegende Aufbauten auf Steckbrettern nun mal verursachen, gründlich beseitigt werden, sonst hat es gar keinen Sinn.


    Zitat von Andy

    habe ich dann das Filesystem zerschossen...fragt mich nicht wie, die *.bas-Programme wurden zerschossen angezeigt, die Dateien waren nicht mehr zu löschen, es kam auch im Editor die Meldung "gespeichert", aber beim anschließenden reload waren die Dateien unbrauchbar, wurden also nicht überschrieben.


    Das ist mir noch nie passiert. Wäre für mich plausibel, dass so etwas durch unzureichende Stromversorgung verursacht wird.
    Wie wir ja wissen, zieht der ESP keinen gleichmäßigen Strom, wie ein Widerstand es zweifelsfrei tut. Sondern er zieht den Strom gepulst, wobei Peaks zwischen 300 und 400mA auftreten können.
    Der Durchschnittsstrom, den ein Multimeter anzeigt, mag ja zwischen 70 - 100mA liegen, aber die fiesen, schmalen Strompeaks sind halt ein Problem.
    Die zusätzlichen Kondensatoren machen da eine Menge wieder gut und beseitigen insbesondere die Induktivität der Zuleitung ganz gut. Aber perfekt kann es halt nur dann werden, wenn der ESP auf kürzestem Weg an einem aktiven Spanungsregler gehängt wird, statt an einen passiven Widerstands-Spannungsteiler.

  • AutoIt und Arduino

    • Code-Jack
    • 3. Juni 2016 um 03:15

    Danke Alizame,

    ich werde das dann echt mal probieren.
    Obwohl es sich quasi wie "Feindberührung" anfühlt, etwas zu installieren, das mit "C" zu tun hat! ;)

    Aber erlaube die Rückfrage, ob Du schon mal größere Datenmengen übertragen hast?
    Also nicht nur "LED1 = On", oder "Get ADC" und so, sondern Datenmengen, deren Übertragung mindestens 10 Sekunden dauert (und wo ein Fehler zudem auch bemerkt werden würde).

    Und gleich noch eine Frage an Dich:
    Beim Basic für den ESP ist es so, dass ich nur ein einiges Mal das Modul per Kabel mit dem PC verbinden muss. Fortan geht alles, also auch jedes Programmupdate, per WLAN.
    Geht das mit Arduino ebenfalls so schnuckelig? Oder müssen die kompilierten Binarys jedes Mal per Kabel aufs Modul geflast werden?

  • AutoIt und Arduino

    • Code-Jack
    • 1. Juni 2016 um 23:00
    Zitat von Oscar

    Und ich habe bewusst nur mit der USB-Stromversorgung getestet, weil das (bei mir zumindest) die instabilste Variante ist.


    Das macht auch absolut Sinn; so rein um sich mal ans Limit heran zu tasten.
    Obwohl ich für so einen Test dann eher ein Labornetzteil genommen hätte, mit einstellbarer Strombegrenzung.


    Zitat von Oscar

    Ich denke, die meisten Probleme (von denen im Netz berichtet wird) entstehen, weil eben keinerlei Stabilisierung benutzt wird


    Das glaube ich nicht. Der ESP braucht schon stabile 3,3V (die exakte Untergrenze steht im Datenblatt). Ungeregelt wird da wohl keiner drauf gehen. Woher sollte eine ungeregelte Spannung dieser Höhe kommen, wenn nicht aus 'nem Stabi?
    So eine Lösung wie zwei Stück 1,5V Batterien in Reihe wären zumindest denkbar. Dann liefe der ESP mit leichter Unterspannung (zumindest so lange die Batterien noch gut voll sind). Das wäre dann noch halbwegs mit einem Stabi vergleichbar, wegen dem schön niedrigen Innenwiderstand der Spannungsquelle.
    Läuft halt nur nicht allzu lange.


    Zitat von Oscar

    Die Stromversorgung über USB reicht (Normalverbrauch: 70mA), wenn man die Peaks entsprechend abfängt.


    Meine bescheidene Erfahrung lehrt: So hart am Limit sollte man nicht konstruieren!
    Wenn unvermeidbar, dann sollte man das bei maximaler Prozessorleistung des ESP testen, bei zugleich maximaler WLAN-Verwendung, unter maximal zu erwartender Außentemperatur.
    Sicherheitshalber auch noch bei minimaler zu erwartender Außentemperatur (Kältespray, unter Vermeidung von Kondenswasser).
    Erst dann weiß man genau genug, worauf man sich einlässt.
    Deine 70mA kommen mir jedenfalls ziemlich niedrig vor.
    Der WLAN-Kram soll den Prozessor nur zu etwa 20% auslasten. Der Rest steht dem Anwendungsprogramm zur Verfügung. Wenn Du da nun Fraktale berechnen lässt und nebenbei die Bilddaten per WLAN streamst, dann ist sicherlich mit einem höheren Strom zu rechnen.
    Das sind dann die Fälle, wo bei unzureichender Stromversorgung nur gelegentlich Aussetzer auftreten, je nachdem, was der ESP gerade treibt.


    Zitat von Oscar

    Mit externem 3.3V Spannungsregler (plus Kondensatoren) hatte ich noch nie Probleme. Das lief bisher immer stabil.


    Ich wiederum, hatte schon einen ziemlichen Leidensweg, trotz Stabi. Und ich weiß bis heute nicht, woran es liegt.
    Getestet habe ich bislang ausschließlich mit dem Witty, der ja einen 3,3V-Regler schon bestückt hat. Und das unter den Programmiersprachen LUA/NodeMCU und unter Basic.
    An die Arduino-IDE habe ich mich noch nicht heran getraut, weil ich das Ding irgendwie nicht mag. Nach reichlich Forenlektüre kristallisiert sich bei mir aber (leider) der Eindruck heraus, dass Arduino wohl für den deutlich stabilsten Betrieb sorgt (warum auch immer).

    Wenn ich mal wieder in Testlaune bin, werde ich mir mal verschiedene Entwicklungsboards aus der NodeMCU-Reihe vorknöpfen (obwohl ich den Witty für soooo schlecht designt gar nicht halte). In Foren wird jedenfalls von unterschiedlicher Zuverlässigkeit der verschiedenen Entwicklungsboards berichtet - ich fand nur noch keinen, der mal Ross & Reiter konkret beim Namen nennt.

    Mein Freund Hubert (ein wirklich erstklasiger Elektroniker und Datentechniker!) hatte mit ESP so viel Kummer, dass er für ein vermarktbares Produkt schließlich auf ein WLAN-Modul von Atmel wechselte. Das Ding soll zwar übel kompliziert gewesen sein, verglichen mit ESP, dafür gab es damit bislang Null Schwierigkeiten.
    Das macht schon nachdenklich, wenn dieser Erfahrungsbericht aus derart kompetentem Munde kommt ...

    Ich habe den ESP aber irgendwie lieb und würde nur zu gerne dabei bleiben; wenn ich doch nur endlich mal die Ursache für die Stabilitätsprobleme finden und beseitigen könnte. Bei anderen Anwendern läuft es doch auch, Menno ey!
    So als ob da bei Arduino/C irgend was optimiert wäre, gegenüber anderen Programmiersprachen. Aber es ist halt bislang nur so eine Impression, ich weiß es einfach nicht konkret.

  • AutoIt und Arduino

    • Code-Jack
    • 31. Mai 2016 um 22:04

    Danke für die Mühe Oskar.
    Aber der Erkenntnisgewinn ist mager, weil genau das eingetreten ist, was auch zu erwarten war.
    Ein USB-Seriell-Adapter ist nicht geeignet, den Strombedarf des ESP zu stillen.
    Das heißt: Doch, es reicht so gerade eben ... wenn man reichlich puffert, so dass die Strompeaks genügend weitgehend gedämpft werden.
    Aber wenn der USB-Port durch den FT232 nur für das Liefern von 100mA konfiguriert ist, dann ist schon der ganze Ansatz verwurmt, wenn man doch weiß, dass die Last (wenn auch nur gepulst) mehr braucht.

    Interessanter ist die Frage, ob (und unter welchen Umständen) auch bei niederohmiger Spannungsquelle vor 'nem 3,3V Regulator Probleme auftauchen können.
    Bei pulsartigem Stromfluss können sich bei manchen Stabis unter seltenen Umständen lusige Hochschaukel-effekte ergeben, weil der Stabi halt etwas braucht, um nachzuregeln.
    Um die Schwingneigung zu unterdrücken (immerhin ist ein Stabi ein Verstärker), spendiert man dem Stabi Kondensatoren am Eingang und Ausgang, wovon wiederum der am Ausgang der wichtigere ist.

    Ein Elko ist schön, aber er ist recht träge. Um hohe Frequenzen besser zu unterdrücken, schaltet man da zusätzlich immer noch 'nen flotten Kerko parallel. Noch besser: Mehrere, unterschiedlich große Kondensmänner, wenn man es denn richtig gut machen will.
    Und die Kondensmänner gehören auf kürzestem Wege direkt an den Stabi. Weiterhin sollte auch die Last (also der ESP) 'nen eigenen Entkoppelkondensator erhalten. Wiederum auf kürzestem Wege. Und auch hier würde ich wieder Elko und Kerko parallel schalten.

    Die Verbindung vom Stabi zur Last mag ja nur kurz sein, aber auch ein paar Zentimeter Leiterbahnlänge können einem mitunter schon gehörig in die Suppe spucken, mit ihrer Induktivität.

    Man kann beim Layouten einer Platine eine Menge Mist bauen, wenn man solche Dinge nicht beachtet.
    Steckbretter sind in meinen Augen ohnehin weitgehend nutzlose Dinge, aber ich rolle immer mit den Augen, wenn ich im Internet Steckbrett-Aufbauten mit dem doch ziemlich kritischen ESP8266 sehe! Das ist ein kleines Wunder, wenn so etwas mal funktioniert, aber ich würde niemals davon ausgehen, dass dieses Wunder eintritt.

    Bei Dir stellt sich noch die Frage, WO du gemessen hast?
    Interessant ist eigentlich nur, was direkt an den Versorgungseingängen des ESP passiert.
    Wenn Du am Ausgang des Seriell-Adapers gemessen haben solltest, und dann noch ein halber Meter Kabel (womöglich gar über Steckbrett-Kontakte) zum ESP führt, dann kann es sein, dass es dort noch wesenltich dramatischer aussieht.

    Wahrscheinlich weißt Du all das, aber es ging für mich aus Deinem Posting nicht hervor, weswegen ich es vorsichtshalber erwähne.

  • AutoIt und Arduino

    • Code-Jack
    • 31. Mai 2016 um 13:02

    Der ESP8266-01 ist das reine Funkmodul, ohne 3,3V-Stabi, ohne Taster, ohne sonstwas.
    Du musst für Deine Feldversuche also zunächst mal basteln; Dich selbst um eine gute Spannungsversorgung kümmern und so. Steckbretter sind dazu nicht zu empfehlen (trotz zahlreicher Beispiele im Internet), denn dazu ist das Thema Spannungsversorgung zu kritisch, bei dem Ding.
    Dann noch die Taster und Widerstände anschließen und vielleicht eine, oder zwei LEDs ...

    Für nur 1,50 EUR mehr bekommst Du ein komplettes Entwicklungssystem wie Witty, oder eines der Module aus der NodeMCU-Reihe, womit Du direkt loslegen kannst (ist alles in meinem Forum verlinkt).
    Diese Platinchen sind allesamt nur unwesentlich größer, als das reine Funkmodul, aber USB-Buchse, Stabi, Taster, LEDs ... alles schon drauf.

    Witty & Co. sind zudem bereits mit dem -12E bestückt, der nicht nur mehr Speicher & I/O hat, sondern wo auch die kleinen Kinderkrankheiten des -01 ausgemerzt sind.

    Später, nachdem Deine Versuche erfolgreich waren, wirst Du wohl sowieso ein eigenes Platinenlayout erstellen müssen. Da macht es absolut Sinn, dann genau das Modul einzusetzen, mit dem man auch getestet hatte.
    Es würde eine zusätzliche Fehlerquelle bedeuten, wenn Du Dich dann erst an dieser Stelle für den -12E entscheiden solltest, weil da eben doch ein paar Dinge anders sind, in die man sich erst hineindenken müsste.

    Mit dem -12 hättest Du eine geringere Bauhöhe, gegenüber dem -01 weil dessen zweireihige Stiftleiste entfällt.
    Und wenn Du beim Testen vielleicht doch ein paar LEDs mehr anschließen willst, um mal ein paar Debugsignale auszugeben, dann guckst Du beim -01 in die Röhre, wenn all dessen Pins bereits für die normale Funktionsausführung belegt sind.

    Es ist natürlich Dir überlassen, aber mir fällt wirklich gar kein Grund ein, warum man den -01 einsetzen sollte, wenn die in mehrfacher Hinsicht besseren Nachfolger keinen Groschen mehr kosten.
    Sowohl für die schnellen Erstversuche, als auch für die spätere Serienproduktion, haben die Nachfolgemodelle nur Vorteile.
    Unter den fertigen Entwicklungssystemen, zu rund 5,- EUR (Witty), mag eines dabei sein, dass Dir später sogar das Layouten einer Platine erpart - es ist ja bereits alles bestückt, was man so braucht. Ein nachkaufbares, steckbares Wegwerfteil. Nix Lagerhaltung, nix Produktionskosten.

  • AutoIt und Arduino

    • Code-Jack
    • 30. Mai 2016 um 22:41

    Das ist doch einfach nur das schrottige ESP8266-01.
    also die erste Version, mit wenig Speicher und sehr wenigen I/O.

    Ich würde eher den ESP8266-12E empfehlen. 4MB Speicher, mehr I/O.

    Aber die 3,3V aus USB reichen so oder so nicht, wenn die vom FT232 kommen. Der ESP benötigt eine stromkräftige 3,3V Versorgung. Die kann zwar aus dem USB-Port kommen, aber nur dann, wenn der Port so konfiguriert ist, dass er 500mA liefert (statt 100mA).

    Der Witty (wie auch die diversen NodeMCU-Boards) hat den 3,3V-Regler schon on Board. Und die drei Taster. Und 'ne RGB-LED ... und er ist so layoutet, dass man die Taster gar nicht braucht, zum Flashen. :)
    Lese doch mal die drei Seiten dieses Threads:http://edv-dompteur.de/forum/index.php?page=Thread&threadID=239

  • AutoIt und Arduino

    • Code-Jack
    • 30. Mai 2016 um 14:15
    Zitat von Andy

    wenn du im Posting einen Text zitieren willst, markierst du diesen mit der Maus und dann sollte ein Popup erscheinen, in welchem du die Wahl "Zitate speichern|Zitate einfügen haben solltest.
    Das mit den "Zitaten einfügen funktioniert ab und zu nicht, dann geh auf "Zitate speichern". Nun sollte unten rechts auf dem Bildschirm ein Feld "Zitate()" erscheinen. Wenn du dort draufklickst, sollten die Zitate auswählbar und auch einzufügen sein!

    Gestern hat er mir partout immer das komplette Posting zitiert, trotzdem ich zuvor (wie gewohnt) die einzelnen Zitate markiert und gespeichert hatte. Hatte es fünf Mal probiert, bis ich aufgab.
    Wenn so was mal passiert, dann kann man in meinem Forum (und jedem anderen Burning Board, das ich kenne) im Editor in den Quelltextmodus wechseln um von Hand nachzuarbeiten.
    Der Quelltextmodus verbirgt sich hier unter "BBCode", doch auch das klappte gesten irgendwie nicht und ich war schon viel zu müde, um mir noch die Zicken zu notieren, um sie später präzise beschreiben zu können. Aber heute klappt's ja ... !?!?!


    Zitat von Andy

    Wenn ich die Beispiele richtig verstehe, dann wird im ESP-Sketch bei jeglicher Änderung der anzuzeigenden Zustände eine komplett neue Website (bzw. Seiten) erstellt und dann auf den Webserver "geladen".

    Spiele mal mit dem Basic, wenn Dein ESP da ist. Da erübrigen sich 1000 Fragen und Du wirst vermutlich überrascht sein, wie genial einfach das ist.


    Zitat von Andy

    Na schaumamal was das gibt, wenn ich mir "dynamisch" Werte anzeigen lassen will...

    Dat geit!
    Der Königsweg bei hoch dynamsichen Werten ist natürlich der mit den Websockets, weil da wirklich nur die Werte neu angezeigt werden und sonst nix. Aber das ist dann doch recht "advanced"; probiere zuvor mal die einfacheren Beispiele, b. B. die schicke Analoguhr. Oder die WS28xx-Ansteuerung.

    Welches Modul hast Du eigentlich bestellt? Den Witty? Oder eines dieser diversen NodeMCU-Boards?

  • AutoIt und Arduino

    • Code-Jack
    • 30. Mai 2016 um 05:12

    Andy, ich bin jetzt über den Yandex-Browser drin, statt Firefox.
    Damit wird alles korrekt dargestellt und es ist auch alles anwählbar. Aaaaber (neue Baustelle): ich verzweifle bald an der Bedienung des hiesigen Beitragseditors.
    (Ich will das hier & jetzt aber nicht vertiefen - wollte nur endlich aus Dein Posting antworten; wenn auch ohne Zitate, denn die gelingen mir hier nicht)

    Mein Firefox, mit dem ich sonst arbeite, ist ebenfalls uralt (Version 28) und wird bewusst von mir nicht upgedatet.
    U. a. mein eigenes Forum (die gute, alte V3.1.7 von Burning Board) läuft damit aber anstandslos; wie auch so ziemlich alles, was ich sonst noch ansurfe (bin täglich viele Stunden im Netz).
    Wenn gaaanz selten mal eine Website klemmt, dann greife ich zum Yandex: https://de.wikipedia.org/wiki/Yandex.Browser
    Der richtet es dann zuverlässig.
    Leider bin ich ansonsten an den alten Feier-Focks gefesselt, denn die irrsinnig vielen Lesezeichen von dort lassen sich partout nicht woanders (oder in neuere FF-Versionen) importieren. Irgendwie ist die Datenbank schadhaft; läuft aber innerhalb der 28er Version tadellos.
    Ulkig: Selbst dort lässt sich der eigene(!) Lesezeichen-Export nicht wieder importieren; funzt in keinem der beiden möglichen Formate. Versteh' einer die Frauen und die Computer ...

    Zur Elektronik:
    1000 Mikrofarad müssen nicht zwangsweise groß sein. Die gibt's auch im Package 0804, bei 3,3V. Ich habe aber tatsächlich dickere Dinger drin.
    Mit dem Oszi habe ich schon geschaut (olles Hameg, HM605 - 60MHz). Da konnte ich aber nicht den kleinsten Hinweis auf Schwierigkeiten entdecken.

    Es wäre sicher interessant für uns beide, wenn wir mal 'nen Kreuztest machen: Du testest das ESP8266 Basic und ich die Arduino-IDE. Mal sehen, ob und wo Stabilitätsschwierigkeiten auftreten, bei Verwendung von reichlich WLAN-Transfer.
    Gemeinsam kommen wir dem Problem vielleicht auf die Schliche!

  • bitte um Beispiel Webserver-Code, um an diesen gesendete Daten zu bearbeiten

    • Code-Jack
    • 30. Mai 2016 um 04:26

    Andy, schau Dir doch noch mal das ESP8266 Basic an, das ich kürzlich schon verlinkt hatte:
    http://www.esp8266basic.com/

    Installiere spaßeshalber mal den Interpreter (eine Datei flashen und fertig) und dann werfe einen Blick ins dortige Forum.

    Da sind etliche (unglaublich schlanke!) Beispielcodes, die auf dem ESP laufen und per Webinterface mit dem PC/Smartphone kommunizieren.
    Löse Dich einfach mal von der Idee, dass dazu tiefes Gewühle in HTML / PHP / JavaScript notwendig wäre, nebst dem eigenhändigen Aufsetzen eines Webservers. Nein, das geht auch richtig minimalistisch, mit 20 Zeilen Quellcode und so.
    Der auf den ESP geflashte Interpreter IST ja bereits ein Webserver! So ganz von sich aus.


    Natürlich würde es mich wiederum interessieren, ob Du meine Stabilitätsprobleme nachvollziehen kannst und ob die womöglich unter Arduino nicht auftreten.
    Aber Du solltest Dir wirklich mal das Prinzip anschauen, wie man mit diesem Basic-Interpreter arbeitet und alles per Webinterface erledigt. Das ist derart kompakt und derart einsteigerfreundlich simpel, dass man es kaum glauben kann!
    Sozusagen die Quadratwurzel aus AutoIt! :)


    Wenn es spääääter mal um richtig schnelle Datenauswertung gehen sollte, dann kommen übrigens Websockets ins Spiel.
    Damit geht dann sowas, wie ein Remote-Oszilloskop: https://www.youtube.com/watch?v=8ISbmQTbjDI
    Aber das ist schon sehr abgefahren.

  • Alinas_SQLite_BuchVw

    • Code-Jack
    • 29. Mai 2016 um 06:37

    Wie schon ja "angedroht", baue ich derzeit ein eigenes Programm, das auf der prima Code-Vorlage von RR04 aufbaut (vielen Dank an RR04!).

    Bevor ich dazu einen eigenen Thread starte, wollte ich zunächst noch einmal meinen derzeitigen Stand der Umbauarbeiten hier im Thread zu Alinas Bücherverwaltung mit Euch teilen.
    Denn NOCH hat das Programm Ähnlichkeit mit RR04s Fundament und ich dachte mir, dass mein Code-Stil (den ich für übersichtlich halte) vielleicht Anregungen liefert.

    Großartig neue Features sind noch nicht hinzu gekommen - mal abgesehen von der Menüleiste.
    Meine Arbeit bestand hauptsächlich darin, den Code (nach meinem Ermessen) ein gutes Stück übersichtlicher und leichter pflegbar zu gestalten (wodurch er schon reichlich angewachsen ist).
    - Ein Prozess, der zwar noch nicht ganz abgeschlossen ist, aber meine nächsten Umbauten werden den Code so stark verändern, dass er mit Alinas Bücherverwaltung nicht mehr viel zu tun hat. Und ich wollte Alina noch die Chance geben, was zu verwerten, falls ihr etwas brauchbar erscheint.
    Denn in der jetzigen Form scheint es mir eine schon ziemlich gute Basis für ähnlich gelagerte Aufgaben zu sein.

    Soweit ich neue Variablen eingefügt habe, hielt ich mich an die hier im Forum empfohlenen Konventionen.

    Die Erzeugung der Musterdatensätze erfolgt nun wirklich nur dann, wenn die Datenbankdatei noch nicht existiert. Damit gab es Anfangs ja ein Problem ...
    Allerdings werden bereits jetzt Datensätze für eine Reparaturverwaltung erzeugt, statt für eine Bücherverwaltung. Die Textboxen sind aber daran noch nicht angepasst und noch an Ort und Stelle. Auch die Anzahl der Felder habe ich derzeit noch nicht verändert (jedoch deren Breite und Textausrichtung in der ListView); Alina wird also den jetzigen Stand ganz leicht wieder an ihre Bedürfnisse anpassen können.

    Hoffentlich ist meine Danksagung, die per Menü aufrufbar ist, ausreichend, um die Vorarbeit von RR04 und BugFix angemessen zu würdigen?
    - Sonst meckert, dann intensiviere ich meine Lobpreisungen!

    Vorschau auf die nahe Zukunft (dann in einem eigenen Thread):
    Mein nächster Umbau wird sein, dass die Oberflächengestaltung aus einer Datei geladen wird, damit man nicht so viel im Quelltext herumwühlen muss, um das GUI umzugestalten.
    Außerdem implementiere ich weitere Ansichten, z. B. eine Vollbilddarstellung für die ListView-Tabelle.
    Später kommt noch eine relationale Verknüpfung mit einer Adressdatenbank und einer Geräte-Datenbank hinzu.
    Weiterhin wird für jeden Reparaturauftrag ein Ordner erzeugt werden, der Bilder, Datenblätter und sonstige Dateien beinhalten kann, die dann per Verknüpfung aus dem Programm flott aufrufbar sind.
    Langfristig kommen noch diverse Druckfunktionen für Formulare (Reparaturannahme-Beleg) und gaaanz später die Möglichkeit, Rechnungen zu drucken (hier wird es aber langsam komplex, ich weiß!).

    Ich habe also Groooßes vor; wir werden noch miteinander zu tun haben! :)

    Quellcode
    [autoit]

    #Region Header #################################################################################################################\
    ; Erstellt mit AutoIt-Version v3.3.14.2

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

    Global Const $sProgrammname = "Reparaturverwaltung"
    Global Const $sVersion = "0.06"
    Global Const $sRevisionsdatum = "29.05.2016"
    Global Const $sAutor = "EDV-Dompteur, Stefan Denk"
    Global Const $sWebsite = "http://www.EDV-Dompteur.de"

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

    ; --- P r o g r a m m b e s c h r e i b u n g -----------------------------------------------------------------------------\
    Global Const $sAbout = "Programmname: " & $sProgrammname & @CRLF & "Version: " & $sVersion & @CRLF & "Autor: " & $sAutor & @CRLF & "Website: " & $sWebsite & @CRLF _
    & @CRLF & "P r o g r a m m b e s c h r e i b u n g" _
    & @CRLF & "---------------------------------------" _
    & @CRLF & "Die hier vorliegende Software ist Freeware, also zur kostenlosen Nutzung freigegeben!" _
    & @CRLF & "Das Programm dient kleinen Reparaturbetrieben dazu, den Überblick über ihre ausgeführten Arbeiten zu behalten." _
    & @CRLF & "Die Details einer jeden Reparatur werden in einem eigenen Datensatz einer SQLite-Datenbank gespeichert." _
    & @CRLF & "Eine Übersicht, in Form einer frei sortierbaren Liste, ermöglicht es rasch nach Datum, Kunde, Gerät etc. zu sortieren."
    ; --- P r o g r a m m b e s c h r e i b u n g -----------------------------------------------------------------------------/

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

    ; --- History -------------------------------------------------------------------------------------------------------------\
    Global Const $sHistory = "" _
    & @CRLF & "D a n k s a g u n g:" _
    & @CRLF & "----------------------" _
    & @CRLF & "Die Code-Vorlage, auf der dieses Programm aufbaut, stammt vom User ""RR04"", aus dem großartigen Forum http://www.AutoIt.de" _
    & @CRLF & "Hier der Foren-Thread mit der Ursprungsversion:" _
    & @CRLF & "https://autoit.de/index.php/Thread/83862-Alinas-SQLite-BuchVw/" _
    & @CRLF & "Vielen Dank an ""RR04"", für die tolle Vorarbeit, die mir sicherlich mehrere Tage Arbeit erspart hat!" _
    & @CRLF _
    & @CRLF & "Weiterhin enthielt bereits die Vorlage von ""RR04"" eine Routine von ""BugFix"" ([email='bugfix@autoit.de'][/email]), namens ""_SQLite_CountRows""" _
    & @CRLF & "Besagte Routine dient dazu, die Anzahl der Datensätze in der SQL-Datenbank zu ermitteln." _
    & @CRLF & "Vielen Dank daher auch an ""BugFix""!" _
    & @CRLF & "" _
    & @CRLF & "Ab hier beginnen nun die Änderngen und Erweiterungen durch Fa. EDV-Dompteur, Stefan Denk:" _
    & @CRLF _
    & @CRLF & "H i s t or y:" _
    & @CRLF & "-------------" _
    & @CRLF & "V0.01 vom 28.05.2016:" _
    & @CRLF & "- Programm umbenannt und erste Umgestaltungen der Quelltext-Vorlage von RR04." _
    & @CRLF & "- Programmbeschreibung und History im Quelltext-Header implementiert; derart, dass auch eine Ausgabe dieser Texte möglich wird." _
    & @CRLF & "- Die Tabelle wird nun bei Programmstart automatisch mit Datensätzen gefüllt (wenn DB noch nicht vorhanden, wird sie zuvor erzeugt)." _
    & @CRLF _
    & @CRLF & "V0.06 vom 29.05.2016:" _
    & @CRLF & "- Der ListView-Header ist nun eine Variable, zwecks späterer Möglichkeit zum Einlesen aus einer ini-Datei." _
    & @CRLF & "- Die Beispiel-Datensätze der usprünglichen Reparaturverwaltung umgestrickt auf die Belange einer Reparaturverwaltung." _
    & @CRLF & "- Die Feldbezeichner der SQL-Datenbank verallgemeinert, zwecks leichterer Modifizierbarkeit." _
    & @CRLF & "- Neue Datenfelder definiert: Projektordner, Gesprächsnotiz, Reparaturbericht." _
    & @CRLF & "- Bugfix: Nach dem letzten Quelltext-Umbau wurden Datensätze nicht mehr aktualisiert, nach entsprechender Button-Betätigung." _
    & @CRLF & "- Programmbeschreibung und History werden jetzt mit Zeilenumbrüchen formatiert ausgegeben." _
    & @CRLF & "- Bugfix: Datenfeld 20 wurde nicht mit aktualisiert, nach dem Editieren eines Datensatzes." _
    & @CRLF & "- Menüleiste hinzugefügt. Funktionen: Exit, Programminfo, History (der Menüzweig ""Einstellungen"" ist noch ohne Funktion)." _
    & @CRLF & "- Listview: Spaltenbreiten und Textausrichtung eingestellt. Erste Vorbereitung für späteres Laden der Werte aus ini-Datei."
    ; --- History -------------------------------------------------------------------------------------------------------------/

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

    ; --- Aktuelle Aufgaben ---------------------------------------------------------------------------------------------------\
    Global Const $sProgrammieraufgaben = "" _
    & @CRLF & "Folgende drei Darstellungsmodi implementieren: Kombi (Tabelle und Datensatz, wie gehabt), Tabelle (volle Größe), Datensatz (ohne Tabelle)" _
    & @CRLF & ""
    ; --- Aktuelle Aufgaben ---------------------------------------------------------------------------------------------------/

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

    #include <Date.au3>
    #include <GUIConstantsEx.au3>
    #include <GuiListView.au3>
    #include <GuiStatusBar.au3>
    #include <GUIConstantsEx.au3>
    #include <ComboConstants.au3>
    #include <GuiListView.au3>
    #include <String.au3>
    #include <SQLite.au3>
    #include <sqlite3101_dll.au3>

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

    #include <EditConstants.au3> ;Test
    #include <Array.au3> ;Test
    #EndRegion Header ##############################################################################################################/

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

    #Region Constanten & Variablen deklarieren und belegen #########################################################################\
    ; --- Globale Constanten deklarieren --------------------------------------------------------------------------------------\
    Global Const $asWDAYger[7] = ["Sonntag, ", "Montag, ", "Dienstag, ", "Mittwoch, ", "Donnerstag, ", "Freitag, ", "Samstag, "]
    ; --- Globale Constanten deklarieren --------------------------------------------------------------------------------------/

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

    ; --- Globale Variablen deklarieren ---------------------------------------------------------------------------------------\
    Opt("MustDeclareVars", 1) ;Zwingt den Programmierer, Variablen ordentlich zu deklarieren, vor der ersten Benutzung.
    Global $cboSerch, $iptSerch, $FormKombiansicht, $Label, $ListView, $ContextMenu, $MenuItem, $btnUpdate, $btnDelete, $iptSearch
    Global $cboSearch, $btnSearch, $btnDBladen, $btnClear, $lblBottomLine, $btnSave, $btnBackUp, $Result, $sDatenbankVollpfad
    Global $sTmp, $sText
    Global $sListViewHeader
    ; --- Globale Variablen deklarieren ---------------------------------------------------------------------------------------/

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

    ; ---Globale Variablen mit Werten belegen ---------------------------------------------------------------------------------\
    $sDatenbankVollpfad = @ScriptDir & "\Reparaturverwaltung.rr04"
    ; ---Globale Variablen mit Werten belegen ---------------------------------------------------------------------------------/
    #EndRegion Constanten & Variablen deklarieren und belegen ######################################################################/

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

    #Region Bedienoberfläche zeichnen ##############################################################################################\
    ; --- Fenster & Menü erzeugen-----------------------------------------------------------\
    Global $FormKombiansicht = GUICreate($sProgrammname, 1200, 768, 10, 10) ;Das Hauptfenster erzeugen.
    ; --- Menüzweig 1 ------------------------------------------------------------\
    Global $MenuA = GUICtrlCreateMenu("Datei")
    Global $MenuItemAExit = GUICtrlCreateMenuItem("Schließen", $MenuA)
    ; --- Menüzweig 1 ------------------------------------------------------------/

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

    ; --- Menüzweig 2 ------------------------------------------------------------\
    Global $MenuB = GUICtrlCreateMenu("Einstellungen")
    Global $MenuItemB04 = GUICtrlCreateMenuItem("Optionen", $MenuB)
    ; --- Menüzweig 2 ------------------------------------------------------------/

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

    ; --- Menüzweig 3 ------------------------------------------------------------\
    Global $MenuC = GUICtrlCreateMenu("?")
    Global $MenuItemCProgramminfo = GUICtrlCreateMenuItem("Programminfo", $MenuC)
    Global $MenuItemCHistory = GUICtrlCreateMenuItem("History && Danksagung", $MenuC)
    ; --- Menüzweig 3 ------------------------------------------------------------/
    ;GUISetState(@SW_SHOW) ;??? Was macht dieser Befehl?
    ; --- Fenster & Menü erzeugen-----------------------------------------------------------/

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

    ; --- Programmname darstellen ----------------------------------------------------------\
    $Label = GUICtrlCreateLabel("~ ~ ~ " & $sProgrammname & " Version: " & $sVersion & " ~ ~ ~", 0, 8, 1125, 28, 0x01) ; $SS_CENTER=0x01
    GUICtrlSetFont(-1, 16, 800, 0, "Arial")
    GUICtrlSetColor(-1, 0x0000FF)
    ; --- Programmname darstellen ----------------------------------------------------------/

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

    ; --- Liestview aufbauen --------------------------------------------------------------------------------------------------\
    ; ---- Headerzeile der ListView --------------------------------------------------------\
    $sListViewHeader= "" _
    & "ID" _
    & "|Annahme" _
    & "|Abholung" _
    & "|Gerät" _
    & "|Schadenskürzel" _
    & "|Firma" _
    & "|Vorname" _
    & "|Nachname" _
    & "|Endpreis" _
    & "|Re-Nr." _
    & "|Anzahl." _
    & "|Leihteile" _
    & "|Voranschlag" _
    & "|ReklaDat" _
    & "|Projektordner" _
    & "|Gesprächsnotiz" _
    & "|Reparaturbericht" _
    & "|17" _
    & "|18" _
    & "|19" _
    & "|20"
    ; ---- Headerzeile der ListView --------------------------------------------------------/

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

    ; --- Listwiew erzeugen ----------------------------------------------------------------\
    Global $aHeader = StringSplit($sListViewHeader, '|')
    $ListView = GUICtrlCreateListView($sListViewHeader, 0, 40, 1125, 220)
    GUICtrlSetBkColor(-1, 0xFFFFFF) ; Color weiß
    GUICtrlSetBkColor(-1, $GUI_BKCOLOR_LV_ALTERNATE)
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    ; --- Listwiew erzeugen ----------------------------------------------------------------/

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

    ; --- Spaltenbreiten und Textausrichtung der Listview-Spalten festlegen ----------------\
    Global $GetHandleLV = GUICtrlGetHandle($ListView)
    _GUICtrlListView_SetColumn($GetHandleLV, 0, $aHeader[1], 40, 1) ;ID
    _GUICtrlListView_SetColumn($GetHandleLV, 1, $aHeader[2], 80, 0) ;Annahmedatum
    _GUICtrlListView_SetColumn($GetHandleLV, 2, $aHeader[3], 70, 0) ;Abholdatum
    _GUICtrlListView_SetColumn($GetHandleLV, 3, $aHeader[4], 120, 0) ;Gerät
    _GUICtrlListView_SetColumn($GetHandleLV, 4, $aHeader[5], 100, 0) ;Schadenskürzel
    _GUICtrlListView_SetColumn($GetHandleLV, 5, $aHeader[6], 110, 0) ;Firma
    _GUICtrlListView_SetColumn($GetHandleLV, 6, $aHeader[7], 110, 1) ;Vorname
    _GUICtrlListView_SetColumn($GetHandleLV, 7, $aHeader[8], 110, 0) ;Nachname
    _GUICtrlListView_SetColumn($GetHandleLV, 8, $aHeader[9], 60, 1) ;Endpreis
    _GUICtrlListView_SetColumn($GetHandleLV, 9, $aHeader[10], 60, 1) ;Rechnungsnummer
    _GUICtrlListView_SetColumn($GetHandleLV, 10, $aHeader[11], 60, 1) ;Anzahlung
    _GUICtrlListView_SetColumn($GetHandleLV, 11, $aHeader[12], 150, 0) ;Leihteile
    _GUICtrlListView_SetColumn($GetHandleLV, 12, $aHeader[13], 60, 1) ;Voranschlag
    _GUICtrlListView_SetColumn($GetHandleLV, 13, $aHeader[14], 70, 0) ;Reklamationsdatum
    _GUICtrlListView_SetColumn($GetHandleLV, 14, $aHeader[15], 100, 0) ;Projektordner
    _GUICtrlListView_SetColumn($GetHandleLV, 15, $aHeader[16], 100, 0) ;Gesprächsnotiz
    _GUICtrlListView_SetColumn($GetHandleLV, 16, $aHeader[17], 100, 0) ;Reparaturbericht
    _GUICtrlListView_SetColumn($GetHandleLV, 17, $aHeader[18], 40, 0)
    _GUICtrlListView_SetColumn($GetHandleLV, 18, $aHeader[19], 40, 0)
    _GUICtrlListView_SetColumn($GetHandleLV, 19, $aHeader[20], 40, 0)
    ; --- Spaltenbreiten und Textausrichtung der Listview-Spalten festlegen ----------------/

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

    $ContextMenu = GUICtrlCreateContextMenu($ListView)
    $MenuItem = GUICtrlCreateMenuItem("Datensatz bearbeiten", $ContextMenu)
    ; --- Liestview aufbauen --------------------------------------------------------------------------------------------------/

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

    ; --- Main Area -----------------------------------------------------------------------------------------------------------\
    ; --- Buttons, Labels und Inputfelder erzeugen -------------------------------\
    Global $aCtrlLabel[21], $aCtrlInput[21]
    $aCtrlLabel[0] = GUICtrlCreateLabel($aHeader[1], 10, 272, 150, 22)
    $aCtrlInput[0] = GUICtrlCreateInput("0", 170, 272, 180, 26)
    ;
    For $i = 1 To 6
    $aCtrlLabel[$i] = GUICtrlCreateLabel($aHeader[$i + 1], 10, 272 + $i * 35, 150, 22)
    $aCtrlInput[$i] = GUICtrlCreateInput($i, 170, 272 + $i * 35, 360, 26)
    Next
    ;
    For $j = 7 To 12
    $aCtrlLabel[$j] = GUICtrlCreateLabel($aHeader[$j + 1], 10 + Mod($j, 2) * 290, 515 + Int(($j - 7) / 2) * 35, 150, 22)
    $aCtrlInput[$j] = GUICtrlCreateInput($j, 170 + Mod($j, 2) * 240, 515 + Int(($j - 7) / 2) * 35, 120, 26)
    Next
    ;
    For $k = 13 To 19
    $aCtrlLabel[$k] = GUICtrlCreateLabel($aHeader[$k + 1], 620, 272 + ($k - 13) * 33, 120, 22)
    $aCtrlInput[$k] = GUICtrlCreateInput($k, 750, 272 + ($k - 13) * 33, 120, 26)
    Next
    ;
    For $m = 0 To 19
    GUICtrlSetFont($aCtrlLabel[$m], 12, 400, 0, "Arial")
    GUICtrlSetFont($aCtrlInput[$m], 12, 400, 0, "Arial")
    Next
    ;Information
    $aCtrlLabel[20] = GUICtrlCreateLabel($aHeader[20 + 1], 895, 272, 100, 22)
    GUICtrlSetFont(-1, 12, 400, 0, "Arial")
    $aCtrlInput[20] = GUICtrlCreateEdit("Gesprächsnotiz", 895, 300, 217, 160)
    ;
    $btnUpdate = GUICtrlCreateButton("DS Update", 895, 470, 105, 28)
    GUICtrlSetFont(-1, 12, 400, 0, "Arial")
    $btnDelete = GUICtrlCreateButton("DS Löschen", 1010, 470, 105, 28)
    GUICtrlSetFont(-1, 12, 400, 0, "Arial")
    ;Suche
    $iptSearch = GUICtrlCreateInput("Suchen nach >>>", 620, 510, 492, 26)
    GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif")
    $cboSearch = GUICtrlCreateCombo("Annahme", 620, 545, 241, 25, BitOR($GUI_SS_DEFAULT_COMBO, $CBS_DROPDOWNLIST))
    GUICtrlSetData(-1, "Autor|Verlag")
    GUICtrlSetFont(-1, 12, 400, 0, "Arial")
    $btnSearch = GUICtrlCreateButton("Suche starten", 871, 545, 241, 28)
    GUICtrlSetFont(-1, 12, 400, 0, "Arial")
    ;
    $btnDBladen = GUICtrlCreateButton("Datenbank laden", 871, 583, 241, 28)
    GUICtrlSetFont(-1, 12, 400, 0, "Arial")
    $btnClear = GUICtrlCreateButton("Eingabefelder leeren", 620, 583, 241, 28)
    GUICtrlSetFont(-1, 12, 400, 0, "Arial")
    ; --- Buttons, Labels und Inputfelder erzeugen -------------------------------/
    ; --- Main Area -----------------------------------------------------------------------------------------------------------/

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

    ; --- Horizontale, gestrichelte Linie erzeugen -------------------------------\
    Const $trR = _StringRepeat("-", 368)
    $lblBottomLine = GUICtrlCreateLabel($trR, 10, 615, 1110, 8)
    ; --- Horizontale, gestrichelte Linie erzeugen -------------------------------/

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

    ; --- Bottom Area ---------------------------------------------------------------------------------------------------------\
    ; --- Untere Inputfelder erzeugen --------------------------------------------\
    Global $aCtrllbl[3], $aCtrlipt[3], $aLblTxt[3] = ["Auftragsanzahl:", "Ges. Seitenzahl:", "Ges. Buch NP:"]
    For $l = 0 To 2
    $aCtrllbl[$l] = GUICtrlCreateLabel($aLblTxt[$l], 10 + ($l) * 260, 640, 120, 22)
    GUICtrlSetFont(-1, 12, 400, 0, "Arial")
    $aCtrlipt[$l] = GUICtrlCreateInput($l, 140 + ($l) * 260, 638, 120, 26, 0x0002) ; $ES_RIGHT=0x0002
    GUICtrlSetFont(-1, 12, 400, 0, "Arial")
    Next
    ; --- Untere Inputfelder erzeugen --------------------------------------------/

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

    ; --- Button "Datensatz kopieren" erzeugen -----------------------------------\
    $btnSave = GUICtrlCreateButton("DS kopieren", 1010, 635, 105, 28)
    GUICtrlSetFont(-1, 12, 400, 0, "Arial")
    ; --- Button "Datensatz kopieren" erzeugen -----------------------------------/

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

    ; --- Button "Datenbank-Backup" erzeugen -------------------------------------\
    $btnBackUp = GUICtrlCreateButton("DB BackUp", 895, 635, 105, 28)
    GUICtrlSetFont(-1, 12, 400, 0, "Arial")
    ; --- Button "Datenbank-Backup" erzeugen -------------------------------------/
    ; --- Bottom Area ---------------------------------------------------------------------------------------------------------/

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

    ; --- Statusbar am untersten Fensterrand ----------------------------------------------------------------------------------\
    Global $idStatusbar = _GUICtrlStatusBar_Create($FormKombiansicht)

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

    GUISetState(@SW_SHOW)

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

    _timeStatus() ; Funktion aufrufen sofortige einmalige Ausführung nach Programmstart
    AdlibRegister('_timeStatus', 1000) ; Start alle 1000 milisec.

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

    ;ConsoleWrite("_SQLite_LibVersion=" & _SQLite_LibVersion())
    ;ConsoleWrite("Heute ist ein schöner Tag!"& @CRLF)

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

    Global $idStatusbar_PartsWidth[3] = [450, 900, -1]
    _GUICtrlStatusBar_SetParts($idStatusbar, $idStatusbar_PartsWidth)
    _GUICtrlStatusBar_SetText($idStatusbar, " _SQLite_LibVersion = " & _SQLite_LibVersion(), 0)
    _GUICtrlStatusBar_SetText($idStatusbar, " " & $asWDAYger[@WDAY - 1] & _DateTimeFormat(_NowCalc(), 2), 1)
    _GUICtrlStatusBar_SetMinHeight($idStatusbar, 20)
    ; --- Statusbar am untersten Fensterrand ----------------------------------------------------------------------------------/
    #EndRegion Bedienoberfläche zeichnen ###########################################################################################/

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

    #Region SQL starten & Datenbank in Listview laden (DB gegebenenfalls zuerst erzeugen) ##########################################\
    _SQLite_Startup(@ScriptDir & "\sqlite3.dll", False, 1) ; BugFix Idee, da DLL ja nicht mehr mitgeliefert wird
    If @error Then
    $sTmp = "SQLite.dll konnte nicht geladen werden!"
    MsgBox($MB_SYSTEMMODAL, "SQLite Error", $sTmp)
    Exit -1
    EndIf

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

    Local $bTabelleErzeugen = 0
    If Not FileExists($sDatenbankVollpfad) Then
    $bTabelleErzeugen = True
    EndIf

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

    Global $g_db_Database = _SQLite_Open($sDatenbankVollpfad) ;Datenbank öffnen. Falls noch nicht vorhanden, dann erzeugen & öffnen.
    If @error Then
    $sTmp = "Die Datenbank:" & @CRLF & $sDatenbankVollpfad & @CRLF & "konnte nicht geöffnet werden!"
    MsgBox($MB_SYSTEMMODAL, "SQLite Error", $sTmp)
    Exit -1
    EndIf

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

    If $bTabelleErzeugen = True Then
    ; --- Datenbank-Tabelle erzeugen-----------------------------------------------------------------------------------------\
    Global $sDBHeader = "CREATE TABLE IF NOT EXISTS Reparaturverwaltung(ID INTEGER PRIMARY KEY AUTOINCREMENT," _
    & "F01," _ ;Annahme
    & "F02," _ ;Abholung
    & "F03," _ ;Gerät
    & "F04," _ ;Schadenskürzel
    & "F05," _ ;Firma
    & "F06," _ ;Vorname
    & "F07," _ ;Nachname
    & "F08," _ ;Endpreis
    & "F09," _ ;Rechnungsnummer
    & "F10," _ ;Anzahlung
    & "F11," _ ;Leihteile
    & "F12," _ ;Voranschlag
    & "F13," _ ;Reklamationsdatum
    & "F14," _ ;Projektordner
    & "F15," _ ;Gesprächsnotiz
    & "F16," _ ;Reparaturbericht
    & "F17," _
    & "F18," _
    & "F19," _
    & "F20);"
    ; --- Datenbank-Tabelle erzeugen ----------------------------------------------------------------------------------------/

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

    ; --- Mehrere Beispiel-Datensätze erzeugen ------------------------------------------------------------------------------\
    _SQLite_Exec($g_db_Database, $sDBHeader)
    _SQLite_Exec(-1, "INSERT INTO Reparaturverwaltung VALUES(NULL,'16-03-22 11','16-03-22 18','Medion Akoya 731','Buchse defekt','','Herbert','Mustermann','100.00','576','20.00','USB-HDD-Gehäuse','100.00','','','','','','','','');")
    _SQLite_Exec(-1, "INSERT INTO Reparaturverwaltung VALUES(NULL,'16-03-21 12','16-03-22 11','HP dv7','Buchse defekt','RA Rechtsverdreh','Ede','Knastmann','100.00','1039','','','100.00','','','','','','','','');")
    _SQLite_Exec(-1, "INSERT INTO Reparaturverwaltung VALUES(NULL,'16-03-27 16','16-03-28 11','Lenovo 730','Scharnier lose','','Cornelia','Turteltaub','120.00','1038','100.00','','100.00','','','','','','','','');")
    _SQLite_Exec(-1, "INSERT INTO Reparaturverwaltung VALUES(NULL,'16-04-22 09','16-04-27 11','Lenovo 1100','Einschaltproblem','','Waltrude','von der Weide','80.00','1040','10.00','','100.00','','','','','','','','');")
    _SQLite_Exec(-1, "INSERT INTO Reparaturverwaltung VALUES(NULL,'16-06-22 15','16-06-29 11','Toshiba Satellite 50','Stabilitätsproblem','Schokofabrik ABC','Ali','Bahbah','47.50','413','10.00','Leihgerät 4','-','','','','','','','','');")
    _SQLite_Exec(-1, "INSERT INTO Reparaturverwaltung VALUES(NULL,'16-07-22 13','16-07-22 17','Sony Vaio MG3000','Grafikfehler','','','Megenstadter','22.50','-','22.50','','-','','','','','','','','');")
    _SQLite_Exec(-1, "INSERT INTO Reparaturverwaltung VALUES(NULL,'16-03-22 11','16-03-28 15','Lenovo AS200','Sturzschaden','Druckerei Müller','Willybald','Mustermann','100.00','-','','','100.00','','','','','','','','');")
    _SQLite_Exec(-1, "INSERT INTO Reparaturverwaltung VALUES(NULL,'16-01-22 12','16-03-23 15','Toshiba Satellite X20','Flüssigkeitsschaden','','Fridolin','Kaiserschmarrn','90.00','1041','','','100.00','','','','','','','','');")
    _SQLite_Exec(-1, "INSERT INTO Reparaturverwaltung VALUES(NULL,'15-03-22 11','15-04-01 12','MSI XC70S','Buchse defekt','???','','Maienbaum','0.00','-','','','0.00','','','','','','','','');")
    _SQLite_Exec(-1, "INSERT INTO Reparaturverwaltung VALUES(NULL,'16-03-22 16','16-03-23 10','HP HDX18','Flüssigkeitsschaden','Werbeagentur DeLuxe','Veronika','Glitterstrass','1050.79','1042','500.00','','1000.00','','','','','','','','');")
    _SQLite_Exec(-1, "INSERT INTO Reparaturverwaltung VALUES(NULL,'16-05-27 16','','Asus X738','Einschaltproblem','Druckerei Müller','Willybald','Mustermann','','','','','100.00','','','','','','','','');")
    ; --- Mehrere Beispiel-Datensätze erzeugen ------------------------------------------------------------------------------\
    EndIf

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

    _SQLite_CountRows('Reparaturverwaltung')
    _ListViewFill() ;Listview mit den Datensätzen der (nun garantiert vorhandenen und geöffneten) Datenbank-Datei füllen.
    #EndRegion SQL starten & Datenbank in Listview laden (DB gegebenenfalls zuerst erzeugen) #######################################/

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

    #Region Hauptschleife ##########################################################################################################\
    While True
    Switch GUIGetMsg()

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

    Case -3
    _Exit()

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

    Case $ListView
    _GUICtrlListView_SortItems($ListView, GUICtrlGetState($ListView))

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

    Case $btnSave
    _DsInsert()
    _ListViewFill()
    _iptClear()
    _SQLite_CountRows('Reparaturverwaltung')

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

    Case $btnDelete
    _DsDelete()
    _ListViewFill()
    _SQLite_CountRows('Reparaturverwaltung')

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

    Case $btnUpdate
    _DsUpdate()
    _ListViewFill()

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

    Case $btnSearch
    _ListViewFill("SELECT ROWID,* From Reparaturverwaltung WHERE " & GUICtrlRead($cboSearch) & " LIKE '" & GUICtrlRead($iptSearch) & "';")

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

    Case $btnDBladen
    _ListViewFill()

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

    Case $btnClear
    _iptClear()

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

    Case $btnBackUp
    _DB_BackUp()

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

    Case $MenuItem
    _iptClear()
    _ListView2ipt()

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

    Case $MenuItemAExit
    _Exit()

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

    Case $MenuItemCProgramminfo
    msgbox(0, "", $sAbout)

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

    Case $MenuItemCHistory
    msgbox(0, "", $sHistory)
    EndSwitch
    WEnd
    #EndRegion Hauptschleife #######################################################################################################/

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

    ; ### Functions ################################################################################################################\
    Func _timeStatus()
    Local $zeit = _DateTimeFormat(_NowCalc(), 5)
    _GUICtrlStatusBar_SetText($idStatusbar, " Uhrzeit: " & $zeit, 2)
    EndFunc ;==>_timeStatus
    ; #############################################################################
    Func _ListViewFill($QLite = "SELECT ROWID,* FROM Reparaturverwaltung;")
    Local $hQuery, $aRow
    _GUICtrlListView_DeleteAllItems($ListView)
    ;~ _SQLite_Query(-1, "SELECT ROWID,* FROM Reparaturverwaltung;", $hQuery)
    _SQLite_Query(-1, $QLite, $hQuery)
    While _SQLite_FetchData($hQuery, $aRow, False, False) = $SQLITE_OK ; Read Out the next Row
    GUICtrlCreateListViewItem(_ArrayToString($aRow, '|', 1, 21), $ListView)
    GUICtrlSetBkColor(-1, 0xF0E68C) ; (0xF9F9F9) helles Grau (0xB9D1EA) helles blau (0xF0E68C)
    WEnd
    _SQLite_QueryFinalize($hQuery)
    _GUICtrlListView_RegisterSortCallBack($ListView) ; CallBack registrieren zum sortieren
    EndFunc ;==>_ListViewFill
    ; #############################################################################
    Func _DsDelete() ;Datensatz löschen.
    _SQLite_Exec(-1, "DELETE From Reparaturverwaltung WHERE ID = " & GUICtrlRead($aCtrlInput[0]) & ";")
    EndFunc ;==>_DsDelete
    ; #############################################################################
    Func _DsUpdate() ;Datensatz updaten
    _SQLite_Exec(-1, "UPDATE Reparaturverwaltung SET " _
    & "F01 = '" & GUICtrlRead($aCtrlInput[1]) & "'," _
    & "F02 = '" & GUICtrlRead($aCtrlInput[2]) & "'," _
    & "F03 = '" & GUICtrlRead($aCtrlInput[3]) & "'," _
    & "F04 = '" & GUICtrlRead($aCtrlInput[4]) & "'," _
    & "F05 = '" & GUICtrlRead($aCtrlInput[5]) & "'," _
    & "F06 = '" & GUICtrlRead($aCtrlInput[6]) & "'," _
    & "F07 = '" & GUICtrlRead($aCtrlInput[7]) & "'," _
    & "F08 = '" & GUICtrlRead($aCtrlInput[8]) & "'," _
    & "F09 = '" & GUICtrlRead($aCtrlInput[9]) & "'," _
    & "F10 = '" & GUICtrlRead($aCtrlInput[10]) & "'," _
    & "F11 = '" & GUICtrlRead($aCtrlInput[11]) & "'," _
    & "F12 = '" & GUICtrlRead($aCtrlInput[12]) & "'," _
    & "F13 = '" & GUICtrlRead($aCtrlInput[13]) & "'," _
    & "F15 = '" & GUICtrlRead($aCtrlInput[14]) & "'," _
    & "F15 = '" & GUICtrlRead($aCtrlInput[15]) & "'," _
    & "F16 = '" & GUICtrlRead($aCtrlInput[16]) & "'," _
    & "F17 = '" & GUICtrlRead($aCtrlInput[17]) & "'," _
    & "F18 = '" & GUICtrlRead($aCtrlInput[18]) & "'," _
    & "F19 = '" & GUICtrlRead($aCtrlInput[19]) & "'," _
    & "F20 = '" & GUICtrlRead($aCtrlInput[20]) & "'" _
    & "WHERE ID = " & GUICtrlRead($aCtrlInput[0]) & ";")
    EndFunc ;==>_DsUpdate
    ; #############################################################################
    Func _DsInsert() ;Neuen Datensatz hinzufügen.
    _SQLite_Exec(-1, "INSERT INTO Reparaturverwaltung VALUES(NULL, '" _
    & GUICtrlRead($aCtrlInput[1]) & "','" _
    & GUICtrlRead($aCtrlInput[2]) & "','" _
    & GUICtrlRead($aCtrlInput[3]) & "','" _
    & GUICtrlRead($aCtrlInput[4]) & "','" _
    & GUICtrlRead($aCtrlInput[5]) & "','" _
    & GUICtrlRead($aCtrlInput[6]) & "','" _
    & GUICtrlRead($aCtrlInput[7]) & "','" _
    & GUICtrlRead($aCtrlInput[8]) & "','" _
    & GUICtrlRead($aCtrlInput[9]) & "','" _
    & GUICtrlRead($aCtrlInput[10]) & "','" _
    & GUICtrlRead($aCtrlInput[11]) & "','" _
    & GUICtrlRead($aCtrlInput[12]) & "','" _
    & GUICtrlRead($aCtrlInput[13]) & "','" _
    & GUICtrlRead($aCtrlInput[14]) & "','" _
    & GUICtrlRead($aCtrlInput[15]) & "','" _
    & GUICtrlRead($aCtrlInput[16]) & "','" _
    & GUICtrlRead($aCtrlInput[17]) & "','" _
    & GUICtrlRead($aCtrlInput[18]) & "','" _
    & GUICtrlRead($aCtrlInput[19]) & "','" _
    & GUICtrlRead($aCtrlInput[20]) & "');")
    EndFunc ;==>_DsInsert
    ; #############################################################################
    Func _ListView2ipt()
    ;~ MsgBox(0, "Information", "Selected Mark: " & _GUICtrlListView_GetSelectionMark($ListView))
    Local $electionMark = _GUICtrlListView_GetSelectionMark($ListView)
    If $electionMark > -1 Then
    Local $aLVitem = _GUICtrlListView_GetItemTextArray($ListView, $electionMark)
    For $i = 1 To $aLVitem[0]
    ;~ MsgBox(0, "Information", "ItemTextArray: " & $aIpt[$i-1] & " " & $aLVitem[$i])
    GUICtrlSetData($aCtrlInput[$i - 1], $aLVitem[$i])
    Next
    EndIf
    EndFunc ;==>_ListView2ipt
    ; #############################################################################
    Func _iptClear()
    For $i = 0 To 20
    GUICtrlSetData($aCtrlInput[$i], "")
    Next
    EndFunc ;==>_iptClear
    ; #############################################################################
    ;==========================================================================
    ; Function Name....: _SQLite_CountRows
    ; Description......: Ermittelt die Anzahl von Datensätzen für eine Tabelle
    ; Parameter(s).....: $_sTable Tabellenname
    ; Requirement(s)...: Eine mit _SQLite_Open() geöffnete DB
    ; .................: #include <SQLite.au3>
    ; Return Value(s)..: Erfolg: Anzahl der Datensätze
    ; .................: Fehler: -1 @error = 1, @extended = SQLite-@error
    ; Author(s)........: BugFix ([email='bugfix@autoit.de'][/email])
    ;==========================================================================
    Func _SQLite_CountRows($_sTable)
    Local $hQuery, $aQuery, $iRet = 0, $iErr
    If $SQLITE_OK <> _SQLite_Query(-1, "SELECT count(*) FROM " & $_sTable & ";", $hQuery) Then
    $iErr = _SQLite_ErrCode()
    _SQLite_QueryFinalize($hQuery)
    Return SetError(1, $iErr, -1)
    EndIf
    While _SQLite_FetchData($hQuery, $aQuery) = $SQLITE_OK
    $iRet = $aQuery[0]
    WEnd
    _SQLite_QueryFinalize($hQuery)
    ;MsgBox(0, "", $iRet)
    ;~ Return $iRet
    GUICtrlSetData($aCtrlipt[0], $iRet)
    EndFunc ;==>_SQLite_CountRows
    ; #############################################################################
    Func _DB_BackUp()
    Local $BackUpFolder = @ScriptDir & "\_BackUps"
    If Not FileExists($BackUpFolder) Then DirCreate($BackUpFolder)
    Local $hFileOpen = FileOpen($BackUpFolder & "\" & @YEAR & "-" & @MON & "-" & @MDAY & "_BuchVw.db.txt", 2)
    If $hFileOpen = -1 Then Exit MsgBox(0, "Fehler", "Die Datei konnte nicht geöffnet werden.")

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

    Local $aResult, $iRows, $iColumns
    Local $iRval = _SQLite_GetTable2d(-1, "SELECT * FROM Reparaturverwaltung;", $aResult, $iRows, $iColumns)

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

    FileWriteLine($hFileOpen, $sListViewHeader)

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

    For $iR = 1 To $iRows
    $sText = ""
    For $iC = 0 To $iColumns - 1
    $sText &= $aResult[$iR][$iC]
    If $iC < $iColumns - 1 Then $sText &= "|"
    Next
    FileWriteLine($hFileOpen, $sText)
    Next
    FileClose($hFileOpen)
    MsgBox(64, "Info", "DB BackUp ist fertig !", 3)
    EndFunc ;==>_DB_BackUp
    ; #############################################################################
    Func _Exit() ;Datenbank schließen und Programmende.
    _GUICtrlListView_UnRegisterSortCallBack($ListView)
    _SQLite_Close($g_db_Database)
    _SQLite_Shutdown()
    Exit
    EndFunc ;==>_Exit
    ; ### Functions ################################################################################################################/

    [/autoit] [autoit][/autoit] [autoit][/autoit]
  • Code-Jack stellt sich vor

    • Code-Jack
    • 29. Mai 2016 um 05:50

    Vielen Dank für die nette Begrüßung!

    Sicherlich werden wir noch viel Freude miteinander haben!

  • AutoIt und Arduino

    • Code-Jack
    • 28. Mai 2016 um 13:05
    Zitat von Andy

    Wie äußern sich diese Stabilitätsprobleme?

    Verbindungsabbrüche.
    Kleinere Programme kriegt man meistens hochgeleden; mit Pech halt erst beim zweiten, dritten Versuch.
    Doch keine Chance habe ich bei einem dickeren Programm, mit gut 800 Zeilen Quellcode.
    Während der Übertragung wird die Zeilennummer angezeigt, die gerade hochgeladen wird. Und dieser Zähler stoppt - mal bei Zeile 530, mal bei Zeile 243, mal bei Zeile 712, mal bei Zeile 23 ...

    Erster Verdacht fiel auf die Spannungsversorgung. Die soll kritisch sein, weil der ESP zwar einen Durchschnittsstrom von vielleicht 100mA zieht, jedoch schmale Stromspitzen von über 300mA auftreten können (alles frei aus dem Gedächtnis).
    Der Witty ist nach meinem Ermessen nicht ganz opptimal layoutet, also spendierte ich mehrere Stützkondensatoren - Elkos und Kerkos, verschiedener Größe, zusammen über 1000 Mikrofarad; auf kürzestem Weg an die Spannungsversorgungsanschlüsse gelötet.. Doch keine Änderung.
    Dann auf den integrierten 3,3V-Regler gehustet und mein geregeltes, analoges Labornetzgerät angeschlossen (plus die ganzen Kondensatoren). Auch keine Besserung.

    Mit NodeMCU und LUA hatte ich von Anfang an nix als Kummer. Mit dem Basic wurde es dann zumindest besser, immerhin konnte ich jetzt LEDs blinken lassen wie ein Weltmeister und sogar WLAN klappte erstmals. Aber halt mit unregelmäßigen Aussetzern.
    Es wurde wiederum besser, nachdem ich die Firmware meiner Fritz!Box aktualisierte. Aber die Probleme verschwanden niemals ganz, egal was ich alles anstellte.

    Das Beseitigen des delayed-ACK-Problems von Windows entschärfte die Situation abermals, weil die Datenübertragung nun nicht mehr künstlich verzögert wurde. Ein JPG von 1,1 MB ist binnen sieben Sekunden per Browser vom Filesystem des ESP geladen und angezeigt. Aber speziell beim Hochladen von Quellcode lässt sich das Basic-System richtig viel Zeit. Da haben die unregelmäßigen Verbindungsabbrüche dann genug Zeit, um zuschlagen zu können ... :(

    Auch der Test mit dem Smartphone brachte keine Änderung, um Windows mal ganz auszuklammern.
    Und da sehe ich, dass der ESP in der Liste der verfügbaren WLAN-Geräte mal auftaucht, dann kurz weg ist, dann wieder auftaucht ... :(


    Zitat von Andy

    Browser/Betriebssystem?

    Das gute XP, mit Firefox.
    Aber - hey, ich betreibe selbst ein Burning Borad und bin noch in anderen Foren angemeldet (u.a. LEDstyles.de), das ebenfalls Burning Board einsetzt.

    Es sieht aus, wie wenn mein NoScript zuschlagen würde, doch darin habe ich dieses Forum vollkommen freigeschaltet.
    So sieht der Editor bei mir aus (nach dem Öffnen, mit beiden Zitaten):


    Zwischenablage01.jpg

    Ein Klick auf "Erweiterte Antwort" verbessert die Sache leider auch nicht.

    Ich kann ja mal den Yandex-Browser ausprobieren (kennt den wer? Schickes Teil!), denn wenn es dann noch zickt, könnte es an meiner üppigen Hosts-Datei liegen. Nur glaube ich nicht daran.

  • AutoIt und Arduino

    • Code-Jack
    • 27. Mai 2016 um 23:41
    Zitat von Andy

    Wenn ich Schaltungen mit Tastern sehe, die in einer bestimmten Reihenfolge gedrückt/Jumper gesetzt werden müssen, und das ggf. mehrmals so lange bis "es funktioniert", dann frage ich mich ....lassen wir das besser ||

    Hallo Andy,

    schau Dir doch mal das Modul "Witty" an. Dieses Modul ist mit einem ESP8266-12E bestückt und so verschaltet, dass Du gar keinen Taster zu drücken brauchst; jedenfalls nicht unter LUA/NodeMCU und nicht unter ESP8266 Basic (keine Ahnung, wie es bei der Arduino-IDE ist).

    Übrigens musst Du im Idealfall den ESP nur genau ein einziges Mal flashen, fortan geht jedes Programmupdate per WLAN!

    Ich hatte meine ersten Schritte mit NodeMCU und dem ESPlorer gemacht. Irgendwie zickte das aber dauernd, weswegen ich ich dann auf das inzwischen genügend weit entwickelte ESP8266 Basic umgestiegen bin.
    Da habe ich zwar auch noch Probleme (siehe weiter unten), aber ich glaube inzwischen, dass in meiner Wohnung irgend was dazwischen funkt.
    Jedenfalls ist das Basic eine super angenehm simple Sache: Einmal den Interpreter auf das Modul flashen, fortan hat man per Webbrowser Zugriff auf das Ding und sein Dateisystem. Auch Programmupdates gehen auf diesem Wege.

    Es gibt beim ESP übrigens ein doofes Problem, namens "delayed ACK", wenn man unter Windows arbeitet.
    Dieses Problem bewirkt, dass bei größeren Datenmengen (Aufruf eines Bildes vom Webserver etc.) die Datenübertrageng krötenlahm wird.
    Um das zu beheben, sind zwei Änderungen in der Registry notwendig.

    Ich verweise für die Details mal auf einen Thread in meinem eigenen Forum (da schreibe ich entweder als "Desi", oder als "EDV-Dompteur", je nach Zusammenhang):
    http://edv-dompteur.de/forum/index.php?page=Thread&postID=1471#post1471

    Den erwähnten "Witty" findest Du da übrigens ebenfalls verlinkt und beschrieben.

    Bei mir gibt es leider nach wie vor Stabilitätsprobleme mit dem ESP (bzw. Witty), deren Ursache ich noch nicht gefunden habe. Die Spannungsversorgung habe ich schon nach allen Regeln der Kunst verbessert, daran kann es nicht mehr liegen.
    Ich müsste vielleicht mal die Arduino-IDE ausprobieren, aber ich kriege immer sofort Pickel, wenn ich "C"-Code sehe :(
    Jedenfalls wird im Internet dauernd geschwärmt, wie wundervoll stabil die Arduino-IDE mit dem ESP laufen soll.


    P.S.: Bei mir sieht der Beitragseditor in diesem Forum völlig zerschossen aus, obwohl ich alle Scripte freigeschaltet habe. Keine grafischen Symbole in der oberen Leiste und so.
    Kann jemand zu diesem Problem etwas sagen?

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™