ListView flackert



  • Ich aktualisiere pro Klick auf einen Button ein ListView und andere darin Felder (ich lösche nicht und füge neu hinzu, sondern ändere die Felder).

    Wenn ich "schnell" auf dem Buton draufrum klickere, fängt das ListView an leicht zu flackern. Ich habe aber BeginUpdate und EndUpdate benutzt. Gibt es da noch einen Trick oder muss man damit leben? 😕



  • Schlecht zu sagen, ohne zu wissen, was genau du im ButtonKlick machst.



  • ich vermute mal das du begin und endupdate pro korrektur machst, versuchs doch einfach mit beginupdate gleich zu begin von OnClick und am ende der funktion erst das endupdate. falls ich falsch liege tut's mir leid ^^



  • Ich klicke auf den Button der etwas hochzählt, der macht pro Klick paar Berechnungen und geht dann in meine UpdateAll() Funktion und geht da das ListView durch und pro Durchlauf in der for() holt er sich die berechneten Daten und trägt diese dann ein.

    Wenn man schnell auf den Button klickt, muss sich auch das ListView schnell aktualisieren und die Frage ist nun wie verhindert man das unschöne "flackern" dieses.

    void __fastcall TMyInput::UpdateAll()
    {
        ListView1->Items->BeginUpdate();
    	for (int i=0;i<10;i++)
    	{
    // fülle text mit Daten und trag in ListView1 ein und das für mehrere Spalten
        	ListView1->Items->Item[i]->SubItems->Strings[0] = text;
            ListView1->Items->Item[i]->SubItems->Strings[1] = text;
            ListView1->Items->Item[i]->SubItems->Strings[2] = text;
    	}
        ListView1->Items->EndUpdate();
    }
    


  • nunja ich hatte ein ähnliches problem, du könntest es zumindest einschreänken, indem du vorher überprüfst, ob der inhalt mit dem neuen wert übereinstimmt, ist dem so dann ignoriere es ist dem nicht so dann ersetze es, weil wenn du alle werte neu schreibst (auch wenns der gleiche wert/inhalt ist) flackert es dennoch manchmal, weil er annimmt das estwas sich verändert hat und er muss die "zelle" neu zeichnen, ansonsten gibts da noch ne funktion double buffered oder so ähnlich glaub ich.

    void __fastcall TMyInput::UpdateAll()
    {
        ListView1->Items->BeginUpdate();
        for (int i=0;i<10;i++)
        {
    // fülle text mit Daten und trag in ListView1 ein und das für mehrere Spalten
            if (ListView1->Items->Item[i]->SubItems->Strings[0] != text) {
                  ListView1->Items->Item[i]->SubItems->Strings[0] = text;
            }
        }
        ListView1->Items->EndUpdate();
    }
    


  • DeviceList->DoubleBuffered = true;
    vielleicht hilft das ?!



  • Ich habe mal BeginUpdate() und EndUpdate() ausgeklammert und schon war das flackern weg 😮
    Muss man das jetzt verstehen?

    Das mit dem DoubledBuffered hatte leider rein nichts gebracht. Ich habe es mal allgemein gesetzt und freue mich nun das das TImage nicht mehr flackert. Danke 🙂


Anmelden zum Antworten