GUI Variable Positionen von z.B. Labeln?

  • Hi, ich habe ne Idee aber leider kein blassen Schimmer wie ich sie umsetzen soll.
    Ich habe z.B.:
    Name1, Name2, Name3, Zahl1, Zahl2, Zahl3, wobei Name1 und Zahl1 immer zusammen gehören und neben einander stehen sollen.
    Die Zahlen werden durch Funktionen verändert, z.B. Name1: Zahl1(500) soll dann an Pos1 stehen.
    An Pos2 soll dann der Name und die Zahl stehen, die höher als 0 ist, wobei alle Zahlen mit 0 anfangen.
    Wenn Zahl2 also 0 ist und Zahl3 z.B. 100, dann soll Name3 und Zahl3(100) an Pos2 stehen, sobald Zahl2 höher als 0 ist, soll dann Name2 und Zahl2 and Pos2 stehen und Name3 und Zahl3 an Pos3.
    Hoffentlich ist das verständlich hehe.
    So das wäre die erste Idee, die zweite wäre, dass die Anordnung nicht von Name1, Name2, Name3, usw. abhängt, sondern von der Höhe der Zahlen, z.B.:
    Name1 und Zahl1(500) an Pos1
    Name3 und Zahl3(100) an Pos2
    Name2 und Zahl2(0) soll nicht angezeigt werden solange nicht höher als 0
    Und wenn dann Zahl2 z.B. einen Wert von 1000 hat, soll Name2 und Zahl2 an Pos1 stehen und die anderen nach unten verschoben.

    Ist das so mit Labeln überhaupt möglich? Man könnte ja Name und Zahl mit einander verknüpfen und mit irgendeiner Funktion, die höchste Zahl mit dem verknüpften Namen in Label1 schreiben, mit einer anderen Funktion, die vorherigen Daten aus Label1 in Label2 übertragen.
    Oder würde sich da etwas anderes effektiver als Label erweisen?
    Ich habs noch nicht getestet, aber kann man mittels Funktionen, die Strings in einem Listenfeld ausblenden und verändern und Name und Zahl verknüpfen? Und wenn man dann z.B. Name2 und Zahl2 ausblendet, schiebt sich dann Name3 und Zahl3 automatisch an Pos2, solange bis Zahl2 nicht höher als 0 ist, oder für die zweite Idee, eben höher als Zahl3.

    Ich hoffe es ist verständlich genug was ich meine und hoffe auch jemand hat ne super Lösung parat :D

    Einmal editiert, zuletzt von MrShady187 (22. Oktober 2014 um 20:36)

  • Hi,
    das was du machen möchtest, nennt man "sortieren".
    Dafür gibts einfache Sortierfunktionen, bspw. ArraySort()

  • Okay danke, leider hab ich noch keine Zeit gefunden mich mit Arrays zu beschäftigen.
    Ist das dann so, dass ich mit Array1(Name1, Zahl1), Name und Zahl verknüpfen kann?
    Und mit ArraySort dann mehrere Arrays nach dem 2. Wert der einzelnen Arrays sortieren kann?
    Sicherlich geht das nicht mit Labeln oder? Würde sich dort ein Listenfeld besser eignen?
    Kann ich dann auch mit einer Array-Funktion, Arrays ausblenden oder ganz einfach If Array1(Wert2) = "0" Then "hide"Array1?
    Wie könnte denn so eine "hide"Array1 Funktion aussehen?

  • So?

    [autoit]

    #include <Array.au3>
    Dim $array[5][2] = [["Anton", 500],["Berta", 0],["Cäsar", 800],["Doris", 0],["Erwin", 300]] ;array erzeugen, eine Methode von vielen

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

    _ArrayDisplay($array) ;anzeigen

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

    _ArraySort($array, 1, 0, 0, 1) ;sortieren

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

    _ArrayDisplay($array) ;anzeigen

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

    $text = ""
    For $i = 0 To UBound($array) - 1 ;array durchlaufen
    If $array[$i][1] <> 0 Then ;wenn zahl<>0 dann
    $text &= $array[$i][0] & "," & $array[$i][1] & @CRLF ;auflisten
    EndIf
    Next

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

    MsgBox(0, "ohne Null", $text)

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

    ;oder
    While $array[UBound($array) - 1][1] = 0 ;solange letzte zahl im array null ist
    _ArrayDelete($array, UBound($array) - 1);dieses element löschen
    WEnd
    _ArrayDisplay($array) ;anzeigen

    [/autoit]
  • Super vielen dank, allerdings hab ichs noch nicht hin bekommen, 2D-Arrays in eine ListView rein zu stecken, da ich das in meiner GUI angezeigt haben will und nicht in einem extra Fenster, aber ich lese und probiere noch weiter aus, dabei lernt man ja am besten.

    • Offizieller Beitrag

    Wenn du deinen Versuch postest und uns sagst wo es hängt, kann man dir helfen ;)

  • Naja wie gesagt ich lerne noch und hab meine erfolglosen Versuche wieder gelöscht :D
    Aber auf jeden Fall danke für das Angebot, ich werd mich noch mal ran hängen und gucken wo es hängt.
    Wenn ich dann soweit bin, dass ich was posten kann, werd ich das mal tun :)

  • Also mich würde mal interessieren, wieso bei diesem Code die "-1" steht

    [autoit]

    While $array[UBound($array) - 1][1] = 0 ;solange letzte zahl im array null ist
    _ArrayDelete($array, UBound($array) - 1);dieses element löschen
    WEnd

    [/autoit][autoit]

    For $i = 0 To UBound($array) - 1 ;array durchlaufen
    If $array[$i][1] <> 0 Then ;wenn zahl<>0 dann
    $text &= $array[$i][0] & "," & $array[$i][1] & @CRLF ;auflisten
    EndIf
    Next

    [/autoit]


    Bei dem Bsp. heißt es ja eigentlich von 0 bis "5-1" denk ich mal oder? Weil da die "0" auch mit gezählt wird, aber bei dem anderen, sieht das für mich so aus, als würde er "5-1" Zeilen berücksichtigen.

    Und ich steh jetzt vor dem Problem, dass wenn in der ListView so und so viel Zeilen sind, schreibe weiter in Spalte 3 und 4.
    Aber ich will nicht die Namen grundsätzlich in Spalte 1,2 und Spalte 3,4 teilen, sondern es sollen alle Namen und zahlen in Spalte 1,2 rein bis nicht eine bestimmte länge erreicht ist.

    Hier mein bisheriger Code:

    [autoit]

    #include <Array.au3>
    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <GUIListBox.au3>
    #include <StaticConstants.au3>
    #include <TabConstants.au3>
    #include <WindowsConstants.au3>
    #include <ListViewConstants.au3>
    #include <GuiListView.au3>

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 620, 622, 645, 90)
    $ListView1 = GUICtrlCreateListView("", 0, 0, 620, 590)
    $Button1 = GUICtrlCreateButton("Button1", 272, 590, 75, 25)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    $AdCol = False

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

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

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

    EndSwitch
    WEnd

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

    Func AdArray()
    _GUICtrlListView_DeleteAllItems(GUICtrlGetHandle($ListView1))
    Dim $array[43][4] = [["Name1", 500],["Name2", 7],["Name3", 800],["Name4", 5],["Name5", 300],["Name",3],["Name",3],["Name",3],["Name",3],["Name",3],["Name",3],["Name",3],["Name",3],["Name",3],["Name",3],["Name",3],["Name",3],["Name",3],["Name",3],["Name",3],["Name",3],["Name",3],["Name",3],["Name",3],["Name",3],["Name",3],["Name",3],["Name",3],["Name",3],["Name",3],["Name",3],["Name",3],["Name",3],["Name",3],["Name",3],["Name",3],["Name",3],["Name",3],["Name",3],["Name",3],["Name",3],["Name",3],["Name",3]]
    _ArraySort($array, 1, 0, 0, 1)
    While $array[UBound($array) - 1][1] = 0
    _ArrayDelete($array, UBound($array) - 1)
    WEnd

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

    If $AdCol = False Then
    _GUICtrlListView_AddColumn($ListView1, "Name", 100)
    _GUICtrlListView_AddColumn($ListView1, "Zahl", 100)
    $AdCol = True
    EndIf
    _GUICtrlListView_AddArray($ListView1, $array)

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

    EndFunc

    [/autoit]
  • Also mich würde mal interessieren, wieso bei diesem Code die "-1" steht


    In der While/Wend-Schleife wird das letzte Arrayelement gelöscht. Daraus ergibt sich, das ubound() automatisch um eins vermindert wird! Und somit im nächsten Schleifendurchlauf wieder das letzte Element usw...

    Aber ich will nicht die Namen grundsätzlich in Spalte 1,2 und Spalte 3,4 teilen, sondern es sollen alle Namen und zahlen in Spalte 1,2 rein bis nicht eine bestimmte länge erreicht ist.


    Also so, dass nachdem die erste Spalte gefüllt ist, die weiteren Elemente in die 3. Spalte geschrieben wird, dann in die 5. usw.?

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <GUIListBox.au3>
    #include <StaticConstants.au3>
    #include <TabConstants.au3>
    #include <WindowsConstants.au3>
    #include <ListViewConstants.au3>
    #include <GuiListView.au3>

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 620, 622, 645, 90)
    $ListView1 = GUICtrlCreateListView("", 0, 0, 620, 590)
    $Button1 = GUICtrlCreateButton("Button1", 272, 590, 75, 25)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    $AdCol = False

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

    Global $Array[100][2]
    For $i = 0 To UBound($array, 1) - 1
    $array[$i][0] = "Name" & $i
    $array[$i][1] = $i
    Next

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

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

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

    EndSwitch
    WEnd

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

    Func AdArray()
    _GUICtrlListView_DeleteAllItems(GUICtrlGetHandle($ListView1))
    _ArraySort($array, 1, 0, 0, 1)
    While $array[UBound($array) - 1][1] = 0
    _ArrayDelete($array, UBound($array) - 1)
    WEnd

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

    $anzahl_Zeilen = 28 ;Platz im Fenster
    $anzahl_spalten = Int(UBound($array) / 28) + 1 ;benötigt

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

    If $AdCol = False Then
    For $x = 1 To $anzahl_spalten
    _GUICtrlListView_AddColumn($ListView1, "Name", 100)
    _GUICtrlListView_AddColumn($ListView1, "Zahl", 100)
    Next
    $AdCol = True
    EndIf

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

    Dim $array2[$anzahl_Zeilen + 1][$anzahl_Spalten * 2] ;2. Array

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

    For $i = 0 To UBound($array) - 1
    $zeile = Mod($i, $anzahl_zeilen)
    $spalte = (Int($i / $anzahl_zeilen)) * 2
    $array2[$zeile][$spalte] = $array[$i][0]
    $array2[$zeile][$spalte + 1] = $array[$i][1]
    Next

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

    _GUICtrlListView_AddArray($ListView1, $array2)

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

    EndFunc ;==>AdArray

    [/autoit]

    Die Anzahl der verfügbaren Zeilen im Fenster kannst du ausrechnen, indem du die Höhe des Fensterinhaltes durch die Anzahl der Listview_Zeilenhöhe teilst.

  • OMG, genauso meinte ich das ja :D Super vielen Dank!!
    Dann werd ich mich mal daran machen das in mein Script ein zu passen, Allen vielen Dank für die Hilfe ;)

    EDIT:
    Also, ich hab noch das eine Problem, dass wenn alle Zahlen 0 sind bzw. nicht da, stürzt das Programm ab.
    Die Zahlen der Arrays sind Variablen, die aus einer Ini geladen werden.

    6 Mal editiert, zuletzt von MrShady187 (25. Oktober 2014 um 21:26)