ListView leeren und neu füllen dauert zu lang



  • Guten Morgen,

    kann mir bitte jemand sagen, wie man ein Listview relativ schnell updated?
    Zur Zeit hab ichs so gelöst, aber das sieht manchmal nicht schön aus, vor allem auf langsamen Rechner.
    Und zwar "rollt" sich das LIstView sozusagen von unten her auf,d.h. die Einträge werden entfernt, aber das ganze so langsam, dass es einfach dämlich aussieht...

    Gruss, Sven

    ListView1->Items->Clear();
      for(unsigned int i=0;i<actualList.Item.size();i++)
      {
        lItem=ListView1->Items->Add();
        lItem->Caption=actualList.Item[i].Caption;
        AnsiString SubItem;
        SubItem=actualList.Item[i].Item1+" "+actualList.Item[i].Item2+" "+actualList.Item[i].Item3+" "+actualList.Item[i].EClass+" "+actualList.Item[i].ECaption+" "+actualList.Item[i].Color+" "+actualList.Item[i].Text+" Value="+actualList.Item[i].Value+" "+actualList.Item[i].Check+" "+actualList.Item[i].Status+" "+actualList.Item[i].Condition+" "+actualList.Item[i].xCo+" "+actualList.Item[i].yCo;
        lItem->SubItems->Add(SubItem);
        lItem->SubItems->Add(actualList.Item[i].Index);
        lItem->ImageIndex=actualList.Item[i].ImageIndex;
      }
    


  • Versuch mal:

    ListView1->Items->BeginUpdate();
    // hier Dein Code...
    ListView1->Items->EndUpdate()
    


  • Die Aktualisierung verhindern mittels BeginUpdate, EndUpdate . Noch schneller geht der Aufbau, wenn du das ListView vor dem Fuellen versteckst (Visible = false) und erst danach wieder anzeigst.

    Ausserdem:

    - niemals in Schleifen Funktion aufrufen (hier: Size()) deren Rückgabewert
    sich nicht ändert
    - niemals in Schleifen Variablen definieren, denn da wird erst der Konstruktor
    und hinterher (am Ende der Schleife) der Destruktor aufgerufen (kostet alles
    Zeit!)



  • Hallo,

    Such mal nach : "VirtualListView", damit geht's richtig schnell 🙂 .

    Bis dann denn,
    🙂
    Nash


Anmelden zum Antworten