Gui aus Textfile erstellen

  • Hallo Leute,

    hab grade erst angefangen mit AutoIT, aber ich bin auf den Geschmack gekommen ;)
    Zu meinem Problem: Ich habe mehrere Scripte, die ihre jeweiligen Anwendungen starten. In einer Textdatei habe ich die Namen der Scripte und die Namen der Anwendungen. Diese will ich auslesen und in einer GUI als Label erstellen, inklusive Checkbox, damit ich sie dann mit einem Button starten kann.

    Wie bringe ich so eine GUI hin? Ich hab mir die Logik zwar schon überlegt, aber weiss nicht wie ich es schreiben soll.

    Danke im Voraus.

    Einmal editiert, zuletzt von Taek (24. Juli 2008 um 15:36)

  • Tja, dann poste doch mal die Logik :)
    Die GUI dann in Schleifen mit FileRead(line) / INIRead(section), sich ändernder y-Werte erstellen :)

  • Tja, wenn ich das könnte ^^... Ich weiß die genauen Befehle ja nicht.

    [autoit]

    #include <GUIConstants.au3>

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

    $file = FileOpen("settings.txt", 0)

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

    GUICreate("Titel",640,480)
    GUISetFont(8, 800, 0, "MS Sans Serif")

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

    If $file = -1 Then
    MsgBox(48, "Fehler","Keine Programme gefunden.")
    Exit
    EndIf

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

    ;Zeile 1 lesen
    For FileReadLine($file,1)=$line1
    GUICtrlCreateCheckbox($line1,?,?,?,?)
    FileReadLine($file,2)=$line2
    GUICtrlCreateCheckbox($line2,?,?,?,?)
    Next

    [/autoit]

    Soweit bin ich gekommen. Wie das genau mit der Schleife funktioniert, hab ich noch nicht ganz kapiert.

    Und jetzt müsste man noch mit GUICtrlRead() die Checkboxen abfragen und die Programme verknüpfen.

  • OK.a) Mal zur erstellungsschleife. Die Stimmt noch nicht.
    1) In AutoIt kann man for-Schleifen nicht auf diese Weise benutzen.
    2) Die Variable muss vor der Funktion stehen
    3) zum Schleifenauslesen FileRadline ohne Zeilenangabe verwenden, dann wird immer die nächste genommen.

    b) Zur Logik. Einfach mal beschreiben :) nicht programmieren hab ich gemeint.

    c) Hast du ein bestimmtes Format zum Speichern in der Textdatei?
    Hab mal ein Beispiel erstellt, wie ich es machen würde und kommentiert. Frag einfach wenn du was nicht verstehst :)

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <ListViewConstants.au3>

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

    $file = FileOpen("D:\settings.txt", 0)
    #cs
    Dateiaufbau:
    [Programm TAB Pfad]
    Bsp:
    Programm1 Datei1
    Programm2 Datei2
    Programm3 Datei3
    Programm4 Datei4
    #ce

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

    GUICreate("Titel",640,480)
    GUISetFont(8, 800, 0, "MS Sans Serif")

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

    If $file = -1 Then
    MsgBox(48, "Fehler","Keine Programme gefunden.")
    Exit
    EndIf
    Global $checkboxes_with_Filenames[1][2]

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

    ; Verwendeung einer ListView mit Checkboxstyle. Dann müssen keine Scrollbars selbst erstellt werden, wenn zu viele Einträge vorhanden sind
    ; Dann gibt es aber keine GUIGetMsg, wenn eine Checkbox umgeschaltet wird.
    $checkboxes_with_Filenames[0][0] = GUICtrlCreateListView("Programme zum installieren",10,10,300,200,$LVS_NOCOLUMNHEADER,$LVS_EX_CHECKBOXES)

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

    ; Button, um weiter zu schalten
    $BTN_Next = GUICtrlCreateButton("Weiter |>",10,220)

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

    ;Zeile 1 lesen
    While 1
    ; Lesen:
    $line = FileReadLine($file)
    ; Fehler beim lesen -> Datei nicht offen oder Ende der Datei
    If @error <> 0 Then ExitLoop
    ; Zeile Teilen. Aufbau: Name[TAB]Datei
    $teile = StringSplit($line,@TAB)
    ; Wenn nicht genau 2 Teile, dann gibt es einen Fehler
    If $teile[0] <> 2 Then Exit MsgBox(0, '', "Fehler in der Konfig-Datei")
    ; Neues element hinzufügen
    ReDim $checkboxes_with_Filenames[UBound($checkboxes_with_Filenames)+1][2]
    ; Checkbox im Listview erstellen
    $checkboxes_with_Filenames[UBound($checkboxes_with_Filenames)-1][0] = GUICtrlCreateListViewItem($teile[1],$checkboxes_with_Filenames[0][0])
    ; Den Dateinamen zur Checkbox speichern
    $checkboxes_with_Filenames[UBound($checkboxes_with_Filenames)-1][1] = $teile[2]
    WEnd

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

    FileClose($file)
    GUISetState()

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

    While 1
    $msg = GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_CLOSE
    Exit

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

    Case $BTN_Next ; Weiter Button

    ; Für alle Einträge
    For $i = 1 To UBound($checkboxes_with_Filenames)-1
    ;Wenn Markiert ...
    If BitAND(GUICtrlRead($checkboxes_with_Filenames[$i][0],1),$GUI_CHECKED) = $GUI_CHECKED Then
    ;Dann Messagebox mit Title = Checkboxname, Message=Datei
    MsgBox(0, StringTrimRight(GUICtrlRead($checkboxes_with_Filenames[$i][0]),1),$checkboxes_with_Filenames[$i][1] )
    EndIf
    Next

    EndSwitch
    WEnd

    [/autoit]
  • Also... Danke erstmal. Kann ich die For-Schleife so verwenden:

    [autoit]

    $line = FileReadLine($file)
    For $i = 1 to 3
    GUICtrlCreateCheckbox($line,10,10,100,30)
    Next

    [/autoit]

    In der settings.txt sind die Namen der Anwendungen und Scripte gleich, z.B.

    Zitat

    7-Zip 4.57
    Ad-Aware 2008

    Theoretisch könnte ich ja jede Checkbox per Hand hinzufügen aber falls ich zusätzliche Programme integrieren will, wirds unübersichtlich. Einerseits will ich den Checkboxnamen und den Namen des Scripts auslesen (beide gleich bis auf die Dateiendung), das Script selber ist aber im Unterordner "Programme". Für den richtigen Pfad müsste ich also was zum Namen voran hängen.
    Wenn ich das richtig erkannt habe, liest du die Textdatei in dem Beispiel zu einem Array ein. Bis Array hab ichs verstanden, aber dann... ^^

    Mir wäre es fast lieber, wenn ich die For-Schleife für die Anzahl an Programme laufen lasse, und je nachdem ob welche dazukommen, ich einfach die $i ändere.

  • Klar :)
    Du musst den Y-Wert aber noch berechnen.
    z.B.: statt 10 solltest du 10+($i-1)*(Höhedes Elements+10) nehmen.
    außerdem musst du die CtrlId zwischenspeichern.

    [autoit]

    Dim $checkboxes[$anzahl+1]

    [/autoit]

    In der For-Schleife dann

    [autoit]

    $checkboxes[$i] = GUICtrl...

    [/autoit]
  • Jetzt bin ich soweit:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>

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

    Global $file = FileOpen("settings.txt", 0)
    Global $line = FileReadLine($file)
    ;Hier die Anzahl der Programme angeben.
    Global $anzahl=3

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

    If $file = -1 Then
    MsgBox(48, "Fehler","Keine Programme gefunden.")
    Exit
    EndIf

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

    GUICreate("Autoinstaller",250,500)
    GUISetFont(8, 800, 0, "MS Sans Serif")

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

    Dim $checkboxes[$anzahl+1]
    For $i = 1 to 3

    $checkboxes[$i]=GUICtrlCreateCheckbox($line,10,10+($i-1)*(15+10),100,15)
    Next
    GuiSetstate()
    sleep (3000)
    Dim $checkboxes[$anzahl+1]

    [/autoit]


    Bei mir steht allerdings neben allen 3 Checkboxen der Wert der ersten Zeile. Was ist falsch?
    Ich weiß, ich muss sleep() einfügen, weil ich noch nicht drauf gekommen bin, wie ich die GUI angezeigt lasse.

  • Öhhh, mein Fehler. Habs vorhin nicht verbessert :)
    Du musst in der Schleife natürlich auch jedes mal eine neue Zeile lesen.
    $line = FileReadLine($file)
    muss also in die For-Schleife.
    Gui anzeigen geht mit einer While-Schleife wie ab Zeile 52 in Post #4

  • Nunja, ich bin nicht in der Arbeit, hab also daheim noch etwas rumprobiert.

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>

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

    ;Variablen definieren
    Global $file = FileOpen("settings.txt", 0)
    Global $line = FileReadLine($file)
    Global $anzahl=3 ;Anzahl der verfügbaren Programme

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

    ;GUI Settings
    GUICreate("Autoinstaller",250,300)
    GUISetFont(8, 800, 0, "MS Sans Serif")
    GUICTRLCreatePic("img.jpg",160,10,80,92)
    $start=GUICtrlCreateButton("START",160,107,80,30)
    $ende=GUICtrlCreateButton("ENDE",160,142,80,30)

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

    If $file = -1 Then
    MsgBox(48, "Fehler","Keine Programme gefunden.")
    Exit
    EndIf

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

    Dim $checkboxes[$anzahl+1]
    For $i = 1 to 3
    $line=FileReadLine($file)
    $checkboxes[$i]=GUICtrlCreateCheckbox($line,10,10+($i-1)*(15+10),140,15)
    Next

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

    GUISetState(@SW_SHOW)
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $start
    MsgBox(0,"Test",GUICtrlRead($checkboxes))
    Case $ende
    Exit

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

    EndSwitch
    WEnd

    [/autoit]


    Das ganze steht soweit, allerdings muss ich in der Textfile die erste Zeile frei lassen, ansonsten zeigt er mir zwar 3 Checkboxen an, aber fängt erst mit der 2. Zeile als Beschriftung an.
    Was ich mit dem Start-Button noch genau mache, muss ich mir morgen überlegen, dazu hab ich jetzt keinen Nerv mehr :sleeping:

  • Ich habe jetzt meine Textfile so verändert, dass in der ersten Zeile die Anzahl der Programme steht, die Namen der Programme dann in den nächsten Zeilen. Das letze Programm ist also in der (Anzahl+1)ten Zeile ;)

    Folgenden Code habe ich:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    Global $file=FileOpen("settings.txt", 0)
    $anzahl=Filereadline($file,1)
    $letzte_zeile = $anzahl+1

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

    dim $checkboxes[$anzahl]
    For $i = 2 to $letzte_zeile
    $line=FileReadLine($file)
    $checkboxes[$i]=GUICtrlCreateCheckbox($line,10,10+($i-2)*(15+10),140,15)
    Next

    [/autoit]

    Edit: Problem gefunden: nach $checkboxes darf kein "[$i]" stehen.

    Einmal editiert, zuletzt von Taek (22. Juli 2008 um 14:08)