Zeile aus Array auswählen und in Variable speichern

  • Hallo,

    Ich würde gerne wissen wie es möglich ist ein Array als Liste darzustellen und dann eine Zeile aus dieser Liste auszuwählen und diese in einer Variable zu speichern (z.B. für eine Art Taskmanager).

    MfG ExChill

  • Ein 1-Dimensionales Array ist eine Liste! ;)

    [autoit]


    Dim $aArray[5] = ["Eintrag 1","Eintrag 2","Eintrag 3","Eintrag 4","Eintrag 5"]

    [/autoit]


    Nun greifst du auf das erste Listenelement (Eigentlich der 0te Eintrag!) wie folgt zu:

    [autoit]


    $sVar = $aArray[0] ;Ruft den ersten Eintrag/erste Zeile des Arrays auf
    MsgBox(0,"",$sVar)

    [/autoit]

    lg chess :)

  • Meinst du das mit dem aus der liste auswählen ungefähr so?

    Spoiler anzeigen
    [autoit]


    #include <GuiConstants.au3>
    #include <GuiComboBoxEx.au3>

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

    Global $aArray[5] = ["Eintrag 1","Eintrag 2","Eintrag 3","Eintrag 4","Eintrag 5"]

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

    $hGui = GUICreate("GUI", 210, 310)
    GUISetState(@SW_SHOW)

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

    $hListView = GUICtrlCreateListView("Einträge ", 5, 5, 200, 300)
    For $i = 0 To UBound($aArray)-1
    GUICtrlCreateListViewItem($aArray[$i], $hListView)
    Next

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

    $sChoosen = GUICtrlRead($hListView)
    While Sleep(10)
    $msg = GUIGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
    Exit
    Case $sChoosen <> GUICtrlRead($hListView)
    $sChoosen = GUICtrlRead($hListView)
    MsgBox(64, GUICtrlRead(GUICtrlRead($hListView)), "Es wurde auf "&StringTrimRight(GUICtrlRead(GUICtrlRead($hListView)), 1)&" geklickt.")
    EndSelect
    WEnd

    [/autoit]


    (schau dir auch mal die Hilfe und das Beispiel zu

    [autoit]

    GUICtrlCreateListView

    [/autoit]

    an)

  • Ja, sowas meinte ich. Vielen dank an euch beide :)

    Das Fenster schließt sich nur immer direkt wieder. Wisst ihr woran das liegt?

    EDIT: Problem schon gelöst :P

    So, habe jetz alles ein bisschen abgeändert und mit dem was ich schon hatte kombiniert.

    Spoiler anzeigen
    [autoit]

    #include <GuiConstants.au3>
    #include <GuiComboBoxEx.au3>

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

    Global $aprocess = ProcessList()

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

    $gui = GUICreate("Programm", 210, 310)
    GUISetState(@SW_SHOW)

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

    $processlist = GUICtrlCreateListView("Prozess | ID", 5, 5, 200, 300)
    For $i = 0 To UBound($aprocess)-1
    GUICtrlCreateListViewItem($aprocess, $processlist)
    Next

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

    $processclick = GUICtrlRead($processlist)

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

    While Sleep(10)
    $msg = GUIGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
    Exit
    Case $processclick <> GUICtrlRead($processlist)
    $processclick = GUICtrlRead($processlist)
    MsgBox (0, "Test", $processclick)
    EndSelect
    WEnd

    [/autoit]

    Es werden nur leider keine Inhalte in der Liste angezeigt. Außerdem hat die Liste nur eine Spalte (siehe Bild).

    Spoiler anzeigen

    [Blockierte Grafik: http://i.epvpimg.com/10uLc.jpg]

    Einmal editiert, zuletzt von ExChill (6. Oktober 2012 um 23:54)

  • Ist ja auch klar, weil man bei Listviews mit mehreren Spalten die Werte jeder Spalte mit Trennzeichen angibt:

    [autoit]


    GUICtrlCreateListViewItem("wert_spalte1|wert_spalte2", $processlist)

    [/autoit]

    Ausserdem kann nur ein wie oben gezeigter String an die Funktion übergeben werden, nicht ein komplettes Array, wie du es von processlist() bekommst. Du musst dir diesen String also zunächst selbst "bauen":

    [autoit]


    GUICtrlCreateListViewItem($aprocess[1][0] & "|" & $aprocess[1][1], $processlist) ; das zeigt den ersten prozess und die zugehörige id an

    [/autoit]

    In deiner Schleife würdest du dann eben die Zeile durch $i ersetzen und so alle Infos des Arrays ins Listview verfrachten.
    Außerdem war ich mal so frei die Schleife so zu ändern, dass du wirklich nur die Prozesse erhältst, denn diese fangen erst bei 1 an, in Zeile 0 des Arrays steht lediglich wieviele Treffer gefunden wurden.

    Spoiler anzeigen
    [autoit]


    #include <GuiConstants.au3>
    #include <GuiComboBoxEx.au3>

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

    Global $aprocess = ProcessList()

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

    $gui = GUICreate("Programm", 210, 310)
    GUISetState(@SW_SHOW)

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

    $processlist = GUICtrlCreateListView("Prozess | ID", 5, 5, 200, 300)
    For $i = 1 To UBound($aprocess)-1
    GUICtrlCreateListViewItem($aprocess[$i][0] & "|" & $aprocess[$i][1], $processlist)
    Next

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

    $processclick = GUICtrlRead($processlist)

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

    While Sleep(10)
    $msg = GUIGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
    Exit
    Case $processclick <> GUICtrlRead($processlist)
    $processclick = GUICtrlRead($processlist)
    MsgBox (0, "Test", $processclick)
    EndSelect
    WEnd

    [/autoit]
  • Nochmal vielen Dank an euch beide :D

    Mit _ArrayDispplay hab ich es natürlich auch zuerst gemacht, allerdings öffnet sich dabei ja ein eigenes Fenster.

    Habe auch direkt neue Fragen :P

    1. Wieso fängt die Liste bei 6 an (siehe Bild)?

    Spoiler anzeigen

    [Blockierte Grafik: http://i.epvpimg.com/fM2Nb.jpg]

    2. Ich muss immer erst einmal auf den Tab Streams klicken und dann wieder auf Prozesse damit die Liste angezeigt wird. Wenn ich das Programm starte, wird auch im Tab Prozesse die Internetseite angezeigt.

    3. Wie kann ich die Länge der beiden Spalten "Prozesse" und "ID" ändern?

    Aktueller Code:

    Spoiler anzeigen
    [autoit]

    #include <GuiConstants.au3>
    #include <GuiComboBoxEx.au3>
    #include <Array.au3>
    #include <IE.au3>

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

    Global $aprocess = ProcessList()

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

    $gui = GUICreate("Programm", 1920, 1000)
    GUISetState(@SW_SHOW)

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

    $tab = GUICtrlCreateTab (0, 0, 1920, 20)

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

    $tpitem = GUICtrlCreateTabItem ("Prozesse")
    $processlist = GUICtrlCreateListView("Prozess | ID", 0, 20, 1920, 980)
    For $i = 0 To UBound($aprocess)-1
    GUICtrlCreateListViewItem($aprocess[$i][0] & "|" & $aprocess[$i][1], $processlist)
    Next

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

    $processclick = GUICtrlRead($processlist)

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

    $tsitem = GUICtrlCreateTabItem ("Streams")
    $ie = _IECreateEmbedded ()
    $browser = GUICtrlCreateObj ($ie, 0, 20, 1920, 980)
    _IENavigate ($ie, "www.twitch.tv")

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

    While Sleep(10)
    $msg = GUIGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
    Exit
    Case $processclick <> GUICtrlRead($processlist)
    $processclick = GUICtrlRead($processlist)
    MsgBox (0, "Test", $processclick)
    EndSelect
    WEnd

    [/autoit]

    (Die Variablen tpitem und tsitem stehen für tabprocessitem und tabstreamitem)

    MfG ExChill

  • Ein 1-Dimensionales Array kann man sich aber am einfachsten als Liste vorstellen.
    Wir reden hier ja nicht von Liste im Sinne von ObjCreate("System.Collections.ArrayList"). :P


    Doch, eigentlich schon. Eine ArrayList ist eine Liste, die intern durch ein Array verwaltet wird. ;)
    Es wird dem Benutzer/Programmierer nur die Arbeit mit dem Array erleichtert.

  • So, ich habe bis jetzt diesen Code:

    [autoit]

    ;PROZESSE
    $tpitem = GUICtrlCreateTabItem ("Prozesse")
    $processlist = GUICtrlCreateListView("Prozess | ID", 0, 20, 1905, 900)
    For $i = 0 To UBound($aprocess)-1
    GUICtrlCreateListViewItem($aprocess[$i][0] & "|" & $aprocess[$i][1], $processlist)
    Next

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

    $processclick = GUICtrlRead($processlist)

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

    $bpend = GUICtrlCreateButton ("Prozess beenden", 20, 930, 100, 25) ;Button Process End
    $brefresh = GUICtrlCreateButton ("Aktualisieren", 140, 930, 100, 25) ;Button Refresh

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

    $buttonclick = GUIGetMsg ()

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

    If $buttonclick = $bpend Then
    ProcessClose ($???)
    EndIf

    [/autoit]

    Was muss ich jetzt am Ende bei den Fragezeichen eintragen, damit der richtige Prozess beendet wird?

    Außerdem hab ich noch ein kleines Porblem und zwar ist der erste Eintrag im Array, wenn ich

    [autoit]

    $processclick = GUICtrlRead($processlist)

    [/autoit]

    benutze, nicht 0 sondern 6. Woran liegt das?

  • So, ich habe bis jetzt diesen Code:

    [autoit]

    $tpitem = GUICtrlCreateTabItem ("Prozesse")
    $processlist = GUICtrlCreateListView("Prozess | ID", 0, 20, 1905, 900)
    For $i = 0 To UBound($aprocess)-1
    GUICtrlCreateListViewItem($aprocess[$i][0] & "|" & $aprocess[$i][1], $processlist)
    Next

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

    $processclick = GUICtrlRead($processlist)

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

    $bpend = GUICtrlCreateButton ("Prozess beenden", 20, 930, 100, 25) ;Button Process End
    $brefresh = GUICtrlCreateButton ("Aktualisieren", 140, 930, 100, 25) ;Button Refresh

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

    $buttonclick = GUIGetMsg ()

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

    If $buttonclick = $bpend Then
    ProcessClose ($???)
    EndIf

    [/autoit]

    1. Frage: Der erste Eintrag im Array hat, wenn ich "$processclick = GUICtrlRead($processlist)" benutze, nicht den Wert 0 sondern 6. Woran liegt das?
    2. Frage: Was muss ich bei den Fragezeichen eintragen, damit der richtige Wert beendet wird?

    MfG ExChill

    • Offizieller Beitrag

    1. Frage: Der erste Eintrag im Array hat, wenn ich "$processclick = GUICtrlRead($processlist)" benutze, nicht den Wert 0 sondern 6. Woran liegt das?
    2. Frage: Was muss ich bei den Fragezeichen eintragen, damit der richtige Wert beendet wird?


    zu 1.
    Du kannst nicht die ID des Listview verwenden, sondern mußt die ID des ausgewählten ListViewItem nutzen. Besser: Arbeite mit der Listview-UDF (s. Hilfe)

    zu 2.
    Da gehört die PID des zu schließenden Prozesses rein, also bei deinem Listview, der Eintrag aus SpaltenIndex 1 des selektierten Item.

  • Vielen Dank :)

    Ist es dann so richtig?

    [autoit]

    $tpitem = GUICtrlCreateTabItem ("Prozesse")
    $processlist = GUICtrlCreateListView("Prozess | ID", 0, 20, 1905, 900)
    For $i = 0 To UBound($aprocess)-1
    $processlistitem = GUICtrlCreateListViewItem($aprocess[$i][0] & "|" & $aprocess[$i][1], $processlist)
    Next

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

    $processclick = GUICtrlRead($processlistitem)

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

    $bpend = GUICtrlCreateButton ("Prozess beenden", 20, 930, 100, 25) ;Button Process End
    $brefresh = GUICtrlCreateButton ("Aktualisieren", 140, 930, 100, 25) ;Button Refresh

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

    $buttonclick = GUIGetMsg ()

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

    $processclick2 = $aprocess[$processclick][1]

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

    If $buttonclick = $bpend Then
    ProcessClose ($processclick2)
    EndIf

    [/autoit]