Hallo zusammen,
ich schreibe zur Zeit eine Bücherverwaltungsoftware und habe dafür eine GUI erstellt.
Darin enthalten ist ein Tab mit 3 Tabitems: Bücherliste, Suchen, Buch Details.
Wenn man auf den Button "Buch bearbeiten" auf dem Tabitem "Bücherliste" klickt, werden die Details des ausgewählten Buchs aus einer SQLite DB in ein Array kopiert und dessen Inhalt auf die einzelnen Inputboxen des Tabitems "Buch Details" verteilt:
[autoit]
Func _btnListeBearbeitenClicked()
Local $hQuery, $aBuch, $atest[1]
_SQLite_Startup()
If FileExists(@WorkingDir & "\Buchling.db") = 1 Then
$hDB = _SQLite_Open(@WorkingDir & "\Buchling.db")
$aString = _StringBetween(GUICtrlRead(GUICtrlRead($ListeBuchListe),2),"","|")
If IsArray($aString) Then
_SQLite_QuerySingleRow(-1,"SELECT * FROM Buchling WHERE Titel = '"&$aString[0]&"' LIMIT 1;",$aBuch)
GUICtrlSetData($inpErfassenISBN,$aBuch[0])
GUICtrlSetData($inpErfassenTitel,$aBuch[1])
GUICtrlSetData($inpErfassenGenre,$aBuch[2])
GUICtrlSetData($inpErfassenAutor,$aBuch[3])
GUICtrlSetData($inpErfassenVerlag,$aBuch[4])
GUICtrlSetData($inpErfassenErscheinungsjahr,$aBuch[5])
GUICtrlSetData($inpErfassenAusgabe,$aBuch[6])
GUICtrlSetData($inpErfassenTyp,$aBuch[7])
GUICtrlSetData($inpErfassenAnzahlSeiten,$aBuch[8])
GUICtrlSetData($txtErfassenKurzbeschreibung,$aBuch[9])
GUICtrlSetData($txtErfassenLangbeschreibung,$aBuch[10])
GUICtrlSetData($picErfassen,$aBuch[11])
If $aBuch[12] = 0 Then
GUICtrlSetState($chkErfassenVerliehen, $GUI_UNCHECKED)
GUICtrlSetState($lblErfassenVerliehen_am, $GUI_DISABLE)
GUICtrlSetState($lblErfassenVerliehen_an, $GUI_DISABLE)
GUICtrlSetState($dateErfassenVerliehen_am, $GUI_DISABLE)
GUICtrlSetState($cmbErfassenVerliehen_an, $GUI_DISABLE)
Else
GUICtrlSetState($chkErfassenVerliehen, $GUI_CHECKED)
GUICtrlSetState($lblErfassenVerliehen_am, $GUI_ENABLE)
GUICtrlSetState($lblErfassenVerliehen_an, $GUI_ENABLE)
GUICtrlSetState($dateErfassenVerliehen_am, $GUI_ENABLE)
GUICtrlSetState($cmbErfassenVerliehen_an, $GUI_ENABLE)
EndIf
GUICtrlSetData($dateErfassenVerliehen_am,$aBuch[13])
GUICtrlSetData($cmbErfassenVerliehen_an,$aBuch[14])
GUICtrlSetData($inpErfassenLagerort,$aBuch[15])
GUICtrlSetState($tabErfassen, $GUI_SHOW)
EndIf
_SQLite_Close(-1)
EndIf
EndFunc
Wie ihr seht, wechselt die Funktion dann auch zum Tabitem "Buch Details".
Jetzt zu meiner eigentlichen Frage:
Wie schaffe ich es, festzustellen, ob die Inputboxen verändert wurden?
Ich möchte bei Änderungen den aktuell deaktivierten Button "Speichern" aktivieren.
Ich habe mehrere Ansätze versucht:
AdlibRegister <- Problem: ich kann Adlib keine Parameter (wie das vorher erstellte Array $aBuch mitgeben
Beispiel:
..
AdlibRegister("_ISBNChange")
...
Func _ISBNChange()
If GUICtrlRead($inpErfassenISBN,1) <>"" Then
GUICtrlSetState($btnErfassenSave, $GUI_ENABLE)
Else
GUICtrlSetState($btnErfassenSave, $GUI_DISABLE)
EndIf
EndFunc
Das funktioniert, aber eben nur "Feld leer" oder "Feld nicht leer"
Do ... Until - Schleife:
[autoit]
Func _inpErfassenChanged($aBuch)
Dim $aBuchChange[UBound($aBuch)]
Do
$aBuchChange[0] = $inpErfassenISBN
$aBuchChange[1] = $inpErfassenTitel
$aBuchChange[2] = $inpErfassenGenre
$aBuchChange[3] = $inpErfassenAutor
$aBuchChange[4] = $inpErfassenVerlag
$aBuchChange[5] = $inpErfassenErscheinungsjahr
$aBuchChange[6] = $inpErfassenAusgabe
$aBuchChange[7] = $inpErfassenTyp
$aBuchChange[8] = $inpErfassenAnzahlSeiten
$aBuchChange[9] = $txtErfassenKurzbeschreibung
$aBuchChange[10] = $txtErfassenLangbeschreibung
$aBuchChange[11] = $picErfassen
$aBuchChange[12] = $chkErfassenVerliehen
$aBuchChange[13] = $dateErfassenVerliehen_am
$aBuchChange[14] = $cmbErfassenVerliehen_an
$aBuchChange[15] = $inpErfassenLagerort
For $i=0 to UBound($aBuch)-1
If GUICtrlRead($aBuchChange) <> $aBuch[$i] Then
GUICtrlSetState($btnErfassenSave, $GUI_ENABLE)
Else
GUICtrlSetState($btnErfassenSave, $GUI_DISABLE)
EndIf
Sleep(250)
Next
Until 0
EndFunc
Mein Problem ist hier das "Until".
Ich möchte, das die Schleife beendet wird, wenn der User entweder:
- den Tab wechselt
- einen neuen Datensatz beginnt
- die aktuellen Änderungen speichert
Ich muss also meiner Meinung nach herausfinden, ob ein Button oder ein anderer Reiter angeklickt wurde.
Ich steh echt auf dem Schlauch ...
Vielleicht denke ich da mal wieder zu kompliziert um 23 Ecken oder hab ganz profan nen Denkfehler...?
Kann mir da wer helfen oder einen Schubser in die richtige Richtung geben?