Array in Echtzeit in GUI anzeigen

  • Hallo,
    ist es möglich, ein Array in Echtzeit in einer GUI anzeigen zu lassen? Das heisst das Array immer so anzeigen wie es gerade ist. Wenn in dem Array sich was ändert, soll dies ebenfals in der GUI angezeigt werden. Möglichst sollte das Anzeigen nicht viel Geschwindigkeit fressen!

    Einmal editiert, zuletzt von Scritch (17. Juni 2011 um 12:13)

  • Möglichst sollte das Anzeigen nicht viel Geschwindigkeit fressen!

    das ist von der Größe deines Arrays abhängig (Dimensionen und Ubounds)....
    ja du kannst sowas wie schon bei _ArrayDisplay bzw. _ArrayDisplayTree in deine GUI einbauen. Eine Liste die in Zeitabständen nach ihrer Aktualität prüft und dann die Werte ergänzt.

    "Je mehr Käse, desto mehr Löcher; je mehr Löcher, desto weniger Käse. Ergo: Je mehr Käse, desto weniger Käse. 8| "
    "Programmers never die: they just GOSUB without RETURN"
    "I tried to change the world but I couldn't find the source code."

  • Hallo Scritch,

    wie Developer30 schon schrieb geht das slebstveständlich. Ich habe mal in einem bestehenden Testprogramm ale unnötigen Sachen (Sortierung) auskommentiert und die Akzualisierung auf 500 ms eingestellt. das Ergebnis kannst du begutachten wenn du dieses Skriipt startest:

    Spoiler anzeigen
    [autoit]

    #include <GuiListView.au3>
    #include <GUIConstantsEx.au3>
    #include <ListviewConstants.au3>
    #include <array.au3>
    #include <GuiListView.au3>
    #include <WindowsConstants.au3>

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

    Dim $aNames[20][2]
    $aNames[0][0] = "Jürgen"
    $aNames[1][0] = "Peter"
    $aNames[2][0] = "Bert"
    $aNames[3][0] = "Christina"
    $aNames[4][0] = "Alex"
    $aNames[5][0] = "Astrid"
    $aNames[6][0] = "Roberto"
    $aNames[7][0] = "Heinz"
    $aNames[8][0] = "Iwan"
    $aNames[9][0] = "Robertina"
    $aNames[10][0] = "Hans"
    $aNames[11][0] = "Peter II."
    $aNames[12][0] = "Tina"
    $aNames[13][0] = "Michael"
    $aNames[14][0] = "Gunnar"
    $aNames[15][0] = "Kurt"
    $aNames[16][0] = "Gerald"
    $aNames[17][0] = "Alfred"
    $aNames[18][0] = "Stefanie"
    $aNames[19][0] = "Nicole"
    Dim $aItems[20]

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

    $msg = GUICreate("", 200, 400)
    $listview = GUICtrlCreateListView("Name|Status", 10, 10, 180, 350)
    For $i = 0 To 19
    $aItems[$i] = GUICtrlCreateListViewItem($aNames[$i][0] & "|Offline", $listview)
    Next
    _GUICtrlListView_SetColumnWidth($listview,0,140)
    _GUICtrlListView_SetColumnWidth($listview,1,40) ;0 = unsichtbar
    ;_GUICtrlListView_RegisterSortCallBack($listview)
    ;GUIRegisterMsg($WM_NOTIFY, "_WM_NOTIFY")

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

    _RandomOnOff()

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

    GUISetState(@SW_SHOW)

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

    ;GUICtrlSetColor(-1, 0x22C21F)
    ;GUICtrlSetColor(-1, 0xAA0000)

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

    While 1
    $msg = GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_CLOSE
    ;_GUICtrlListView_UnRegisterSortCallBack($ListView)
    Exit
    EndSwitch
    WEnd

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

    Func _RandomOnOff()
    _GUICtrlListView_BeginUpdate($ListView)
    For $i = 0 To 19
    If Random(1, 3, 1) = 1 Then
    $aNames[$i][1]="Off"
    Else
    $aNames[$i][1]="On"
    EndIf
    Next
    For $i = 0 To 19
    $iItem = _GUICtrlListView_FindText ($listview,$aNames[$i][0],-1,False,True)
    If $aNames [$i][1] = "Off" Then
    GUICtrlSetData($aItems[$iItem],"|Off")
    GUICtrlSetBkColor($aItems[$iItem], 0xAA0000)
    Else
    GUICtrlSetData($aItems[$iItem],"|On")
    GUICtrlSetBkColor($aItems[$iItem], 0x22C21F)
    EndIf
    Next
    ;_GUICtrlListView_SortItems($listview, 0)
    ;_GUICtrlListView_SortItems($listview, 1)
    _GUICtrlListView_EndUpdate($ListView)
    AdlibRegister("_RandomOnOff",500);,Random(5000,10000,1))
    EndFunc ;==>_RandomOnOff

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

    Func _WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    #forceref $hWnd, $iMsg, $iwParam
    Local $hWndFrom, $iCode, $tNMHDR, $hWndListView, $hWndListView2

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

    $hWndListView = $ListView
    If Not IsHWnd($ListView) Then $hWndListView = GUICtrlGetHandle($ListView)

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

    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iCode = DllStructGetData($tNMHDR, "Code")

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

    Switch $hWndFrom
    Case $hWndListView
    Switch $iCode
    Case $LVN_COLUMNCLICK ; A column was clicked
    Local $tInfo = DllStructCreate($tagNMLISTVIEW, $ilParam)

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

    ; Kick off the sort callback
    _GUICtrlListView_SortItems($hWndFrom, DllStructGetData($tInfo, "SubItem"))
    ; No return value
    EndSwitch
    EndSwitch
    Return $__LISTVIEWCONSTANT_GUI_RUNDEFMSG
    EndFunc ;==>_WM_NOTIFY

    [/autoit]

    mfg autoBert

  • Hey.

    Ich bin mir jetzt nicht 100% sicher, aber du rufst in der Funktion "_RandomOnOff()" dashier auf :

    [autoit]

    AdlibRegister("_RandomOnOff",500)

    [/autoit]


    Beim ersten durchlauf der Funktion, wird noch alles passen.
    Nach 0,5 Dec wird diese Funktion wieder aufgerufen, wo dann auch wieder dahier durchlaufen wird.

    [autoit]

    AdlibRegister("_RandomOnOff",500)

    [/autoit]


    Laut meiner Logig wird die Funktion "_RandomOnOff()" nun nach 0,5 sec 2 mal aufgerufen, nach weiteren 0,5 sec 4 mal, dann 8, 16 32, usw.

    Außer man kann mit "AdlibRegister()" eine Funktion nicht mehrmals registrieren.


    mfg Darter

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

  • Hat es eigentlich einen bestimmten Grund, dass du das Adlibregister innerhlab der Funktion unterbringst? Wäre es nicht effizienter die Funktion nur einmalig mit adlibregister zu registrieren anstatt jedesmal aufs neue?
    Vermutlich hat es keine negativen Auswirkungen, denn das Script funktioniert ja, ist nur reine Neugierde meinerseits. Soll damit garantiert werden, dass es wirklich exalt 500ms zwischen den Durchläufen sind, also die Laufzeit der eigentlichen Funktion keine Rolle spielt?

    EDIT: Bin ich also nicht der einzige dem das aufgefallen ist ^^

  • Hallo darter,

    dadurch wird für _RandomOnOff erneut die Zeit von 500 ms registriert deine Befürchtung trifft also nicht zu. Das ganze kommt durch die Änderung für dieses Thema im Original hatte ich

    [autoit]

    AdlibRegister("_RandomOnOff",Random(5000,10000,1))

    [/autoit]

    um eine zufällige Zeit für den nächsten Aufruf zu nehmen. Hier das Original:

    Spoiler anzeigen
    [autoit]

    #include <GuiListView.au3>
    #include <GUIConstantsEx.au3>
    #include <ListviewConstants.au3>
    #include <array.au3>
    #include <GuiListView.au3>
    #include <WindowsConstants.au3>

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

    Dim $aNames[20][2], $idItem

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

    $aNames[0][0] = "Jürgen"
    $aNames[1][0] = "Peter"
    $aNames[2][0] = "Bert"
    $aNames[3][0] = "Christina"
    $aNames[4][0] = "Alex"
    $aNames[5][0] = "Astrid"
    $aNames[6][0] = "Roberto"
    $aNames[7][0] = "Heinz"
    $aNames[8][0] = "Iwan"
    $aNames[9][0] = "Robertina"
    $aNames[10][0] = "Hans"
    $aNames[11][0] = "Peter II."
    $aNames[12][0] = "Tina"
    $aNames[13][0] = "Michael"
    $aNames[14][0] = "Gunnar"
    $aNames[15][0] = "Kurt"
    $aNames[16][0] = "Gerald"
    $aNames[17][0] = "Alfred"
    $aNames[18][0] = "Stefanie"
    $aNames[19][0] = "Nicole"
    Dim $aItems[20]

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

    $msg = GUICreate("", 270, 400)
    $listview = GUICtrlCreateListView("Name|Status|Zeit", 10, 10, 250, 350)
    For $i = 0 To 19
    $aItems[$i] = GUICtrlCreateListViewItem($aNames[$i][0] & "|Offline|-1", $listview)
    Next
    _GUICtrlListView_SetColumnWidth($listview,0,140)
    _GUICtrlListView_SetColumnWidth($listview,1,40) ;0 = unsichtbar
    _GUICtrlListView_RegisterSortCallBack($listview)
    GUIRegisterMsg($WM_NOTIFY, "_WM_NOTIFY")

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

    _RandomOnOff()

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

    GUISetState(@SW_SHOW)

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

    ;GUICtrlSetColor(-1, 0x22C21F)
    ;GUICtrlSetColor(-1, 0xAA0000)

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

    While 1
    $msg = GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_CLOSE
    _GUICtrlListView_UnRegisterSortCallBack($ListView)
    Exit
    EndSwitch
    WEnd

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

    Func _RandomOnOff()
    _GUICtrlListView_BeginUpdate($ListView)
    For $i = 0 To 19
    If Random(1, 3, 1) = 1 Then
    $aNames[$i][1]="Off"
    Else
    $aNames[$i][1]="On"
    EndIf
    Next
    For $i = 0 To 19
    $iItem = _GUICtrlListView_FindText ($listview,$aNames[$i][0],-1,False,True)
    If $aNames [$i][1] = "Off" Then
    GUICtrlSetData($aItems[$iItem],"|Off|-1")
    GUICtrlSetBkColor($aItems[$iItem], 0xAA0000)
    Else
    GUICtrlSetData($aItems[$iItem],"|On|" & Random(10,9999,1))
    GUICtrlSetBkColor($aItems[$iItem], 0x22C21F)
    EndIf
    Next
    _GUICtrlListView_SortItems($listview, 0)
    _GUICtrlListView_SortItems($listview, $idItem)
    _GUICtrlListView_EndUpdate($ListView)
    AdlibRegister("_RandomOnOff",Random(5000,10000,1))
    EndFunc ;==>_RandomOnOff

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

    Func _WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    #forceref $hWnd, $iMsg, $iwParam
    Local $hWndFrom, $iCode, $tNMHDR, $hWndListView, $hWndListView2

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

    $hWndListView = $ListView
    If Not IsHWnd($ListView) Then $hWndListView = GUICtrlGetHandle($ListView)

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

    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iCode = DllStructGetData($tNMHDR, "Code")

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

    Switch $hWndFrom
    Case $hWndListView
    Switch $iCode
    Case $LVN_COLUMNCLICK ; A column was clicked
    Local $tInfo = DllStructCreate($tagNMLISTVIEW, $ilParam)
    $idItem = DllStructGetData($tInfo, "SubItem")
    ; Kick off the sort callback
    _GUICtrlListView_SortItems($hWndFrom, $idItem)
    ; No return value
    EndSwitch
    EndSwitch
    Return $__LISTVIEWCONSTANT_GUI_RUNDEFMSG
    EndFunc ;==>_WM_NOTIFY

    [/autoit]

    mfg autobert

  • Danke für eure Antworten. Aber die bringen mich nur bedingt weiter. Mit _ArrayDisplayTree kann ich z. B. gar nichts anfangen.
    Ich soll das Array in der GUI also mithilfe von einem LisView anzeigen. Das habe ich versatanden. Allerdings verändert sich
    die Größe meines Arrays dynamisch und die Werte ebenfalls. Größe max $array[190][2]

  • Naja in Autoberts Beispiel werden die Werte doch auch dynamisch verändert, zumindestens die in der zweiten Spalte (On/Off). Wenn du dort auch mit dynamischen Array Größen arbeiten willst musst du nur bei den For Schleifen statt einer festen Abbruchbedingung (bei seinem Beispiel 19) mit ubound($array)-1 arbeiten. Dann spielt es für die Adlib Funktion keine Rolle ob sich die Arraygröße zwischenzeitlich verändert hat.

  • Okay, habs soweit geschafft in mein ListView mein Array zu schreiben. Das mit der dynamischen Veränderung des ListViews bekomme ich aber noch nicht hin. Habe habe ich irgendwie noch eine Blockade.
    Ich habe jetzt 2 Spalten in meinem Listview und sagen wir 160 Zeilen. Nun möchte ich den Wert in der 4. Zeile, Spalte 2 ändern. Denke das sollte ich ja mit

    [autoit]

    GUICtrlSetData

    [/autoit]


    hinbekommen. Geht aber irgendwie nicht. Wie sage ich der Funktion, dass in die 4. Zeile, 2. Spalte der Wert geändert wird? AutoBernds Bsp. bringt mich gerade leider nicht weiter :(