Listview flackert beim einlesen von Daten

  • Wie schon in der Überschrift beschrieben habe ich ein Problem mit dem einlesen von Kunden in ein Listview.
    Problem ist das das Listview anfängt zu flackern während die Daten in das Listview geschrieben werden.
    Außerdem dauert es relativ lange bis alle Einträge angezeigt werden.


    Habe mit $GUI_HIDE und $GUI_SHOW es hinbekommen, dass die Tabelle sehr viel schneller angezeigt wird und das flackern sehr verringert wird.


    Ich lese ca 1000 Kundendaten in das erste Listview welches wohl das flackern hervorruft.
    Habe schon versucht mit _GUICtrlListView_BeginUpdate() zu arbeiten aber das hatte irgendwie garkeinen effekt.


    Ich kann hier natürlich keine Kundendatenposten deshalb hoffe ich das dieser Code-Schnipsel genügt um mir zu helfen :)


    Dieser Beitrag wurde 9521 mal editiert, zum letzten Mal von Blubkuh: Morgen, 02:28.


    If Not $Elephant Then $Irelephant = True

    Einmal editiert, zuletzt von Blubkuh ()

  • Habe schon versucht mit _GUICtrlListView_BeginUpdate() zu arbeiten aber das hatte irgendwie garkeinen effekt.


    _GUICtrlListView_BeginUpdate und _GUICtrlListView_EndUpdate mal ausprobieren ;)


    Dann bräuchtest du dein HIDE/SHOW auch net mehr...


    Wie gesagt: Hatte 0 Effekt Listview hat trotzdem angezeigt wie daten in die Tabelle geschrieben wurden und auch geflackert.
    Kann es gerne nochmals probieren aber ich glaub nicht, dass ich da was falsche gemacht habe

    Dieser Beitrag wurde 9521 mal editiert, zum letzten Mal von Blubkuh: Morgen, 02:28.


    If Not $Elephant Then $Irelephant = True

  • Habs grade nochmals mit dem BeginnUpdate probiert und das sieht im Prinzip gleich aus wie als wenn ich die ListView hide. Flackern bleibt leider vorhanden. Ich schätze das das einfach an der Großen Menge an Listvieweinträgen liegt und das das nicht schöner gemacht werden kann.

    Dieser Beitrag wurde 9521 mal editiert, zum letzten Mal von Blubkuh: Morgen, 02:28.


    If Not $Elephant Then $Irelephant = True

  • Hi,


    ich habe es jetzt nicht getestet. Aber mein erster Versuch wäre, die Differenz aus dem ListViewInhalt und dem neuen Array zu ermitteln und anschließend nur diese Differenz hinzuzufügen oder aus der Liste zu entfernen. Am einfachsten ist es, wenn du das mit zwei Array's machst. Geht am schnellsten.


    Array1 = aktuelle Datensätze im Listview
    Array2 = wird durch _SQLite_GetTable2D gefüllt

  • Hi,


    ich habe es jetzt nicht getestet. Aber mein erster Versuch wäre, die Differenz aus dem ListViewInhalt und dem neuen Array zu ermitteln und anschließend nur diese Differenz hinzuzufügen oder aus der Liste zu entfernen. Am einfachsten ist es, wenn du das mit zwei Array's machst. Geht am schnellsten.


    Array1 = aktuelle Datensätze im Listview
    Array2 = wird durch _SQLite_GetTable2D gefüllt



    Hört sich nach einer guten Idee an.
    Aktuelle Datensätze einlesen ist kein Problem. das 2. Array mit aktuellen Daten auffüllen ist auch easy.
    Aber dann gehts los. Jeden Eintrag vergleichen und das wenn die Einträge evtl nicht in der gleichen Reihenfolge sind. Dann herausfinden welche Daten komplett neu sind diese zum Listview hinzufügen und die Daten die Sich geändert haben(z.B. nur die Telefonnummer eines Kunden) updaten.


    Hört sich nach verdammt viel Arbeit an wo ich noch nicht wirklich nen Plan habe ob sich das wirklich umzusetzen lohnt.



    Habe btw mal nen Video von dem Flackern gemacht. Im ersten Durchlauf benutze ich _GUICtrlListView_BeginUpdate() und danach sieht man wie ich das durch @GUI_hide austausche und lasse dann nochmal nen durchlauf machen.
    https://www.youtube.com/watch?v=EpGcYgujUBE&feature=youtu.be

    Dieser Beitrag wurde 9521 mal editiert, zum letzten Mal von Blubkuh: Morgen, 02:28.


    If Not $Elephant Then $Irelephant = True

  • schon den ex-style: $LVS_EX_DOUBLEBUFFER ausprobiert??


    Danke den kannte ich nicht. hat aber leider garnichts geändert :)

    Dieser Beitrag wurde 9521 mal editiert, zum letzten Mal von Blubkuh: Morgen, 02:28.


    If Not $Elephant Then $Irelephant = True

  • Moin!


    Ich hab mir dein Skript zwar jetzt nicht so genau angesehen, weil ich es in Ermangelung an Datenbanken auch nicht testen kann,
    aber ich habe mal ein kurzes Beispiel zu _GUICtrlListView_BeginUpdate und _GUICtrlListView_EndUpdate.


    Da Flackert zwar nichts, aber die Unterschiede sind emorm. Am Schluss hab ich noch ein Beispiel zu _GUICtrlListView_AddArray angefügt, was nochmal nen Tacken schneller ist, allerdings nicht so flexibel. Du kannst die Funktion aber nach deinen Vorlieben anpassen, was ich selbst schon getan habe.


    Skript


    Sanfte Grüße :D



  • Hey super vielen Dank für die Beispiele. das scheint ja wirklich gut zu klappen in dem Fall.
    Ich war auch schon angefangen etwas in der Art zu scripten was deinem 3. Beispiel entspricht.


    Leider bin ich da jetzt auf ein Problem gestoßen was für mich keinen Sinn ergibt.
    Im ArrayDisplay() ist noch alles super ABER dann:
    _GUICtrlListView_AddArray($hListView, $aItem) liest die ersten 3 Zeilen richtig ein und dann bei der 4. Zeile ist die erste Spalte noch richtig(Kundennummer) aber dann folgt der Name eines total falschen Kunden der an die Stelle garnicht hingehört und dann werden plötzlich nurnoch die Kundennummern übernommen(1. Spalte) und die anderen 5 Spalten bleiben leer.
    Ganz am Ende ist dann plötzlich bei den letzten ~5 Kunden wieder alles in Ordnung :?:


    Soo... Wie könnt Ihr mir nun helfen ohne dass ich euch die Datenbank mit den ganzen Kundendaten posten muss? ^^



    BTW: In deinem Beispiel kannst du vor und nach _GUICtrlListView_AddArray() die _GUICtrlListView_BeginUpdate($hListView) bzw _GUICtrlListView_EndUpdate($hListView) wegmachen, weil die Funktion intern das Beginnupdate aufruft und beendet :)

    Dieser Beitrag wurde 9521 mal editiert, zum letzten Mal von Blubkuh: Morgen, 02:28.


    If Not $Elephant Then $Irelephant = True

  • Leider bin ich da jetzt auf ein Problem gestoßen was für mich keinen Sinn ergibt.
    Im ArrayDisplay() ist noch alles super ABER dann:


    ArrayDisplay verursacht hin und wieder echt seltsame Effekte (Hab mir den Code allerdings nie näher angesehn, um das zu ergründen). Die benutze ich wirklich nur zum debuggen.
    Lass die Funktion einfach mal weg und schau, was passiert...



    BTW: In deinem Beispiel kannst du vor und nach _GUICtrlListView_AddArray() die _GUICtrlListView_BeginUpdate($hListView) bzw _GUICtrlListView_EndUpdate($hListView) wegmachen, weil die Funktion intern das Beginnupdate aufruft und beendet :)


    Vielen Dank, hatte ich übersehen... :thumbup:


  • ArrayDisplay verursacht hin und wieder echt seltsame Effekte (Hab mir den Code allerdings nie näher angesehn, um das zu ergründen). Die benutze ich wirklich nur zum debuggen.
    Lass die Funktion einfach mal weg und schau, was passiert...



    ArrayDisplay hatte ich auch nur zum debuggen genommen weil in meinem Listview halt leere Einträge vorhanden sind. Ich mach gleich mal nen kurzes Video um das mal zu zeigen.



    Edit: Video des Problems ist hier zu sehen: https://www.youtube.com/watch?v=1UwvgII9Xus&feature=youtu.be


    Wenn das Video ned geht: Paar minuten warten damit Youtube das eben rendern kann. Dann sollte auch bessere Quali verfügbar sein

    Dieser Beitrag wurde 9521 mal editiert, zum letzten Mal von Blubkuh: Morgen, 02:28.


    If Not $Elephant Then $Irelephant = True

    Einmal editiert, zuletzt von Blubkuh ()

  • Vielen Dank schonmal im Voraus an Friesel dank seiner modifizierten Version der Funktion von _GUICtrlListView_AddArray() konnte ich nun etwas genauer beobachten wo die Funktion ins Stocken gerät.


    Hier erstmal die modifizierte Version: (Die Änderung gibt nach jedem Item was ins Listview geschrieben wird ne msg box und pausiert so die Funktion, sodass man sehen kan welche Daten geschrieben wurden und man überprüfen kann ob diese richtig sind)



    Un nun kommen wir zu dem Punkt an dem die Funktion scheitert:
    Mein Listview wurde wie folgt erstellt:


    Das Problem ist, dass die Daten einer nach dem anderen in das Listview eingetragen werden und zwar immer in der untersten Zeile des Listviews. Da ich aber $LVS_SORTASCENDING benutze und die Kundennummern(1. Spalte) nicht von niedrig -> hoch eingelesen werden sondern durcheinander wird automatisch eine niedrige Kundennummer im Listview nach oben geschoben, die Daten werden aber in der untersten Zeile des Listviews eingetragen(soll heißen die alten Daten in der Zeile werden überschrieben)


    nach dem entfernen von $LVS_SORTASCENDING funktioniert die Funktion wunderbar. Ich bin mir nicht sicher ob man das als Bug werten sollte. Es sollte aber auf jedenfall in die Hilfe der _GUICtrlListView_AddArray() Funktion hinzugefügt werden



    EDIT:
    Mit dieser Funktion tritt übrigends kein Flackern des Listviews mehr auf. Vielen Dank

    Dieser Beitrag wurde 9521 mal editiert, zum letzten Mal von Blubkuh: Morgen, 02:28.


    If Not $Elephant Then $Irelephant = True

    Einmal editiert, zuletzt von Blubkuh ()