Virtual Listview: Zeichnet sich doppelt



  • Hi,

    ich verwende in einem Programm ein TListView, und zwar virtuell, also ich fuelle die Liste erst mit den Daten wenn das Ereignis OnData() auftrifft.
    Leider entsteht ein kleiner, etwas stoernder optischer Effekt. Da die Liste 10 Spalten enthaelt und die Items zudem unter Umstaenden noch farblich veraendert werden, dauert es ja trotzdem einen kleinen Moment.
    Das Bloede ist nun, dass er die Elemente im Grunde zweimal zeichnet.
    Also wenn es sehr viele Elemente sind und man dann auf die Scrollleiste klickt, so dass er eine Seite weiterscrollt, dann scrollt er ja kurz zu dieser Position, doch wenn er dort angekommen ist, flimmert das Bild nochmal kurz auf da er es dann noch einmal komplett neu zeichnet.
    Kann man das irgendwie abfangen bzw. was einstellen, oder ist das nicht moeglich?

    Hier mal der Code zum Fuellen:

    void __fastcall TKosAppForm::ListListViewData(TObject *Sender, TListItem *Item)
    { if (Item == NULL)
        return;
    
      LinkData* link = &_linkData[Item->Index];
    
      Item->Caption = link->custnum.str();
      Item->SubItems->Add(link->anrede.str());
      Item->SubItems->Add(link->title.str());
      Item->SubItems->Add(link->firstname.str());
      Item->SubItems->Add(link->lastname.str());
      Item->SubItems->Add(link->company.str());
      Item->SubItems->Add(link->location.str());
      Item->SubItems->Add(link->email.str());
      Item->SubItems->Add(link->custname.str());
      Item->SubItems->Add(double(link->netsum) == 0 ? "" : string(link->netsum).str());
      Item->Data = (void*)link->data;
    }
    

    OwnerData steht natuerlich auf true, und ansonsten passiert ja nicht mehr, wenn gescrollt wird. Die Liste ist im vsReport-Style.
    Danke schonmal!

    (Edit: Wenn ich normal mit dem Mausrad herunterscrolle, passiert das nicht. Nur beim Verwenden der Scroll-Leiste)



  • Bei einigen Ereignissen kommt es vor, dass sie pro Aktion mehrmals aufgerufen werden. Wenn du dir merkst, ob die Ereignisroutine ein zweitesmal mit den selben Daten gestartet wurde, kannst du sie überspringen.
    Brauchst halt nur einen static-Merker den du am ende der Routine lädst, und am Anfang der Routine abfragst.

    rudi


Anmelden zum Antworten