Probleme mit Listview-Aktualisierung

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

Filzfrosch
Posts: 81
Joined: 18 Feb 2017, 08:39
Location: Hamburg / Germany

Probleme mit Listview-Aktualisierung

14 May 2024, 07:32

Moin, ich probiere und probiere, aber kriegs nicht vernünftig hin ...
Also, ich habe in einer GUI zwei verschiedene Listviews untereinander.

Code: Select all

Gui, 1: Add, ListView, R3 x5 y5 w400 vListe1, Info1|Info2|Info3|Info4|Info5
LV_Add( "", Wert1_1, Wert1_2, Wert1_3, Wert1_4, Wert1_5)
LV_Add( "", Wert2_1, Wert2_2, Wert2_3, Wert2_4, Wert2_5)
LV_Add( "", Wert3_1, Wert3_2, Wert3_3, Wert3_4, Wert3_5)
LV_ModifyCol( 1, "AutoHdr Left")
LV_ModifyCol( 2, "AutoHdr Left Text")
LV_ModifyCol( 3, "AutoHdr Left Text")
LV_ModifyCol( 4, "AutoHdr Right Float SortDesc")
LV_ModifyCol( 5, "AutoHdr Right Float")

Gui, 1: Add, ListView, R3 x5 y+10 w400 vListe2, Info6|Info7|Info8|Info9|Info10
LV_Add( "", Wert4_1, Wert4_2, Wert4_3, Wert4_4, Wert4_5)
LV_Add( "", Wert5_1, Wert5_2, Wert5_3, Wert5_4, Wert5_5)
LV_Add( "", Wert6_1, Wert6_2, Wert6_3, Wert6_4, Wert6_5)
LV_ModifyCol( 1, "AutoHdr Left")
LV_ModifyCol( 2, "AutoHdr Right Float")
LV_ModifyCol( 3, "AutoHdr Right Float")
LV_ModifyCol( 4, "AutoHdr Right Float SortDesc")
LV_ModifyCol( 5, "AutoHdr Right Float")
Die Werte der Variablen Wert1_1 bis Wert6_5 verändern sich im Hintergrund und sollen dann in beiden Listviews jede Minute aktualisiert werden.
Ich habe es in einem Timer mit LV_Modify probiert und auch mit LV_Delete/LV_Add, aber entweder aktualisiert sich nur eine der beiden LVs oder die Werte werden durcheinander gewirbelt oder es passiert schlicht gar nix.
Ich muss wohl zugeben, dass ich die Logik des aktualisierens von Listviews irgendwie nicht durchschaut habe ...
Kann mir jemand anhand des Beispiels oben vlt mal zeigen wie es aussehen muss, damit das auch stabil funktioniert?
Dank im voraus!
Merry Crisis and a happy new fear
gero
Posts: 183
Joined: 02 Oct 2013, 05:36

Re: Probleme mit Listview-Aktualisierung

14 May 2024, 14:50

Hallo
Loop ist imho das mittel der Wahl.
Du musst dem Script das LV zuweisen welches gemeint ist, dann klappt das auch.
Der u.g. Bezeichner sollte auch vor dem Erstellen des LV stehen.

Code: Select all

Gui, Listview, Syslistview321 ; < Bezeichner welches LV
Loop,3
{
LV_Modify(A_Index,"", Wert%A_Index%_1, Wert%A_Index%_2  ,...usw... ,....)
}

COUNTER=3
Gui, Listview, Syslistview322 ; < Bezeichner  welches LV
Loop,3
{
COUNTER++
LV_Modify(A_Index,"", Wert%COUNTER%_1, Wert%COUNTER%_2  ,..usw.... ,....)
}
COUNTER:=""
gruss
gero
just me
Posts: 9763
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Probleme mit Listview-Aktualisierung

15 May 2024, 02:56

Moin,

@gero hat recht. Trotzdem noch ein paar Ergänzungen:

Die Beschreibung der ListView-Funktionen findet sich hier: Interne ListView-Funktionen.
Alle folgenden ListView-Funktionen arbeiten mit dem Standard-GUI-Fenster des aktuellen Threads (was z.B. mit Gui, 2:Default geändert werden kann). Wenn das Standardfenster nicht existiert oder keine ListView-Steuerelemente hat, geben alle Funktionen Null zurück, um das Problem zu kennzeichnen.

