ListView OwnerData
-
Hi,
ich habe viele Daten die ich in einer ListView darstellen möchte. Leider ist diese etwas langsam. Ich habe in der Hilfe gelesen, dass man mit OwnerData ein virtuelles Steuerelement erstellen kann, welches um einiges schneller ist. Leider finde ich absolut nichts darüber wie ich dieses OwnerData zu benutzen habe. Kann mir jemand erklären wie das funktioniert. Oder hat vllt. jemand nen kleinen Code Schnipsel dazu?Bin für jede Hilfe dankbar!
-
ps: Ich benutze den Borland c++ Builder 2006.
-
Schau mal beí den mitgelieferten Beispielen unter Virtual ListView.
-
Hi,
das Beispiel finde ich leider nicht. Bin ich hier richtig? C:\Program Files\Borland\BDS\4.0\Demos\CPP\AppsDort sind folgende Beispiele:
Canvas Colordlg Cursors FindRep Header ImageView Minicomp Multipag OwnerList Printing ProcView ScrollBar Switch SysSound Tab TrayIcon TwoForms WPM
-
Schau mal ein Verzeichnis höher, also in
C:\Program Files\Borland\BDS\4.0\Demos\CPP\Gibt es dort dann "VirtualListView"?
Anscheinend haben sie (gegenüber früheren Versionen z.B. zum C++ Builder 6) einige Beispiel wieder rausgenommen.
-
Die Hilfe-Dateien und Beispielprojekte des BCB6 können hier heruntergeladen werden: http://cc.embarcadero.com/item/24339
-
Hi,
also bei mir im Ordner gibt es keine Virtual ListView.
Ich hab mir das verlinkte zip-File mal geladen, allerdings finde ich da keine Beispielprogramme. Neben der Hilfe gibt es noch einige Headerfiles (allerdings alle ohne irgendeine ListView), das wars dann aber auch schon.
-
OK, hier in der Firma war noch eine ältere Version mit dem Beispiel dabei. Mal schauen wie weit ich komme...
Danke erstmal für die Hilfe!
-
Hi,
ich verstehe die Funktionsweise des Programms noch nicht.Laut Debugging ist der Ablauf folgender:
FormCreate
VirtualListDataHint
VirtualListData
VirtualListCustomDrawItem
usw.Laut Hilfe tritt VirtualListDataHint ein, wenn sich der Inhalt der Listenansicht ändert. Wo ist das hier der Fall?
Ich verstehe nicht wo der ganze Vorgang gestartet wird. Das anschließend VirtualListData und VirtualListCustomDrawItem ausgelöst werden kann ich mir anhand der Hilfe erklären.Noch eine Info zu meiner Intention: Ich möchte Daten die ich über eine Schnittstelle einlese in der ListView darstellen lassen. Diese Daten werden in einem RingBuffer zwischengespeichert um dann zyklisch in die ListView geschrieben zu werden.
Ich wäre für eine kurze Erklärung sehr dankbar!
-
Dies passiert einfach im Hintergrund, d.h. sobald die ListView erstmalig dargestellt wird (bzw. später beim Scrollen) wird einfach für alle gerade sichtbaren ListItems das Ereignis OnData (und die weiteren) aufgerufen.
Der Vorteil bei einer VirtualListView ist halt, daß nicht von vornherein alle Daten gefüllt werden müssen, sondern man nur die Eigenschaft 'Count' entsprechend setzt und danach dann nur die Daten setzt, welche auch angezeigt werden.
-
So, ich habe es jetzt hinbekommen das etwas angezeigt wird. Leider ist es so, das nur beim scrollen neugezeichnet wird (bzw. wenn ein Repaint in OnData geschrieben wird - beim Repaint ist es allerdings das Problem, dass es den Hauptthread belegt und das Programm quasi abschießt). Ich möchte die Daten aber zyklisch darstellen (so alle 100ms). Dazu müsste ich die Darstellung wohl in einen eigenen Thread auslagern. Ist das möglich? Oder gibt es eine andere Möglichkeit dazu die mir noch fremd ist?
-
Wenn du in OnData() ein Repaint() aufrufst, dann ist klar, daß deine Anwendung steht (da der Repaint() ja wieder OnData() aufruft, d.h. Endlosrekursion)!
Wenn du aus einem Thread heraus die Aktualisierung anstoßen willst, dann mußt du die Synchronize-Methode benutzen:
{ Synchronize(UpdateListView); } void MyThread::UpdateListView() { listView->Invalidate(); // besser als Repaint }
Die Variable 'listView' musst du dann dem Thread noch bekannt machen (z.B. in dessen Konstruktor).
-
Hi,
danke für die Antworten!
Ich habe es so gelöst, das ein Timer alle 100ms mit Invalidate die ListView neuzeichnet.