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!
Array in Echtzeit in GUI anzeigen
-
- [ gelöst ]
-
Scritch -
14. Juni 2011 um 16:35 -
Geschlossen -
Erledigt
-
-
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. -
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>
[/autoit] [autoit][/autoit] [autoit]
#include <GUIConstantsEx.au3>
#include <ListviewConstants.au3>
#include <array.au3>
#include <GuiListView.au3>
#include <WindowsConstants.au3>Dim $aNames[20][2]
[/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]$msg = GUICreate("", 200, 400)
[/autoit] [autoit][/autoit] [autoit]
$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")_RandomOnOff()
[/autoit] [autoit][/autoit] [autoit]GUISetState(@SW_SHOW)
[/autoit] [autoit][/autoit] [autoit];GUICtrlSetColor(-1, 0x22C21F)
[/autoit] [autoit][/autoit] [autoit]
;GUICtrlSetColor(-1, 0xAA0000)While 1
[/autoit] [autoit][/autoit] [autoit]
$msg = GUIGetMsg()
Switch $msg
Case $GUI_EVENT_CLOSE
;_GUICtrlListView_UnRegisterSortCallBack($ListView)
Exit
EndSwitch
WEndFunc _RandomOnOff()
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
_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 ;==>_RandomOnOffFunc _WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
[/autoit] [autoit][/autoit] [autoit]
#forceref $hWnd, $iMsg, $iwParam
Local $hWndFrom, $iCode, $tNMHDR, $hWndListView, $hWndListView2$hWndListView = $ListView
[/autoit] [autoit][/autoit] [autoit]
If Not IsHWnd($ListView) Then $hWndListView = GUICtrlGetHandle($ListView)$tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
[/autoit] [autoit][/autoit] [autoit]
$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
$iCode = DllStructGetData($tNMHDR, "Code")Switch $hWndFrom
[/autoit] [autoit][/autoit] [autoit]
Case $hWndListView
Switch $iCode
Case $LVN_COLUMNCLICK ; A column was clicked
Local $tInfo = DllStructCreate($tagNMLISTVIEW, $ilParam); Kick off the sort callback
[/autoit]
_GUICtrlListView_SortItems($hWndFrom, DllStructGetData($tInfo, "SubItem"))
; No return value
EndSwitch
EndSwitch
Return $__LISTVIEWCONSTANT_GUI_RUNDEFMSG
EndFunc ;==>_WM_NOTIFYmfg autoBert
-
Hey.
Ich bin mir jetzt nicht 100% sicher, aber du rufst in der Funktion "_RandomOnOff()" dashier auf :
[autoit]AdlibRegister("_RandomOnOff",500)
[/autoit]
[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.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
-
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>
[/autoit] [autoit][/autoit] [autoit]
#include <GUIConstantsEx.au3>
#include <ListviewConstants.au3>
#include <array.au3>
#include <GuiListView.au3>
#include <WindowsConstants.au3>Dim $aNames[20][2], $idItem
[/autoit] [autoit][/autoit] [autoit]$aNames[0][0] = "Jürgen"
[/autoit] [autoit][/autoit] [autoit]
$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]$msg = GUICreate("", 270, 400)
[/autoit] [autoit][/autoit] [autoit]
$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")_RandomOnOff()
[/autoit] [autoit][/autoit] [autoit]GUISetState(@SW_SHOW)
[/autoit] [autoit][/autoit] [autoit];GUICtrlSetColor(-1, 0x22C21F)
[/autoit] [autoit][/autoit] [autoit]
;GUICtrlSetColor(-1, 0xAA0000)While 1
[/autoit] [autoit][/autoit] [autoit]
$msg = GUIGetMsg()
Switch $msg
Case $GUI_EVENT_CLOSE
_GUICtrlListView_UnRegisterSortCallBack($ListView)
Exit
EndSwitch
WEndFunc _RandomOnOff()
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
_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 ;==>_RandomOnOffFunc _WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
[/autoit] [autoit][/autoit] [autoit]
#forceref $hWnd, $iMsg, $iwParam
Local $hWndFrom, $iCode, $tNMHDR, $hWndListView, $hWndListView2$hWndListView = $ListView
[/autoit] [autoit][/autoit] [autoit]
If Not IsHWnd($ListView) Then $hWndListView = GUICtrlGetHandle($ListView)$tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
[/autoit] [autoit][/autoit] [autoit]
$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
$iCode = DllStructGetData($tNMHDR, "Code")Switch $hWndFrom
[/autoit]
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_NOTIFYmfg 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.
[autoit]
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 mitGUICtrlSetData
[/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