Seite 1 von 3
ListViewGadget-Flimmern
Verfasst: 15.01.2015 18:20
von 7x7
Hallo Leute,
wie kann ich verhindern, dass das ListViewGadget() so flimmert? Das re-Paint des Gadget's wäre ja gar nicht notwendig, weil ja immer nur auf der gleichen Stelle die Ausgabe erfolgt.
Code: Alles auswählen
If OpenWindow(0, 0, 0, 470, 340, "ListViewFlimmern", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ListViewGadget(0, 10, 10, 450, 320)
For a = 1 To 10
AddGadgetItem (0, -1, "irgendwas steht hier zur Demo")
Next
Repeat
SetGadgetItemText(0, 9, "Jetzt flimmerts aber mächtig!")
Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Re: ListViewGadget-Flimmern
Verfasst: 15.01.2015 18:29
von Bisonte
Das flimmern ist logisch. Du erzeugst mit dem SetGadgetText ein Event. Daher steht die schleife nie still....
Wenn du in "periodischen" Abständen das Gadget aktualisieren willst, nutze dafür lieber einen Timer.
z.B.
Code: Alles auswählen
If OpenWindow(0, 0, 0, 470, 340, "ListViewFlimmern", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ListViewGadget(0, 10, 10, 450, 320)
For a = 1 To 10
AddGadgetItem (0, -1, "irgendwas steht hier zur Demo")
Next
AddWindowTimer(0, 123, 500)
Repeat
Event = WaitWindowEvent()
If Event = #PB_Event_Timer
If EventTimer() = 123
SetGadgetItemText(0, 9, "Jetzt flimmerts nicht mehr so dolle!")
EndIf
EndIf
Until Event = #PB_Event_CloseWindow
EndIf
Re: ListViewGadget-Flimmern
Verfasst: 15.01.2015 19:21
von matbal
@Bisonte
Ganz schlüssig ist deine Begründung nicht. Es wird ja eigentlich nur eine Zeile neu geschrieben.
Macht man das gleiche mit dem ListIconGadget, so flimmert es bei mir nicht.
Ich habe nur einen Zähler hinzugefügt, damit man sieht, daß der Text ständig neu gesetzt wird.
Code: Alles auswählen
If OpenWindow(0, 0, 0, 470, 340, "ListViewFlimmern", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ListIconGadget(0, 10, 10, 450, 320, "Info", 400)
For a = 1 To 10
AddGadgetItem (0, -1, "irgendwas steht hier zur Demo")
Next
Repeat
i + 1
SetGadgetItemText(0, 9, "Jetzt flimmerts aber mächtig! " + Str(i))
Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Re: ListViewGadget-Flimmern
Verfasst: 15.01.2015 20:52
von ts-soft
Ich weiß nicht, was an der Erklärung nicht schlüssig sein soll.
Niemals Code im EventLoop ausserhalb eines Events! Das sind Windows-Grundlagen,
und SetGadgetItemText() befindet sich nicht innerhalb eines Events. Ausserdem, wie
Bisonte richtig festgestellt hat, erzeugt diese Zeile ständig ein Event.
Die Zeile ist in jeder Hinsicht fehlplaziert!
Gruß
Thomas
Re: ListViewGadget-Flimmern
Verfasst: 15.01.2015 21:26
von matbal
Daß der Eventloop ständig läuft, ist mir klar.
Mir ging es nur um das Flimmen aller Textzeilen, obwohl nur eine Zeile ständig überschrieben wird. Bei mir flimmern auch in Bisontes Code alle Zeilen, nur langsamer, da der Timer bestimmt, wie oft die Zeile geschrieben wird.
Re: ListViewGadget-Flimmern
Verfasst: 15.01.2015 21:42
von NicTheQuick
Ich schätze mal das liegt an der Implementierung von dem ListViewGadget seitens Microsoft.
Unter Ubuntu zeigt der erste Code von 7x7 übrigens nur ein leeres Fenster. Der Code mit Timer funktioniert einwandfrei und flimmert nicht.
Re: ListViewGadget-Flimmern
Verfasst: 15.01.2015 22:10
von ts-soft
matbal hat geschrieben:Macht man das gleiche mit dem ListIconGadget, so flimmert es bei mir nicht.
Da gibts auch nen "Bug" von MS. Fred nutzt dabei wohl doppelbuffering o. ä., damit die Gridlines
richtig sind.
Vielleicht kann man das auch anders implementieren, damit es nicht so flimmert, aber unabhängig davon,
sollte die Zeile anders plaziert werden

Re: ListViewGadget-Flimmern
Verfasst: 15.01.2015 22:22
von Vera
Hi,
ich kann Nic's Erfahrung für Suse bestätigen.
Irgendwie hab' ich den Eindruck, das unter Linux das Abarbeiten von Befehlen anders gehandhabt wird, als im Code beschrieben. Erst werden die Prozesse im Hintergrund abgearbeitet (nach eigenen Vorgaben) und danach erst als Gesamt-Ergebnis (das Darstellen) präsentiert. Wenn also im Millisekundentackt (oder wie kurz?) was zur Darstellung dazukommt, dann werden die erstmal 'bis zum Ende' prozessiert, während aber schonmal,
freundlicher weise, das blanke Fenster angezeigt wird.

Re: ListViewGadget-Flimmern
Verfasst: 16.01.2015 10:22
von Georg
Hallo,
nur Windows:
Code: Alles auswählen
If OpenWindow(0, 0, 0, 470, 340, "ListViewFlimmern", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ListViewGadget(0, 10, 10, 450, 320)
For a = 1 To 10
AddGadgetItem (0, -1, "irgendwas steht hier zur Demo")
Next
AddWindowTimer(0, 123, 500)
Global counter = 0
Repeat
Event = WaitWindowEvent()
If Event = #PB_Event_Timer
If EventTimer() = 123
SendMessage_(GadgetID(0),#WM_SETREDRAW,0, 0)
SetGadgetItemText(0, 9, "Jetzt flimmerts nicht mehr so dolle!"+" "+ Str(counter))
SendMessage_(GadgetID(0),#WM_SETREDRAW,1, 0)
counter + 1
EndIf
EndIf
Until Event = #PB_Event_CloseWindow
EndIf
__________________________________________________
Code-Tags hinzugefügt
16.01.2015
RSBasic
Re: ListViewGadget-Flimmern
Verfasst: 16.01.2015 14:19
von 7x7
Danke an alle für eure Antworten.
Habe das ListViewGadget() durch ListIconGadget() ersetzt. Läuft problemlos.
Ob das ListViewGadget()-Problem nun ein MS- oder PB-Problem ist, sei mal dahingestellt. Ein Bug im eigentlichen Sinn ist es nicht, aber es hinterlässt auf jeden Fall keinen guten Eindruck. Solche Unzulänglichkeiten lassen mich regelmässig frustriert in die Tischkante beissen.
Ich bin ja noch relativ froh, dass ich nicht unter Linux mit PB programmiere, nachdem @Nic -bestätigt von @Vera- noch ganz andere Probleme mit diesem Gadget haben.
In der Zwischenzeit ist schon wieder eine neue Fragwürdigkeit aufgetaucht. Ich werde noch wahnsinnig!
Guckst du hier
ts-soft hat geschrieben:Niemals Code im EventLoop ausserhalb eines Events....
Grundsätzlich gebe ich dir natürlich Recht. Bei solchen Demo-Codes, die nur den Zweck haben etwas zu zeigen, sollte man einfach darüber hinwegsehen.