Wenn das Fenster mehr als ein ListView-Steuerelement hat, arbeiten die Funktionen standardmäßig mit dem zuletzt hinzugefügten. Um dies zu ändern, verwenden Sie Gui, ListView, ListViewName, wobei ListViewName entweder der Name der zugeordneten Variable, die ClassNN-Bezeichnung (wie vom internen Tool "Window Spy" angezeigt) oder in [v1.1.04+] die HWND-Nummer (eindeutige ID) der ListView ist. Einmal geändert, werden alle existierenden und zukünftigen Threads die angegebene ListView verwenden. [v1.1.23+]: A_DefaultListView enthält die aktuelle Einstellung.

Das Standard-GUI-Fenster ist nur dann interessant, wenn man mehr als ein GUI hat oder das eine GUI nicht die Nummer / den Namen 1 trägt. Nur dann muss man das Standard-Fenster setzen und dann auch nur, wenn das aktuelle Standard-Fenster ein anderes ist.

Wenn ein Fenster mehr als ein ListView-Steuerelement enthält, solltest Du vor Verwendung der ListView-Funktionen immer das Standard-ListView-Steuerelement setzen. Das erspart Dir einiges Grübeln, wenn Du Dein Skript änderst und das dadurch notwendig wird. Dafür sollte man den ListViews Namen geben, aber das hast Du ja schon getan.

Wenn man in einem Programmschritt viele Zeilen im ListView ändert, empfiehlt es sich, das Neuzeichnen davor ab- und danach wieder anzuschalten. Der Hinweis darauf findet sich hier: Optionen und Styles für den Optionen-Parameter->Count. Wenn Du tatsächlich nur 4 Zeilen hast, wirst Du das eher nicht brauchen.

Eine 'komplette' Routine für den Update Deiner 2 ListViews könnte damit so aussehen:

Code: Select all

Gui, 1:Default ; überflüssig
; ----------------------------------
Gui, ListView, Liste1
GuiControl, -Redraw, Liste1
LV_Delete() ; ListView leeren oder auch nicht
; ...
; ListView neu füllen / ändern
; ...
GuiControl, +Redraw, Liste1
; ----------------------------------
Gui, ListView, Liste2
GuiControl, -Redraw, Liste2
LV_Delete() ; ListView leeren oder auch nicht
; ...
; ListView neu füllen / ändern
; ...
GuiControl, +Redraw, Liste2
Filzfrosch
Posts: 81
Joined: 18 Feb 2017, 08:39
Location: Hamburg / Germany

Re: Probleme mit Listview-Aktualisierung

15 May 2024, 15:07

Moin,
vielen Dank!
Das war nur ein Beispiel für den Aufbau. Die Variablen haben zum Teil noch andere Namen ich wollte das Beispiel nur nicht so kompliziert machen, natürlich wäre in diesem Fall eigentlich ein Loop die sinnvollere Methode. Sorry für die Verwirrung.
Zum Beispiel von @JustMe :
Ist ein LV_Delete + LV_Add besser zum aktualisieren von Daten als ein LV_Modify?
Ich habe dann immer dieses "zucken" in der GUI wenn sich alles neu aufbaut, was ich nicht schön finde.

Nur mal interessehalber, wenn ich die Listviews in verschiedene Tabs lege, reicht dann auch ein "Gui, ListView, Liste2" um die Listview im zweiten Tab ansprechen?
Merry Crisis and a happy new fear
just me
Posts: 9763
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Probleme mit Listview-Aktualisierung

16 May 2024, 05:22

Moin,

gegen das Zucken kann GuiControl, -Redraw, Liste1 helfen.
LV_Modify() allein funktioniert ja nur, wenn die Anzahl der Zeilen immer gleich bleibt. Wenn das so ist, kannst Du das selbstverständlich auch benutzen.
Dem ListView ist es egal, in welchem Tab er steht, nur das Fenster ist wichtig.

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: No registered users and 11 guests