Liste beim Starten des Programmes aus Datei einpflegen

  • Hallo zusammen,

    eines vorweg: Dies ist mein erster Post hier, ich bitte also um Umsicht, sollte ich nicht alle Postingregeln beachtet haben ;)

    Nun zum Thema. Ich habe zum Erlernen von Autoit ein kleines Programm geschrieben, welches aus zwei Tabs besteht. Im ersten Tab sollen die Programme über Buttons gestartet werden und im zweiten über eine Liste. Ersteres ist in der Frage irrelevant, soll nur den Aufbau verdeutlichen.

    In dem Tab mit der Liste befinden sich meine "Problemchen", welche für euch sicherlich einfach zu lösen sind, für mich als Neuling (habe erst gestern damit angefangen :P) schon eine kleine Hürde sind. Hier erstmal der Quellcode:

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <GUIListBox.au3>
    #include <TabConstants.au3>
    #include <WindowsConstants.au3>
    #Include <File.au3>

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

    $ProgrammStarter = GUICreate("ProgrammStarter", 615, 433, 572, 214)

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

    ; -----------------------------------------
    ; MenüItems
    $menDatei = GUICtrlCreateMenu("&Datei")
    $smenNotepad = GUICtrlCreateMenuItem("Notepad öffnen", $menDatei)
    $smenExit = GUICtrlCreateMenuItem("Schließen", $menDatei)
    $menInfo = GUICtrlCreateMenu("&Info")
    $smenAbout = GUICtrlCreateMenuItem("About", $menInfo)
    $smenHistory = GUICtrlCreateMenuItem("Patch Logs", $menInfo)

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

    ; -----------------------------------------
    ; Tab 1 Buttons (Not functional!)
    $tabTablist = GUICtrlCreateTab(0, 0, 145, 401)
    $TabSheet1 = GUICtrlCreateTabItem("Buttons")
    $cmdAddProgramB = GUICtrlCreateButton("Add", 12, 41, 58, 25)
    $cmdDelProgramB = GUICtrlCreateButton("Delete", 76, 41, 58, 25)
    $Button1 = GUICtrlCreateButton("Button1", 12, 73, 91, 25)
    $Button2 = GUICtrlCreateButton("", 108, 73, 27, 25, $BS_ICON)
    GUICtrlSetImage(-1, "C:\Users\localuser\Desktop\mana.ico", -1, 0)

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

    ; -----------------------------------------
    ; Tab 2 Liste
    $TabSheet2 = GUICtrlCreateTabItem("Liste")
    GUICtrlSetState(-1,$GUI_SHOW)
    $cmdDelProgramL = GUICtrlCreateButton("Delete", 76, 41, 58, 25)
    $cmdAddProgramL = GUICtrlCreateButton("Add", 12, 41, 58, 25)
    $lstPrograms = GUICtrlCreateList("", 14, 72, 120, 305)
    GUICtrlCreateTabItem("")
    GUISetState(@SW_SHOW)
    local $aSize = 30
    local $aProgram[$aSize]
    local $aProgramPath[$aSize]
    local $aCounter = 0

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg

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

    ; -----------------------------------------
    ;~ Menue Bar Controls
    Case $GUI_EVENT_CLOSE
    Exit

    Case $smenExit
    Exit

    Case $smenNotepad
    Run("notepad.exe")

    Case $smenAbout
    MsgBox(0, "Info zum Programm", "Entwickler: Ich" & @CRLF & "Version: 0.0.1 Alpha")

    Case $smenHistory
    )

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

    ; -----------------------------------------
    ;~ Functionbuttons Tab Liste
    Case $cmdAddProgramL
    $aProgram[$aCounter] = InputBox("Programm hinzufügen", "Bitte geben Sie den Programmnamen ein.")
    GUICtrlSetData($lstPrograms, $aProgram[$aCounter])
    $aProgramPath[$aCounter] = FileSelectFolder("Speicherpfad des Programmes auswählen","")
    FileWriteLine('programs.txt', $aProgram[$aCounter])
    $aCounter += 1

    Case $cmdDelProgramL
    $sDelListItem = GUICtrlRead($lstPrograms)
    $sSelected = _GUICtrlListBox_GetCaretIndex($lstPrograms)
    MsgBox(0, "Löschen", $sDelListItem & " mit ID " & $sSelected & " wurde gelöscht.")
    MsgBox(0, "ID", "Programm: " & $sDelListItem & @CRLF & "Speicherpfad: " & $aProgramPath[$sSelected] )
    _GUICtrlListBox_DeleteString($lstPrograms, _GUICtrlListBox_GetCaretIndex($lstPrograms))
    EndSwitch
    WEnd

    [/autoit]

    Problem Nummer Eins: Ich weiß nicht, wie ich es dem Programm beibringen soll, dass es sich merkt, welche Programme beim vorherigen Ausführen des Tools bereits angelegt wurden, und dass diese wieder in die Liste geladen werden. habe es via filewrite versucht, aber irgendwie scheint das auch nicht das richtige zu sein. Schließlich muss er 1. den Programmnamen und 2. den Speicherpfad des Programmes wieder einlesen. Eine ini-File scheint mir auch ungünstig, schließlich ist eine ini-File mehr oder weniger "eindimensional", wenn ihr wisst, was ich meine ^^

    Außerdem besteht noch ein anderes Problem. Angenommen, ich möchte den Acrobat Reader in die Liste schreiben. Dann wähle ich "Add" aus und gebe dem Programm einen Namen. Anschließend kommt eine Abfrage, wo das Programm gespeichert ist. er schreibt beides in jeweils einen Array und das wars. Möchte ich jetzt aber das Programm wieder löschen über "Delete", so weiß das Tool nicht mehr, welchem Programm welcher Pfad zugewiesen wurde.

    Ich hoffe, ich überflute euch jetzt nicht mit Unwissen und verletze euch mit meinen Programmierunkenntnissen :P

    Vielmaligen Dank vorab für eure Hilfe und liebe Grüße

    3 Mal editiert, zuletzt von DasIch (19. Dezember 2013 um 16:44)

  • Hallo DasIch,

    also für Programme in einer Listview hatte ich mir einmal folgende Speicherart ausgedacht:

    Die Pfade werden durch | getrennt aneinander gehängt, ebenso alle Programmnamen.
    Dann lässt sich das wie folgt in einer .ini abspeichern:

    Code
    [Programme]
    Pfade=C:\Pfad1\Programm1|D:\Pfad2\Programm2
    Titel=TitelProgramm1|TitelProgramm2

    Zum Auslesen führst du mit den Pfad- bzw. Titelstring ein StringSplit ($Pfade/Titel, "|") durch und erhältst sie als Array. Das kannst du nun durchlaufen und die Liste erstellen.

    MfG Xenon :)

    Edit:
    Die Pfade und Titel würde ich in einem zweidimensionalen Array speichern. Dadurch ist ein eindeutiger Bezug Pfad - Programm möglich. Bspw. $Array[0][$x] - Programmname; $Array[1][$x] - Pfad.

    2 Mal editiert, zuletzt von Xenon (28. November 2013 um 22:03)

  • Hallo Xenon und danke für deine Antwort.

    Leider verstehe ich nicht so ganz, was du mir damit sagen möchtest:

    Die Pfade werden durch | getrennt aneinander gehängt, ebenso alle Programmnamen.
    Dann lässt sich das wie folgt in einer .ini abspeichern:

    Code
    [Programme]
    Pfade=C:\Pfad1\Programm1|D:\Pfad2\Programm2
    Titel=TitelProgramm1|TitelProgramm2

    Zum Auslesen führst du mit den Pfad- bzw. Titelstring ein StringSplit ($Pfade/Titel, "|") durch und erhältst sie als Array. Das kannst du nun durchlaufen und die Liste erstellen.

    Also würde das mit der Ini File so aussehen?

    [autoit]

    IniWrite ("programs.ini", "Programme", "Programm", $aProgram[0][$aCounter]&"|")
    IniWrite ("programs.ini", "Programme", "Pfad", $aProgram[1][$aCounter]&"|"

    [/autoit][autoit]

    $aSplitProgram[0][] = IniRead("programs.ini","Programme","Programm")
    $aSplitProgram[0][] = StringSplit($aProgram[$aCounter], "|")

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

    $aSplitProgram[1][] = IniRead("programs.ini","Programme","Pfad")
    $aSplitProgram[1][] = StringSplit($aProgram[$aCounter], "|")

    [/autoit]

    Oder wie ist das gemeint? Sorry, ich bin etwas überfordert mit der antwort :( Woher soll er denn wissen, wieviel Speicher er für das Array reservieren soll, bzw. wie kann ich einfach alle in den Array schreiben lassen, und den entsprechenden Count davon haben?

    Zitat

    Edit:
    Die Pfade und Titel würde ich in einem
    zweidimensionalen Array speichern. Dadurch ist ein eindeutiger Bezug
    Pfad - Programm möglich. Bspw. $Array[0][$x] -
    Programmname;
    $Array[1][$x] - Pfad.

    Wie sieht das in der Praxis aus? So?

    [autoit]


    $aProgram[0][$aCounter] = InputBox("Programm hinzufügen", "Bitte geben Sie den Programmnamen ein. |")
    GUICtrlSetData($lstPrograms, $aProgram[0][$aCounter])
    $aProgram[1][$aCounter] = FileSelectFolder("Speicherpfad des Programmes auswählen","")
    IniWrite ("programs.ini", "Programme", "Programm", $aProgram[0][$aCounter]&"|")
    IniWrite ("programs.ini", "Programme", "Pfad", $aProgram[1][$aCounter]&"|")
    $aCounter += 1

    [/autoit]

    Sorry, wenn ich dir grade nicht folgen kann, ich bin halt wie gesagt noch neu in der Materie und so ganz ohne ein paar Beispiele kann ich es dann auch nicht wirklich ^^ es mangelt halt an dem "Wie setze ich es um" im Moment :(

  • Also würde das mit der Ini File so aussehen?

    [autoit]

    IniWrite ("programs.ini", "Programme", "Programm", $aProgram[0][$aCounter]&"|")

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

    IniWrite ("programs.ini", "Programme", "Pfad", $aProgram[1][$aCounter]&"|"

    [/autoit]


    Nicht ganz, denn dann würde nur der eine Wert der Position $aCounter gespeichert werden und nichts aneinandergehängt, wie ich meinte.

    [autoit]

    $aSplitProgram[0][] = IniRead("programs.ini","Programme","Programm")
    $aSplitProgram[0][] = StringSplit($aProgram[$aCounter], "|")

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

    $aSplitProgram[1][] = IniRead("programs.ini","Programme","Pfad")
    $aSplitProgram[1][] = StringSplit($aProgram[$aCounter], "|")

    [/autoit]


    Hier stimmt auch schonmal die Grundidee mit IniRead und StringSplit. Jedoch solltest du für StringSplit als ersten Parameter den Text aus der Ini verwenden, denn den möchtest du ja splitten.

    Ich habe dir mal ein Beispiel geschrieben um das Auslesen und Schreiben zu verdeutlichen. Probiere es mal aus und schaue dir den Quelltext mit Kommentaren an. Wenn etwas nicht verständlich ist, dann kannst du gern fragen. ;) Speichere dir aber zum Testen die Ini (im Anhang) im Skriptverzeichnis als Settings.ini damit es klappt und schau sie dir ruhig an.

    Spoiler anzeigen
    [autoit]

    ; Includes
    #include <Array.au3>

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

    ; Variablen
    Global $iSize = 30
    Global $aProgram[2][$iSize] ; $aProgram[0][x] = Name $aProgram[1][x] = Pfad
    Global $iCounter = 0
    Global $sIniPath = @ScriptDir & "\Settings.ini" ; Pfad zur Ini-Datei

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

    ; Ini-Datei auslesen
    Global $sProgramsIni = IniRead ($sIniPath, "Programme", "Programm", "") ; Liest die Programmnamen aus der ini aus
    Global $aProgramsIni = StringSplit ($sProgramsIni, "|", 2) ; Trennt den String an den | Zeichen
    Global $sPathsIni = IniRead ($sIniPath, "Programme", "Pfade", "") ; gleiche Vorgehensweise für Pfade
    Global $aPathsIni = StringSplit ($sPathsIni, "|", 2)

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

    If UBound ($aProgramsIni) = UBound ($aPathsIni) Then ; Wenn Größe der Arrays gleich, dann ist eindeutige Zuordnung Name - Pfad möglich
    For $i = 0 To UBound ($aProgramsIni) - 1
    If $iCounter > $iSize - 1 Then ; Bei zu vielen Einträgen Schleife beenden (Größer als Array-Größe)
    ExitLoop
    EndIf
    $aProgram[0][$iCounter] = $aProgramsIni[$i] ; In Array speichern
    $aProgram[1][$iCounter] = $aPathsIni[$i] ; In Array speichern
    $iCounter += 1
    Next
    EndIf

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

    _ArrayDisplay ($aProgram) ;Array anzeigen

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

    $aProgram[0][$iCounter] = "blablabla-Name" ; Es wird noch ein Eintrag ans Ende hinzugefügt (Programm)
    $aProgram[1][$iCounter] = "blablabla-Pfad" ; Es wird noch ein Eintrag ans Ende hinzugefügt (Pfad)

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

    _ArrayDisplay ($aProgram) ; Array nochmal anzeigen

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

    MsgBox (64, "Info", "Die Daten wurden ausgelesen." & @CRLF & "Nun werden Sie zur Demonstration in die Sektion ""Speichern"" geschrieben.")

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

    Global $sPrograms = ""
    Global $sPaths = ""

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

    For $i = 0 To $iSize - 1 ; Gesamtes Array durchlaufen
    If $aProgram[0][$i] <> "" Then ; Wenn kein leerer Eintrag
    $sPrograms &= $aProgram[0][$i] & "|" ; Dann an $sProgramms den aktuellen Namen und einen | anfügen
    $sPaths &= $aProgram[1][$i] & "|" ; genauso bei den Pfaden verfahren
    EndIf
    Next

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

    If StringRight ($sPrograms, 1) = "|" Then $sPrograms = StringLeft($sPrograms, StringLen($sPrograms) - 1) ; Wenn letzter Buchstabe = | , dann wird er entfernt.
    If StringRight ($sPaths, 1) = "|" Then $sPaths = StringLeft($sPaths, StringLen($sPaths) - 1) ; gleiches auch für die Pfade

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

    MsgBox (64, "Info", "$sPrograms: " & $sPrograms & @CRLF & @CRLF & "$sPaths: " & $sPaths)

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

    IniWrite ($sIniPath, "Speichern", "Programm", $sPrograms) ; in Ini schreiben
    IniWrite ($sIniPath, "Speichern", "Pfade", $sPaths) ; in Ini schreiben

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

    MsgBox (64, "Info", "Fertig. Schau dir nun mal die Ini-Datei an (" & $sIniPath & ")")

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

    MfG Xenon :)

  • Xenon, du bist der Beste! :D Ich werde es mir sofort wenn ich heim komme anschauen und berichten. Danke dir vielmals für deine Geduld und Hilfe :D

    Edit:
    Brauche ich die Count-Variable überhaupt in meinem Programm oder wird der Listen-Index automatisch richtig hoch gezählt?

    2 Mal editiert, zuletzt von DasIch (29. November 2013 um 14:26)

  • Hallo DasIch,

    also eigentlich benötigst du die Count-Variable in diesem Beispiel nicht:

    Ohne Counter
    [autoit]

    ; Includes
    #include <Array.au3>

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

    ; Variablen
    Global $iSize = 30
    Global $aProgram[2][$iSize] ; $aProgram[0][x] = Name $aProgram[1][x] = Pfad
    Global $sIniPath = @ScriptDir & "\Settings.ini" ; Pfad zur Ini-Datei

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

    ; Ini-Datei auslesen
    Global $sProgramsIni = IniRead ($sIniPath, "Programme", "Programm", "") ; Liest die Programmnamen aus der ini aus
    Global $aProgramsIni = StringSplit ($sProgramsIni, "|", 2) ; Trennt den String an den | Zeichen
    Global $sPathsIni = IniRead ($sIniPath, "Programme", "Pfade", "") ; gleiche Vorgehensweise für Pfade
    Global $aPathsIni = StringSplit ($sPathsIni, "|", 2)

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

    If UBound ($aProgramsIni) = UBound ($aPathsIni) Then ; Wenn Größe der Arrays gleich, dann ist eindeutige Zuordnung Name - Pfad möglich
    For $i = 0 To UBound ($aProgramsIni) - 1
    $aProgram[0][$i] = $aProgramsIni[$i] ; In Array speichern
    $aProgram[1][$i] = $aPathsIni[$i] ; In Array speichern
    Next
    EndIf

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

    _ArrayDisplay ($aProgram) ;Array anzeigen

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

    $aProgram[0][4] = "blablabla-Name" ; Es wird noch ein Eintrag ans Ende hinzugefügt (Programm)
    $aProgram[1][4] = "blablabla-Pfad" ; Es wird noch ein Eintrag ans Ende hinzugefügt (Pfad)

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

    _ArrayDisplay ($aProgram) ; Array nochmal anzeigen

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

    MsgBox (64, "Info", "Die Daten wurden ausgelesen." & @CRLF & "Nun werden Sie zur Demonstration in die Sektion ""Speichern"" geschrieben.")

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

    Global $sPrograms = ""
    Global $sPaths = ""

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

    For $i = 0 To $iSize - 1 ; Gesamtes Array durchlaufen
    If $aProgram[0][$i] <> "" Then ; Wenn kein leerer Eintrag
    $sPrograms &= $aProgram[0][$i] & "|" ; Dann an $sProgramms den aktuellen Namen und einen | anfügen
    $sPaths &= $aProgram[1][$i] & "|" ; genauso bei den Pfaden verfahren
    EndIf
    Next

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

    If StringRight ($sPrograms, 1) = "|" Then $sPrograms = StringLeft($sPrograms, StringLen($sPrograms) - 1) ; Wenn letzter Buchstabe = | , dann wird er entfernt.
    If StringRight ($sPaths, 1) = "|" Then $sPaths = StringLeft($sPaths, StringLen($sPaths) - 1) ; gleiches auch für die Pfade

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

    MsgBox (64, "Info", "$sPrograms: " & $sPrograms & @CRLF & @CRLF & "$sPaths: " & $sPaths)

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

    IniWrite ($sIniPath, "Speichern", "Programm", $sPrograms) ; in Ini schreiben
    IniWrite ($sIniPath, "Speichern", "Pfade", $sPaths) ; in Ini schreiben

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

    MsgBox (64, "Info", "Fertig. Schau dir nun mal die Ini-Datei an (" & $sIniPath & ")")

    [/autoit]


    Aber es ist praktischer, denn dann kannst du auch vor den Daten aus der Ini schon welche einfügen oder diese öfters auslesen:

    Vorteile mit Counter
    [autoit]

    ; Includes
    #include <Array.au3>

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

    ; Variablen
    Global $iSize = 30
    Global $aProgram[2][$iSize] ; $aProgram[0][x] = Name $aProgram[1][x] = Pfad
    Global $iCounter = 0
    Global $sIniPath = @ScriptDir & "\Settings.ini" ; Pfad zur Ini-Datei

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

    $aProgram[0][$iCounter] = "erster Eintrag" ; Es wird ein Eintrag am Anfang hinzugefügt (Programm)
    $aProgram[1][$iCounter] = "erster Pfad" ; Es wird ein Eintrag am Anfang hinzugefügt (Pfad)
    $iCounter += 1

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

    _ArrayDisplay ($aProgram) ;Array anzeigen

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

    ; Ini-Datei auslesen
    Global $sProgramsIni = IniRead ($sIniPath, "Programme", "Programm", "") ; Liest die Programmnamen aus der ini aus
    Global $aProgramsIni = StringSplit ($sProgramsIni, "|", 2) ; Trennt den String an den | Zeichen
    Global $sPathsIni = IniRead ($sIniPath, "Programme", "Pfade", "") ; gleiche Vorgehensweise für Pfade
    Global $aPathsIni = StringSplit ($sPathsIni, "|", 2)

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

    If UBound ($aProgramsIni) = UBound ($aPathsIni) Then ; Wenn Größe der Arrays gleich, dann ist eindeutige Zuordnung Name - Pfad möglich
    For $i = 0 To UBound ($aProgramsIni) - 1
    If $iCounter > $iSize - 1 Then ; Bei zu vielen Einträgen Schleife beenden (Größer als Array-Größe)
    ExitLoop
    EndIf
    $aProgram[0][$iCounter] = $aProgramsIni[$i] ; In Array speichern
    $aProgram[1][$iCounter] = $aPathsIni[$i] ; In Array speichern
    $iCounter += 1
    Next
    EndIf

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

    _ArrayDisplay ($aProgram) ;Array anzeigen

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

    ; Ini-Daten erneut in Array einfügen

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

    If UBound ($aProgramsIni) = UBound ($aPathsIni) Then ; Wenn Größe der Arrays gleich, dann ist eindeutige Zuordnung Name - Pfad möglich
    For $i = 0 To UBound ($aProgramsIni) - 1
    If $iCounter > $iSize - 1 Then ; Bei zu vielen Einträgen Schleife beenden (Größer als Array-Größe)
    ExitLoop
    EndIf
    $aProgram[0][$iCounter] = $aProgramsIni[$i] ; In Array speichern
    $aProgram[1][$iCounter] = $aPathsIni[$i] ; In Array speichern
    $iCounter += 1
    Next
    EndIf

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

    _ArrayDisplay ($aProgram) ;Array anzeigen

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

    $aProgram[0][$iCounter] = "blablabla-Name" ; Es wird noch ein Eintrag ans Ende hinzugefügt (Programm)
    $aProgram[1][$iCounter] = "blablabla-Pfad" ; Es wird noch ein Eintrag ans Ende hinzugefügt (Pfad)

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

    _ArrayDisplay ($aProgram) ; Array nochmal anzeigen

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

    MsgBox (64, "Info", "Die Daten wurden ausgelesen." & @CRLF & "Nun werden Sie zur Demonstration in die Sektion ""Speichern"" geschrieben.")

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

    Global $sPrograms = ""
    Global $sPaths = ""

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

    For $i = 0 To $iSize - 1 ; Gesamtes Array durchlaufen
    If $aProgram[0][$i] <> "" Then ; Wenn kein leerer Eintrag
    $sPrograms &= $aProgram[0][$i] & "|" ; Dann an $sProgramms den aktuellen Namen und einen | anfügen
    $sPaths &= $aProgram[1][$i] & "|" ; genauso bei den Pfaden verfahren
    EndIf
    Next

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

    If StringRight ($sPrograms, 1) = "|" Then $sPrograms = StringLeft($sPrograms, StringLen($sPrograms) - 1) ; Wenn letzter Buchstabe = | , dann wird er entfernt.
    If StringRight ($sPaths, 1) = "|" Then $sPaths = StringLeft($sPaths, StringLen($sPaths) - 1) ; gleiches auch für die Pfade

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

    MsgBox (64, "Info", "$sPrograms: " & $sPrograms & @CRLF & @CRLF & "$sPaths: " & $sPaths)

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

    IniWrite ($sIniPath, "Speichern", "Programm", $sPrograms) ; in Ini schreiben
    IniWrite ($sIniPath, "Speichern", "Pfade", $sPaths) ; in Ini schreiben

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

    MsgBox (64, "Info", "Fertig. Schau dir nun mal die Ini-Datei an (" & $sIniPath & ")")

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


    MfG Xenon :)

  • Ich habs verstanden denke ich :D Danke, danke, danke Xenon :D Dein Beispiel war echt super und hat mir geholfen, meine Problemchen zu beheben! :)

    Jetzt gibt es nurnoch ein kleines Problem, was mich verzweifeln lässt :P Und zwar schaffe ich es um's verrecken nicht, dass er aus der Liste den gelöschten Eintrag entfernt. Habs schon mit _GUICtrlListView_DeleteItemsSelected, _GUICtrlListView_GetSelected und _GUICtrlListView_GetSelectedIndices versucht, aber es mag einfach nicht verschwinden :(

    Hier der aktuelle Quellcode:

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <GUIListBox.au3>
    #include <TabConstants.au3>
    #include <WindowsConstants.au3>
    #Include <File.au3>
    #Include <Array.au3>
    #include <GuiListView.au3>

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

    #region Variablen
    Global $iSize = 30
    Global $aProgram[2][$iSize]
    Global $iCounter = 0
    Global $sIniPath = @ScriptDir & "\Settings.ini"
    #endregion

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

    #region ini auslesen
    Global $sProgramsIni = IniRead ($sIniPath, "Programme", "Programm", "")
    Global $aProgramsIni = StringSplit ($sProgramsIni, "|", 2)
    Global $sPathsIni = IniRead ($sIniPath, "Programme", "Pfad", "")
    Global $aPathsIni = StringSplit ($sPathsIni, "|", 2)
    #endregion

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

    #region GUI Initialisierung
    $ProgrammStarter = GUICreate("ProgrammStarter", 615, 433, 572, 214)

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

    ; -----------------------------------------
    ; MenüItems
    $menDatei = GUICtrlCreateMenu("&Datei")
    $smenNotepad = GUICtrlCreateMenuItem("Notepad öffnen", $menDatei)
    $smenExit = GUICtrlCreateMenuItem("Schließen", $menDatei)
    $menInfo = GUICtrlCreateMenu("&Info")
    $smenAbout = GUICtrlCreateMenuItem("About", $menInfo)
    $smenHistory = GUICtrlCreateMenuItem("Patch Logs", $menInfo)

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

    ; -----------------------------------------
    ; Tab 1 Buttons (Not functional!)
    $tabTablist = GUICtrlCreateTab(0, 0, 145, 401)
    $TabSheet1 = GUICtrlCreateTabItem("Buttons")
    $cmdAddProgramB = GUICtrlCreateButton("Add", 12, 41, 58, 25)
    $cmdDelProgramB = GUICtrlCreateButton("Delete", 76, 41, 58, 25)
    $Button1 = GUICtrlCreateButton("Button1", 12, 73, 91, 25)
    $Button2 = GUICtrlCreateButton("", 108, 73, 27, 25, $BS_ICON)
    GUICtrlSetImage(-1, "C:\Users\localuser\Desktop\mana.ico", -1, 0)

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

    ; -----------------------------------------
    ; Tab 2 Liste
    $TabSheet2 = GUICtrlCreateTabItem("Liste")
    GUICtrlSetState(-1,$GUI_SHOW)
    $cmdDelProgramL = GUICtrlCreateButton("Delete", 76, 41, 58, 25)
    $cmdAddProgramL = GUICtrlCreateButton("Add", 12, 41, 58, 25)
    $lstPrograms = GUICtrlCreateList("", 14, 72, 120, 305)
    Inifill()
    GUICtrlCreateTabItem("")
    GUISetState(@SW_SHOW)
    #endregion

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    ; -----------------------------------------
    ;~ Menue Bar Controls
    Case $GUI_EVENT_CLOSE
    Exit

    Case $smenExit
    Exit

    Case $smenNotepad
    Run("notepad.exe")

    Case $smenAbout
    MsgBox(0, "Info zum Programm", "Entwickler: Ich" & @CRLF & "Version: 0.0.1 Alpha")

    Case $smenHistory

    ; -----------------------------------------
    ;~ Functionbuttons Tab Liste
    Case $cmdAddProgramL
    ProgAdd()

    Case $cmdDelProgramL
    ProgDelete()
    MsgBox(0,"", "ID: " & $iArNr)
    _ArrayDisplay ($aProgram)
    EndSwitch
    WEnd

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

    Func IniFill()
    If UBound ($aProgramsIni) = UBound ($aPathsIni) Then
    For $i = 0 To UBound ($aProgramsIni) - 1
    If $iCounter > $iSize - 1 Then
    ExitLoop
    EndIf
    $aProgram[0][$iCounter] = $aProgramsIni[$i]
    $aProgram[1][$iCounter] = $aPathsIni[$i]
    GUICtrlSetData($lstPrograms, $aProgram[0][$iCounter])
    $iCounter += 1
    Next
    EndIf
    EndFunc

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

    Func ProgAdd()
    Global $sProgram = ""
    Global $sPath = ""

    For $i = 0 To $iSize -1
    If $aProgram[0][$i] <> "" Then
    $sProgram &= $aProgram[0][$i] & "|"
    $sPath &= $aProgram[1][$i] & "|"
    EndIf
    Next

    MsgBox(0,"","Prog: " & $sProgram & @CRLF & "Pfad: " & $sPath)

    For $i = 0 To $iSize - 1
    If $aProgram[0][$i] = "" Then
    $aProgram[0][$i] = InputBox("Programm hinzufügen", "Bitte geben Sie den Programmnamen ein.")
    $aProgram[1][$i] = FileSelectFolder("Speicherpfad des Programmes auswählen","")
    GUICtrlSetData($lstPrograms, $aProgram[0][$i])
    If $aProgram[0][$i] <> "" Then
    $sProgram &= $aProgram[0][$i] & "|"
    $sPath &= $aProgram[1][$i] & "|"
    ExitLoop
    EndIf
    EndIf
    Next
    If StringRight ($sProgram, 1) = "|" Then $sProgram = StringLeft($sProgram, StringLen($sProgram) - 1)
    If StringRight ($sPath, 1) = "|" Then $sPath = StringLeft($sPath, StringLen($sPath) - 1)
    IniWrite($sIniPath, "Programme", "Programm", $sProgram)
    IniWrite($sIniPath, "Programme", "Pfad", $sPath)
    EndFunc

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

    Func ProgDelete()
    $sSelected = GUICtrlRead($lstPrograms)
    For $i = 0 To $iSize -1
    If $aProgram[0][$i] = $sSelected Then
    MsgBox(0, "Löschen", $aProgram[0][$i] & "wurde gelöscht.")
    MsgBox(0, "ID", "Programm: " & $aProgram[0][$i] & @CRLF & "Speicherpfad: " & $aProgram[1][$i] )
    $aProgram[0][$i] = ""
    $aProgram[1][$i] = ""
    Global $iArNr = $i
    EndIf
    Next
    EndFunc

    [/autoit]
  • Die _GUIListView - Fuktionen werden da nicht funktionieren, da du keine ListView hast.
    Da kannst du die ListBox - Funktion

    [autoit]

    _GUICtrlListBox_DeleteString ($hlstPrograms, $Index)

    [/autoit]

    benutzen.

    MfG Xenon :)

  • Die _GUIListView - Fuktionen werden da nicht funktionieren, da du keine ListView hast.
    Da kannst du die ListBox - Funktion

    [autoit]

    _GUICtrlListBox_DeleteString ($hlstPrograms, $Index)

    [/autoit]

    benutzen.

    MfG Xenon :)

    Hatte ich auch versucht. Auch kein Erfolg.. Wenn ich _GUICtrlListBox_DeleteString($lstPrograms, $i) versuche, löscht er das falsche. Weil Listen Index <> Array Index ist :/

  • Dann erstelle mal deine Liste mit

    [autoit]

    $lstPrograms = GUICtrlCreateList("", 14, 72, 120, 305, $WS_BORDER + $WS_VSCROLL)

    [/autoit]


    Dann ist die "automatische Sortierfunktion" nicht dabei und dann sollten die Indexe(heißt das so?) gleich sein, oder?

    MfG Xenon :)

  • Dann erstelle mal deine Liste mit

    [autoit]

    $lstPrograms = GUICtrlCreateList("", 14, 72, 120, 305, $WS_BORDER + $WS_VSCROLL)

    [/autoit]


    Dann ist die "automatische Sortierfunktion" nicht dabei und dann sollten die Indexe(heißt das so?) gleich sein, oder?

    MfG Xenon :)


    Hi Xenon,

    funktioniert leider auch nicht. Sobald ich mehr als einen Eintrag lösche, spinnt es :/

    Oh, und P.S.: Indexe stimmt in dem Zusammenhang ^^

  • Und so?

    [autoit]

    Func ProgDelete()
    $sSelected = GUICtrlRead($lstPrograms)
    For $i = 0 To $iSize -1
    If $aProgram[0][$i] = $sSelected Then
    MsgBox(0, "Löschen", $aProgram[0][$i] & "wurde gelöscht.")
    MsgBox(0, "ID", "Programm: " & $aProgram[0][$i] & @CRLF & "Speicherpfad: " & $aProgram[1][$i] )
    $aProgram[0][$i] = ""
    $aProgram[1][$i] = ""
    Global $iArNr = $i
    _GUICtrlListBox_DeleteString ($hlstPrograms, _GUICtrlListBox_FindInText ($hlstPrograms, $sSelected))
    EndIf
    Next
    EndFunc

    [/autoit]