Element dynamisch erzeugen.

  • Hallo liebe User,

    Also ich weiß nicht genau wie ich meine frage niederschreiben soll aber ich versuche es mal :).
    Also nehmen wir mal an wir wollten alle User eines Forums ausgaben aber jeder user in einem eigenem Label, dann müsste ich die Labels in einer While schleife erzeugen da sich die anzahl der User ja immer ändert.
    Das ganze würde dann so aussehen

    [autoit]

    Func _test()
    Local $i = 0
    Local $i2 = 0
    While $i <= 1000
    GUICtrlCreateLabel("Label"& $i, 0, $i2, 45, 20)
    $i = $i + 1
    $i2 = $i2 + 16
    WEnd

    [/autoit]


    Wie ihr seht muss ich ja immer durch $i2 angeben auf welcher höhe sich das Label befindet also noch recht einfach. ich möchte sowas ähnliches machen allerdings mit mehren gui elementen gleichzeitig. Nur ist es dann echt schwer die Position aller Elemente neu zu berechnen da ich jedesmal eine Variabel dafür brauche.
    Meine frage wäre gibt es da eine möglichkeit das anders zu lösen??? weiß echt nicht wie ich mich richtig ausdrücken soll deswegen hier mal ein Bild im anhang. Ich möchte es so wie auf dem bild in einer schleife so oft wie nötig erzeugen ohnen jedesmal sämtliche cords anpassen zu müssen.

    So ich hoffe man kann es halbwegs verstehen ansonsten einfach nochmal fragen.

    LG und Danke Sven

  • Das as du beschreibst und was du uns auf deinem Screenshot zeigst, scheinen mir 2 verschiedene Sachen zu sein.
    Ist es nun eine Liste von gleichartigen Elementen (z.B. Labels) die untereinander platziert werden sollen? Oder handelt es sich um eine Gruppe verschiedener Controltypen die dynamisch angeordnet werden sollen?

    Wenn zweiteres zutrifft, wären ein paar Beispieldatensätze und die gewünschte Anordnung als Bild evtl. recht hilfreich.

  • Also das ganze Zeug mit dem While würde mit For..Next so aussehen.

    [autoit]

    For $i = 0 To 1000
    GUICtrlCreateLabel("Label"& $i, 0, $i * 16, 45, 20)
    Next

    [/autoit]

    Aber was alles aus dem Screenshot willst du denn mehrmals erstellen und wieviel jeweils in der X- und Y-Achse?

  • Vielleicht hilft dir das.

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>

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

    Global $iColCount = 8

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

    GUICreate("Test", 600, 400)
    For $i = 0 To 19
    GUICtrlCreateButton("Test", Mod($i, $iColCount) * 60, Int($i / $iColCount) * 40)
    Next
    GUISetState()

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

    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

    [/autoit]

    Zeig mal dein Script. Dann braucht man das sich nicht selber zusammentippen ;)

  • Im grunde ist das der kern mehr habe ich auch noch nicht da ich nicht weiß wie ich es anstellen sollen.

    [autoit]

    $Group1 = GUICtrlCreateGroup("13-12-1", 16, 16, 153, 193)
    $Label1 = GUICtrlCreateLabel("Status: 3", 24, 40, 55, 17)
    $Label2 = GUICtrlCreateLabel("Ort: Steinfurt", 24, 64, 72, 17)
    $Label3 = GUICtrlCreateLabel("Besatzung: 1/3", 24, 88, 89, 17)
    $Button1 = GUICtrlCreateButton("Auftrag ändern", 48, 144, 91, 25, $WS_GROUP)
    $Label4 = GUICtrlCreateLabel("Auftrag: Transport", 24, 112, 101, 17)
    $Button2 = GUICtrlCreateButton("Status ändern", 56, 176, 75, 25, $WS_GROUP)

    [/autoit]

    es sollen halbt immer drei neben einander und soviele wie nötig unternander.

  • Also so?

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

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

    Global $iColCount = 3

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

    GUICreate("Test", 530, 650)
    For $i = 0 To 8
    GUICtrlCreateGroup("13-12-1", (Mod($i, $iColCount) * 170) + 20, (Int($i / $iColCount) * 210) + 20, 150, 190)
    GUICtrlCreateLabel("Status: 3", (Mod($i, $iColCount) * 170) + 25, (Int($i / $iColCount) * 210) + 40, 55, 17)
    GUICtrlCreateLabel("Ort: Steinfurt", (Mod($i, $iColCount) * 170) + 25, (Int($i / $iColCount) * 210) + 65, 70, 17)
    GUICtrlCreateLabel("Besatzung: 1/3", (Mod($i, $iColCount) * 170) + 25, (Int($i / $iColCount) * 210) + 90, 90, 17)
    GUICtrlCreateLabel("Auftrag: Transport", (Mod($i, $iColCount) * 170) + 25, (Int($i / $iColCount) * 210) + 115, 100, 17)
    GUICtrlCreateButton("Auftrag ändern", (Mod($i, $iColCount) * 170) + 50, (Int($i / $iColCount) * 210) + 145, 90, 25, $WS_GROUP)
    GUICtrlCreateButton("Status ändern", (Mod($i, $iColCount) * 170) + 55, (Int($i / $iColCount) * 210) + 175, 75, 25, $WS_GROUP)
    Next
    GUISetState()

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

    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

    [/autoit]


    Im übrigen verwendet man eigentlich nicht soviele Leerzeichen in Labels.
    Die Labels die später variabel sein soll, werden extra gemacht und bekommen auch eine Variable zum ansprechen.
    Dort würden sich Arrays anbieten zum speichern der Control-IDs.

  • Hier noch mit nen paar Funktionen zugeordnet. Damit du weißt wie man dann auf die Nummer der Gruppe kommt.

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

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

    Opt("GUIOnEventMode", 1)

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

    Global $iColCount = 3

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

    GUICreate("Test", 530, 650)
    For $i = 0 To 8
    GUICtrlCreateGroup("13-12-1", (Mod($i, $iColCount) * 170) + 20, (Int($i / $iColCount) * 210) + 20, 150, 190)
    GUICtrlCreateLabel("Status: 3", (Mod($i, $iColCount) * 170) + 25, (Int($i / $iColCount) * 210) + 40, 55, 17)
    GUICtrlCreateLabel("Ort: Steinfurt", (Mod($i, $iColCount) * 170) + 25, (Int($i / $iColCount) * 210) + 65, 70, 17)
    GUICtrlCreateLabel("Besatzung: 1/3", (Mod($i, $iColCount) * 170) + 25, (Int($i / $iColCount) * 210) + 90, 90, 17)
    GUICtrlCreateLabel("Auftrag: Transport", (Mod($i, $iColCount) * 170) + 25, (Int($i / $iColCount) * 210) + 115, 100, 17)
    GUICtrlCreateButton("Auftrag ändern", (Mod($i, $iColCount) * 170) + 50, (Int($i / $iColCount) * 210) + 145, 90, 25, $WS_GROUP)
    GUICtrlSetOnEvent(-1, "_ChangeOrder")
    GUICtrlCreateButton("Status ändern", (Mod($i, $iColCount) * 170) + 55, (Int($i / $iColCount) * 210) + 175, 75, 25, $WS_GROUP)
    GUICtrlSetOnEvent(-1, "_ChangeStatus")
    Next
    GUISetState()

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

    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")

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

    While 1
    Sleep(10)
    WEnd

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

    Func _Exit()
    Exit
    EndFunc

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

    Func _ChangeOrder()
    Local $_iNo = ((@GUI_CtrlId - 8) / 7) + 1
    MsgBox(0, "", "Auftrag " & $_iNo & " ändern.")
    EndFunc

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

    Func _ChangeStatus()
    Local $_iNo = ((@GUI_CtrlId - 9) / 7) + 1
    MsgBox(0, "", "Status " & $_iNo & " ändern.")
    EndFunc

    [/autoit]


    Und ich würde dann das ganze im OnEvent-Modus machen. Das ist in dem Fall passend.