Dynamischer Aufbau von GUI-Elementen

  • Hallo zusammen.

    Ich bin mir nicht ganz sicher, wie ich mein Problem beschreiben soll. Ich versuche es einfach mal und hoffe, ihr versteht, was mein Problem ist.

    Ich möchte eine GUI dynamisch aus einer CSV-Datei aufbauen.
    Der Aufbau der GUI ansich ist immer der Selbe. nur die Anzahl der Elemente in der CSV-Datei und somit auch in der GUI kann sich immer ändern.

    Mal genauer:

    In der CSV-Datei sind 3 Spalten definiert. wert1;wert2;wert3.
    Der dynamische Teil der GUI soll wie folgt aussehen:
    Ein Lable dass wert1 aus der CSV als Text ausgeben soll.
    Ein LableTip was wert2 zugewiesen bekommen soll und
    Ein Input das wert3 als Text ausgeben soll.


    Die CSV-Datei lade ich in einen Array und Splitte sie auf. Bis hierhin kein Problem.


    Jetzt kann es sein, dass ich mal 20 Zeilen in dem CSV habe, mal 35 oder mal 154 <- Keine Ahnung, daher ja dynamisch.


    Mir ist jetzt vollkommen schleierhaft, wie ich die GUI aufbauen soll, damit sie immer die richtige Anzahl von Lable's und Inputs erstellt. Variablen kann ich ja dynamisch nicht erzeugen, um sie zur Zuweisung der GUI-Elemente in einer Schleife zu verwenden.


    Versteht ihr, was ich meine? Wie bekomme ich das hin? Ich habe absolut keine Idee, dieses Problem zu lösen außer vorher 200 Lables und Inputs in Variablen zu definieren und sie auszublenden, wen deren wert leer ist. Das finde ich allerdings sehr unschön und macht ne Menge Arbeit. Hat hier jemand vielleicht eine bessere Idee?


    Noch was: Wie bekomme ich es hin, dass ich eine Scrolleiste bekomme, wenn die Lables und Inputs die Größe der GUI überschreiten? Nur durch einen ListView oder gibt es noch eine andere Möglichkeit?


    Danke & Gruß,
    Matthias


    "Ausdauer wird früher oder später belohnt – meistens aber später" (Wilhelm Busch)

    Einmal editiert, zuletzt von matthias.s (5. Mai 2014 um 10:50)

  • Du kannst die GUI-Elemente in einen Array speichern.

    Spoiler anzeigen
    [autoit]

    #include<Array.au3>
    #include<GUIConstantsEx.au3>
    #region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 615, 437, 192, 124)

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

    $start = 25
    Dim $array[1]
    For $i = 1 To 10 Step 1
    $Input1 = GUICtrlCreateInput("Input1", 16, $start * $i, 121, 21)
    _ArrayAdd($array,$Input1)
    Next
    GUISetState(@SW_SHOW)
    #endregion ### END Koda GUI section ###

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

    _ArrayDisplay($array)

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

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

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

    EndSwitch

    [/autoit]

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Variablen kann ich ja dynamisch nicht erzeugen, um sie zur Zuweisung der GUI-Elemente in einer Schleife zu verwenden.


    Ist auch nicht unbedingt nötig.
    Wenn du z.B. im OnEvent-Modus arbeitest bekommst du die Control-ID über das Makro @GUI_CtrlId gleich mitgeliefert.
    Alternativ speicherst du sie in einem Array oder Dictionary (bietet sich an, da die Control-ID ja ein eindeutiger Schlüssel ist).

    Mal als Beispiel wie du das GUI dynamisch aus einer Textdatei erzeugen kannst ( die test.txt muss du noch erstellen):

    GUI dynamisch über Textdatei erstellen
    [autoit]

    #include <GUIConstantsEx.au3>
    Opt("GUIOnEventMode", 1)

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

    ; Angaben zur Geometrie:
    Global CONST $D_LABELHEIGHT = 20
    Global CONST $D_LABELWIDTH = 200
    Global CONST $D_LABELVERTICALSEP = 8
    Global CONST $D_MARGIN_LEFT = 8
    Global CONST $D_MARGIN_RIGHT = 8

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

    ; Datei zeilenweise einlesen:
    Global $a_File = FileReadToArray("test.txt")

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

    ; GUI erstellen:
    GUICreate("Test", $D_MARGIN_RIGHT + $D_MARGIN_LEFT + $D_LABELWIDTH, UBound($a_File) * ($D_LABELHEIGHT+$D_LABELVERTICALSEP) + $D_LABELVERTICALSEP )
    GUISetOnEvent($GUI_EVENT_CLOSE, "Ende")
    GUISetState(@SW_SHOW)

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

    ; Labels dynamisch erstellen:
    For $i = 0 To UBound($a_File) - 1
    GUICtrlCreateButton($a_File[$i], $D_MARGIN_LEFT, $D_LABELVERTICALSEP + $i * ($D_LABELHEIGHT+$D_LABELVERTICALSEP), $D_LABELWIDTH, $D_LABELHEIGHT)
    GUICtrlSetOnEvent(-1, "clickLabel")
    Next

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

    ; Endlosschleife damit Programm hier nicht endet
    Do
    Sleep(100)
    Until 0

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

    ; Event-Funktion die ausgeführt wird, wenn ein Label geklickt wird
    Func clickLabel()
    MsgBox(0,"Label geklickt", StringFormat('Es wurde das Label mit der Control-ID %d und dem Text "%s" geklickt', @GUI_CtrlId, GUICtrlRead(@GUI_CtrlId)))
    EndFunc

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

    ; Funktion welche beim Klick auf Beenden ausgeführt wird
    Func Ende()
    Exit
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit]
  • Danke... So wird's was... Chip liefert genau das, was ich suche!
    Aber auch der Ansatz von AspirinJunkie ist nicht uninteressant.

    Ich Schau mir beides mal an. Danke euch!!!

    "Ausdauer wird früher oder später belohnt – meistens aber später" (Wilhelm Busch)