GUI Terminkalender mit Passwortabfrage

  • Hi zusammen, habe vorgestern angefangen mit AutoIT zu programmieren (vorher hatte ich 2Monate C++ und C# gemacht) die waren mir aber zu Komplex und ich wollte erstmal hiermit anfangen.


    Habe gestern einen Terminkalender programmiert (mit bischen beihilfe von SEuBo) den ich euch hier mal vorstellen will.

    Der ganze Terminkalender ist Passwortgeschütz und noch net ganz fertig.

    Das standard-Passwort ist "12345".

    Werde hier einfach mal den Code posten und ihr könnt dann ja mal reinschauen.


    [autoit]

    #include <Array.au3>
    #include <GuiListView.au3>
    $input = InputBox("Passwort eingeben", "Bitte geben Sie das Passwort ein", "", "*")
    If $input <> IniRead(@ScriptDir & "\config.ini", "data", "passwort", "12345") Then
    Exit MsgBox(0, "", "Falsches Passwort")
    Else
    If $input = "12345" Then
    $neup = InputBox("Neues Passwort", "Bitte geben Sie ein neues Passwort ein", "", "*")
    IniWrite(@ScriptDir & "\config.ini", "data", "passwort", $neup)
    EndIf
    EndIf
    Opt("TrayMenuMode", 1)
    TraySetClick(16)
    $hMax = TrayCreateItem("Anzeigen")
    $hGhost = TrayCreateItem("Verstecken")
    TrayCreateItem("")
    $hTray = TrayCreateItem("Schliessen")
    $SEC = @SEC
    $GUI = GUICreate("Terminkalender", 440, 400)
    GUISetBkColor(0xFACBAFF)
    $ccal = GUICtrlCreateMonthCal("Kalender", 20, 225, 400, 160)
    GUISetState()
    ;~ Liste für termine
    $cListView = GUICtrlCreateListView("Termin|Beschreibung|Datum|Uhrzeit", 20, 30, 400, 150)
    $hListView = GUICtrlGetHandle($cListView)
    _GUICtrlListView_SetColumnWidth($hListView, 1, 175) ; für Beschreibung abstand
    _GUICtrlListView_SetColumnWidth($hListView, 0, 100) ; für Termin abstand
    ;~ Buttons
    $cNeu = GUICtrlCreateButton("Neu", 20, 2, 100, 20)
    $csave = GUICtrlCreateButton("Speichern", 220, 2, 100, 20)
    $load = GUICtrlCreateButton("Laden", 120, 2, 100, 20)
    $cLoeschen = GUICtrlCreateButton("Löschen", 320, 2, 100, 20)
    $such = GUICtrlCreateInput("", 20, 185, 200, 30)
    $suchGo = GUICtrlCreateButton("Suchen", 240, 185, 100, 30)
    $uhr = GUICtrlCreateLabel(@HOUR & ":" & @MIN & ":" & @SEC, 360, 185, 50, 20)
    ;~ Contextmenü
    $contextmenu = GUICtrlCreateContextMenu($cListView)
    $iNeu = GUICtrlCreateMenu("Neu", $contextmenu)
    $iDel = GUICtrlCreateMenuItem("Löschen", $contextmenu)
    $iEin = GUICtrlCreateMenuItem("Eintrag", $iNeu)

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

    While 1
    $nMsg = GUIGetMsg() ; Fragt ab, was auf der GUI passiert, und speichert das in $nMSg
    Switch $nMsg ; Welchen Wert hat $nMSg grade?
    Case -3 ; $nMsg = -3 [also das X oben rechts]
    Exit
    Case $cNeu, $iEin
    $sInput = InputBox("Neuer Termin", "Bitte Termin eingeben:")
    $sbeschreibung = InputBox("Neuer Eintrag:", "Bitte geben Sie die Beschreibung ein!")
    $suhrzeit = InputBox("Neuer Eintrag:", "Bitte geben Sie die Uhrzeit ein!")
    $sdatum = InputBox("Neuer Eintrag:", "Bitte geben Sie das Datum ein!")
    GUICtrlCreateListViewItem($sInput & "|" & $sbeschreibung & "|" & $sdatum & "|" & $suhrzeit, $cListView)
    Case $csave
    $PathSave = FileSaveDialog("Speichern unter", @DesktopDir, "Textdateien (*.txt)")
    If StringRight($PathSave, 4) <> ".txt" Then $PathSave &= ".txt"
    $aArrayListView = _ListViewToArray()
    _FileWriteFromArray2D($PathSave, $aArrayListView)
    Case $load
    $PathLoad = FileOpenDialog("Datei öffnen", @DesktopDir, "Textdateien (*.txt)")
    Local $ARRAY
    _FileReadToArray2D($PathLoad, $ARRAY, "|")
    _ArrayDelete($ARRAY, 0)
    _GUICtrlListView_AddArray($hListView, $ARRAY)
    Case $cLoeschen, $iDel
    _GUICtrlListView_DeleteItemsSelected($hListView)
    Case $suchGo, $such
    $suchterm = GUICtrlRead($such)
    $gefunden = _GUICtrlListView_FindInText($hListView, $suchterm)
    _GUICtrlListView_ClickItem($hListView, $gefunden)
    EndSwitch
    $TrayMessage = TrayGetMsg()
    Switch $TrayMessage
    Case $hTray
    Exit
    EndSwitch
    If @SEC <> $SEC Then
    $SEC = @SEC
    GUICtrlSetData($uhr, @HOUR & ":" & @MIN & ":" & @SEC)
    EndIf
    WEnd

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

    Func _ListViewToArray()
    Local $iCnt = _GUICtrlListView_GetItemCount($hListView) ; Anzahl der Zeilen auslesen.
    If $iCnt < 1 Then Return SetError(1) ; Falls kein Eintrag, dann Funktion verlassen.
    Dim $aRet[$iCnt][4] ; Array erstellen. Mit genauso vielen Zeilen wie die Listview einträge hat, und 4 Spalten (termin, beschreibung usw)
    For $i = 0 To $iCnt - 1 ; Alle Elemente der Listview in einer For-Next Schleife durchgehen. Wir starten bei 0 (erste Zeile) und hören bei $iCnt-1 auf. (icnt ist ja die anzahl der Zeilen. -1 müssen wir machen, weil die Zeilen ja bei 0 beginnen, und nicht bei 1)
    $aRet[$i][0] = _GUICtrlListView_GetItemText($hListView, $i, 0) ; Kannst dir ja denken ;)
    $aRet[$i][1] = _GUICtrlListView_GetItemText($hListView, $i, 1)
    $aRet[$i][2] = _GUICtrlListView_GetItemText($hListView, $i, 2)
    $aRet[$i][3] = _GUICtrlListView_GetItemText($hListView, $i, 3)
    Next
    Return $aRet ; Array zurückgeben, damit wir den in Zeile 33 in eine Variable speichern können.
    EndFunc ;==>_ListViewToArray
    ;==========================================================================================================================================
    ; Function: _FileWriteFromArray2D($FILEPATH, $ARRAY [, $iROWstart=0 [, $iROWend=0 [, $iCOLstart=0 [, $iCOLend=0 [, $DELIM='|']]]]])
    ;
    ; Description: Write 1D/2D array to file, 2D with delimiter between every entry
    ;
    ; Parameter(s): $FILEPATH - path/filename of the file to be write
    ; $ARRAY - array to write from
    ; optional $iROWstart - start row-index, default 0
    ; optional $iROWend - end row-index, default Ubound(array)-1
    ; optional $iCOLstart - start column-index, default 0
    ; optional $iCOLend - end column-index, default Ubound(array,2)-1
    ; optional $DELIM - delimiter for 2D-array entries, default '|'
    ;
    ; Requirement(s): None
    ;
    ; Return Value(s): On Success - Returns -1
    ; On Failure - Returns 0 and sets @error = 1 (given array is'nt array); @error = 2 (unable to open filepath)
    ;
    ; Note: If $iROWstart > $iROWend or $iCOLstart > $iCOLend the values will be swapped among
    ;
    ; Author(s): BugFix ( [email='bugfix@autoit.de'][/email] )
    ;==========================================================================================================================================
    Func _FileWriteFromArray2D($FILEPATH, $ARRAY, $iROWstart = 0, $iROWend = 0, $iCOLstart = 0, $iCOLend = 0, $DELIM = '|')
    If Not IsArray($ARRAY) Then
    SetError(1)
    Return 0
    EndIf
    Local $Ubound = UBound($ARRAY)
    If $iROWend = 0 Then $iROWend = $Ubound - 1
    Local $fh = FileOpen($FILEPATH, 2)
    If $fh = -1 Then
    SetError(2)
    Return 0
    EndIf
    Select
    Case $iROWstart < 0 Or $iROWstart > $Ubound - 1
    $iROWstart = 0
    ContinueCase
    Case $iROWend < 0 Or $iROWend > $Ubound - 1
    $iROWend = $Ubound - 1
    ContinueCase
    Case $iROWstart > $iROWend
    $tmp = $iROWstart
    $iROWstart = $iROWend
    $iROWend = $tmp
    EndSelect
    Local $Ubound2nd = UBound($ARRAY, 2)
    If @error = 2 Then
    For $i = $iROWstart To $iROWend
    FileWriteLine($fh, $ARRAY[$i])
    Next
    Else
    If $iCOLend = 0 Then $iCOLend = $Ubound2nd - 1
    Select
    Case $iCOLstart < 0 Or $iCOLstart > $Ubound2nd - 1
    $iCOLstart = 0
    ContinueCase
    Case $iCOLend < 0 Or $iCOLend > $Ubound2nd - 1
    $iCOLend = $Ubound2nd - 1
    ContinueCase
    Case $iCOLstart > $iCOLend
    $tmp = $iCOLstart
    $iCOLstart = $iCOLend
    $iCOLend = $tmp
    EndSelect
    For $i = $iROWstart To $iROWend
    $tmp = ''
    For $k = $iCOLstart To $iCOLend
    If $k < $iCOLend Then
    $tmp &= $ARRAY[$i][$k] & $DELIM
    Else
    $tmp &= $ARRAY[$i][$k]
    EndIf
    Next
    FileWriteLine($fh, $tmp)
    Next
    EndIf
    FileClose($fh)
    Return -1
    EndFunc ;==>_FileWriteFromArray2D
    ;==========================================================================================================================================
    ; Function: _FileReadToArray2D($FILEPATH, $ARRAY [, $DELIM=-1])
    ;
    ; Description: Read 1D/2D array from file, if $DELIM is given (<> -1) 2D array will created
    ;
    ; Parameter(s): $FILEPATH - path/filename of the file to read in an array
    ; $ARRAY - array variable to hold readed data
    ; optional $DELIM - delimiter for 2D-array entries, default -1 (none 2D-array)
    ;
    ; Requirement(s): None
    ;
    ; Return Value(s): On Success - Returns -1
    ; On Failure - Returns 0 and sets @error = 1 (given file are not seperated with given delimiter or count of delimiters
    ; are not equal); @error = 2 (unable to open filepath)
    ;
    ; Note: If given file is delimited to create 2D-array ALL lines need the same count of delimiters, otherwise an error occurs!
    ;
    ; Author(s): BugFix ( [email='bugfix@autoit.de'][/email] )
    ;==========================================================================================================================================
    Func _FileReadToArray2D($FILEPATH, ByRef $ARRAY, $DELIM = -1)
    Local $fh = FileOpen($FILEPATH, 0), $line, $var, $n = 1
    If $fh = -1 Then
    SetError(2)
    Return 0
    EndIf
    If $DELIM <> -1 Then
    $line = FileReadLine($fh, 1)
    $var = StringSplit($line, $DELIM)
    If IsArray($var) Then
    $Ubound2nd = $var[0]
    Local $AR[1][$Ubound2nd]
    $AR[0][0] = 0
    Else
    SetError(1)
    Return 0
    EndIf
    While 1
    $line = FileReadLine($fh, $n)
    If @error = -1 Then ExitLoop
    $var = StringSplit($line, $DELIM)
    If IsArray($var) Then
    ReDim $AR[UBound($AR) + 1][$Ubound2nd]
    For $i = 0 To $Ubound2nd - 1
    $AR[UBound($AR) - 1][$i] = $var[$i + 1]
    Next
    $AR[0][0] += 1
    Else
    SetError(1)
    Return 0
    EndIf
    $n += 1
    WEnd
    Else
    Local $AR[1]
    $AR[0] = 0
    While 1
    $line = FileReadLine($fh, $n)
    If @error = -1 Then ExitLoop
    ReDim $AR[UBound($AR) + 1]
    $AR[UBound($AR) - 1] = $line
    $AR[0] += 1
    $n += 1
    WEnd
    EndIf
    FileClose($fh)
    $ARRAY = $AR
    Return -1
    EndFunc ;==>_FileReadToArray2D

    [/autoit]
  • @Bakku:Freut mich das es dir Graphisch schonmal gefällt :D .
    Werde das die Tage nochmal bearbeiten so das es beim schliessen automatisch in die vorhandene(falls voranden) Datei speichert und beim öffnen wieder automatisch von dieser ladet.

    @Pinguin94:
    Stimmt, da hatte ich garnet drann gedacht xD, werde das natürlich auch nochmal bearbeiten und die fertige Version dann nochmal posten. ;)

  • Also habe soweit alles umsetzten können.

    1. Wenn man bereits eine Datei gespeichert hat und nochmal das script öffnet wird dieses automatisch die datei laden.

    2. Wenn man bei neuen Termin Cancel drückt werden die restlichen punkte nicht mehr abgefragt

    3. Man kann mit den Traymenü nun Schliessen, Verstecken und Anzeigen.


    Also soweit schon fertig, nurnoch die feinarbeit, hier schonmal das jetztige ergebnis!

    autoit.de/wcf/attachment/8534/


    edir: Standard Passwort ist wie gehabt "12345".

  • Und nochmal ein Update von meinen Terminkalender. ;)

    Eingefügt wurde nun ein Menü und die Funktion schon erstellte Termine zu bearbeiten.

    Desweiteren kommen bei eintrag eines neuen Termins nicht immerwieder neue InputBoxen sondern einfach nur eine GUI in der alles eingetragen werden kann. Ladet euch einfach mal die Version runter und gibt mir euer FeedBack. autoit.de/wcf/attachment/8712/

    Danke!

  • Hi AltairKD.
    Sehr hübsch gemacht!
    Am Anfang hat mich verwirrt, dass man "Start" beim Passwort eingeben muss, damit eine neue Ini erstellt wird.
    Das hätte ich mich FileExists gemacht. Aber ich will dir nichts aufdrängen.
    Das abspeichern funktioniert gut!! Was besser wäre, wenn die Termine auch in der Ini gespeichert würden. (Finde ich jedenfalls)
    Weil dann nicht noch ein seperater Text abgespeichert werden müsste.
    Aber ich habe mal ein Notizprogramm gemacht, wo die Notizen in einer Ini gespeichert wurden, und da gabs so viele Probleme.
    Und wenn man mehrere Termine hintereinander abspeichert, dann enthalten die Input-Boxen die Daten des vorherigen Termins.
    Aber ich muss sagen, das es sehr gut gelungen ist :!: :!: Vor allem das Design her. (Wie ich schon erwähnt habe) :thumbup: :thumbup:

  • Danke für dein Feedback. Werde deine kleinen "vorschläge" mal zur kenntniss nehmen, und bei Zeit nochmal den Kalender bearbeiten um auch diese schönheitsfehler(vorallem mit den Input-Boxen) ausbügeln.

    Die Termine auch in die .Ini zu speichern hab ich garnet drann gedacht xD. Evtl. werd ich das mal testen und gucken was ich persönlich besser finde ;).