| Autor |
Beitrag |
Experience1986
      
Beiträge: 192
Win XP Pro SP2
Delphi 7
|
Verfasst: Fr 03.06.05 17:18
Hi,
ich versuche mich momentan an einem Musik Player, basierend auf der Bassplayer Bibliothek von UN4Seen. Als Playlist dient mir da eine TLIstView. Diese Komponente wird aber sehr Langsam, sei es bei hinzufügen neuer Daten oder beim auswählen einer Zeile, wenn die Einträge, je nach Rechner Leistung, so etwa die Anzahl 1000 überschreitet.
Bei Winamp kann man aber sehen, das nach 1-2 Sekunden sogar über 5000 Zeilen geladen werden.
Wie kann Winamp das realisieren?
Auch wenn ich die Eigenschaft ViewStyle auf vsList und ListView.Items.BeginUpdate bzw. ListView.Items.EndUpdate bem hinzufügen neuer Daten verwende, komme ich noch lange nicht auf die Performance wie Winamp sie im Bezug auf die TListView an den Tag legt.
Über eine schnelle Antwort würd ich mich sehr freuen. Moderiert von Tino: Topic aus CLX / Delphi Language (Object-Pascal) verschoben am Di 07.06.2005 um 09:25
|
|
sahib
      
Beiträge: 117
Win 2000 SP4+
Delphi 5 Prof.
|
Verfasst: Sa 04.06.05 19:13
Hi.
Schaue Dir einmal in der Hilfe unter folgenden Stichworten nach: OwnerData und OnData. Das sollte helfen. Du verwaltest Deine Daten selber.
Christian
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Sa 04.06.05 19:47
Außerdem empfehle ich einen Blick auf die Komponente "TVirtualListView".
Die VCL ist in der Hinsicht lahm. 
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Motzi
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: So 05.06.05 11:47
BenBE hat folgendes geschrieben: | Außerdem empfehle ich einen Blick auf die Komponente "TVirtualListView".
Die VCL ist in der Hinsicht lahm.  |
Nur dass sie nicht "TVirtualListView" heißt, sondern "TVirutalTreevie"..
Und falls du mal eine Demonstration in Sachen Geschwindigkeitsvergleich zwischen TListview und TVirtualTreeview willst empfehle ich dir mein Pointer-Tutorial auf www.manuel-poeter.de da ist ein Demo-Projekt in 2-facher Ausführung dabei, einmal mit Listview und einem mit einem VirtualStringTree. Füg bei beiden Versionen mal 10.000 Einträge hinzu und staune!!  (für die die sich nicht erst den VirtualTreeview installieren wollen sind die Demos auch als komplette Exe dabei)
Gruß, Motzi
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|
Experience1986 
      
Beiträge: 192
Win XP Pro SP2
Delphi 7
|
Verfasst: Mo 06.06.05 16:32
Vielen Dank für die antworten...
Wo kann man denn noch etwas über "Non VCL TLIstView" erfahren?
gibt es da seiten die sich speziell mit non VCL beschäftigen...?
|
|
Motzi
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: Mo 06.06.05 16:50
www.luckie-online.de - die erste Anlaufstelle für nonVCL. Aber wieso willst du nonVCL arbeiten? Erstens ist nonVCL von haus aus schon wesentlich komplizierter als die VCL und VCL und nonVCL zu mischen kann auch leicht schiefgehen! Warum willst du nicht den VirtualTreeview verwenden?
Gruß, Motzi
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|
Neidhard von Reuental
      
Beiträge: 268
XP
BDS 2006 Prof
|
Verfasst: Mo 06.06.05 17:04
du kannst auch weiter tlistview benutzen. langsam wird es nur weil bei jeder änderung die anzeige aktualisiert wird
um das zu umgehn benutz beginupdate und endupdate
so solte es gehn:
Delphi-Quelltext 1: 2: 3:
| Listview.Items.BeginUpdate; Listview.Items.EndUpdate; |
| Delphi Hilfe hat folgendes geschrieben: | Die Methode BeginUpdate verhindert die Aktualisierung des TListItem-Objekts, bis die Methode EndUpdate aufgerufen wird.
Delphi-Syntax:
procedure BeginUpdate;
C++ Syntax:
void __fastcall BeginUpdate(void);
Beschreibung
Rufen Sie BeginUpdate auf, bevor Sie mehrere Änderungen an Listeneinträgen durchführen. Aktualisieren Sie die Ansicht nach den Bearbeitungen mit EndUpdate. Mit BeginUpdate und EndUpdate können Sie verhindern, daß die Bildschirmanzeige aktualisiert wird, wenn Einträge angehängt, gelöscht und eingefügt werden. |
Moderiert von Tino: Code- durch Delphi-Tags ersetzt.
|
|
Motzi
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: Mo 06.06.05 17:31
Auch mit verwendung von BeginUpdate/EndUpdate ist die VCL-Listview immer noch unglaublich langsam!! Ich verwend bei dem Demo in meinem Pointer-Tutorial auch BeginUpdate/EndUpdate, aber bei der VCL-Listview dauert das Hinzufügen von 10.000 Einträgen ~11sec, beim VirtualTreeview hingegen < 1sec..!!
Gruß, Motzi
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Mo 06.06.05 17:48
Wenn ich die TListView im virtual Mode benutze, dauert das Hinzufügen von 10.000.000 Einträgen ungefähr 0,01 ms (auf einem Celeron) 
|
|
OneOfTen
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 06.06.05 21:47
hast du gelesen, was Experience geschrieben hat?
wenn nicht, vielleicht das hier:
Experience1986 hat folgendes geschrieben: | Hi,
Auch wenn ich die Eigenschaft ViewStyle auf vsList und ListView.Items.BeginUpdate bzw. ListView.Items.EndUpdate bem hinzufügen neuer Daten verwende, komme ich noch lange nicht auf die Performance wie Winamp sie im Bezug auf die TListView an den Tag legt. |
|
|
Experience1986 
      
Beiträge: 192
Win XP Pro SP2
Delphi 7
|
Verfasst: Di 07.06.05 07:13
Und wie kann ich nun den "virtuellen" Mode einer TListView verwenden?
Erstelle ich einfach die Komponente zur Laufzeit oder muss ich diese von Windows ableiten?
Wenn ja, wie?
(Wie ich Komponenten zur Laufzeit erstelle, weiß ich natürlich.)
|
|
sahib
      
Beiträge: 117
Win 2000 SP4+
Delphi 5 Prof.
|
Verfasst: Di 07.06.05 07:28
Hi.
Schau Dir bitte noch einmal das zweite posting in diesem Thread an. Da habe ich das schon mal geschrieben. Danach kamen dann solche Dinge: 'wie erlege ich einen Spatzen mit einer Kanone?'
Christian
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Di 07.06.05 07:33
@oneOfTen: Doch, habich. Aber was hat 'Begin/EndUpdate' mit dem Virtualmode zu tun?
@sahib: Dein Tip wurde nicht beachtet, weil er nicht vollständig war.  Vielleicht ist es auch zuviel verlangt, bei OnData i ndie Delphi-Hilfe zu schauen.
@Experience1986: ListBox1.Style := lbVirtual. Dann musst Du 'Count' auf die Anzahl der "Items" setzen. Nun wird für jedes darzustellende Item das (wie schon sahib erwähnte) OnData aufgerufen.
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 07.06.05 07:40
Hmm, vielleicht gehts aber auch viel einfacher, bei mir hats schon etwas mehr Speed gegeben, als ich mit myListView.AllocBy die neue Anzahl der Einträge VORHER festgelegt habe. Dann witrd der Speicher nämlich in einem Stück vorher allociert und ist beim Hinzufügen der einzelnen Einträge schon da, sodass er nicht bei jedem Eintrag einzeln für diesen geholt werden muss.
|
|
Experience1986 
      
Beiträge: 192
Win XP Pro SP2
Delphi 7
|
Verfasst: Di 07.06.05 08:11
OK...
Aber was muss ich dann beim OnData Event machen?
Werden die Einträge automatisch angezeigt, nachdem ich Count festgelegt habe oder muss ich da noch etwas beachten.
|
|
Experience1986 
      
Beiträge: 192
Win XP Pro SP2
Delphi 7
|
Verfasst: Di 07.06.05 08:15
@alzaimar: Mir fällt gerade auf, das du von einer ListBox redest. Ich benötige aber eine ListView.
Die Eigenschaft Style ist bei TListView nicht vorhanden.
================
EDIT:
OK, im zweiten Beitrag steht ich sill OwnerData auf true setzen... Abr was muss ich nun bei OwnerData machen?
Hat jemand ein Beispiel zur Hand?
|
|
sahib
      
Beiträge: 117
Win 2000 SP4+
Delphi 5 Prof.
|
Verfasst: Di 07.06.05 08:21
Nimm einen Record und eine TList, um diese Daten zu verwalten:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| type PPlayListEntry = ^TPlayListEntry; TPlayListEntry = record Titel : String; Interpret: String; Dauer : Word; end;
var PlayList: TList; OnePlayListEntry: PPlayListEntry; |
Dann einfach einen neuen Song zu Deiner Liste zufügen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| procedure AddEntry; begin New(OnePlayListEntry); with OnePlayListEntry^ do begin Titel := 'On the border'; Interpret := 'Al Stewart'; Dauer := 304; end; PlayList.Add(OnePlayListEntry); end; |
Was fehlt noch, ach ja, das Anzeigen (ListView1.OwnerData := True):
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| procedure ListView1Data(Sender: TObject; Item: TListItem); var OnePlayListEntry: PPlayListEntry; begin if (Item.Index >= 0) and (Item.Index <= PlayList.Count) then begin OnePlayListEntry := PlayList[Item.Index]; Item.Caption := OnePlayListEntry^.Titel; Item.SubItems.Add(OnePlayListEntry^.Interpret); Item.SubItems.Add(IntToStr(OnePlayListEntry^.Dauer)); end end;
procedure LadePlayList; begin ListView1.Items.Count := PlayList.Count; ListView1.Invalidate; end; |
Viel Spaß damit,
Christian
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Di 07.06.05 11:21
@Experience1986: Nicht peitschen, mein Name ist Programm
@sahib: Na, noch ne Kleinigkeit:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure AddEntry; begin New(OnePlayListEntry); with OnePlayListEntry^ do begin Titel := 'On the border'; Interpret := 'Al Stewart'; Dauer := 304; end; PlayList.Add(OnePlayListEntry); ListView1.Count := PlayList.Count; end; |
Das Gleiche noch in 'DelEntry', wenn's sowas gibt.
|
|
sahib
      
Beiträge: 117
Win 2000 SP4+
Delphi 5 Prof.
|
Verfasst: Di 07.06.05 11:40
Naja, das ist ja nun nicht meine Aufgabe gewesen. Ich sollte ja nur zeigen, wie es geht  Zum löschen muss man ja auch noch mehr machen (TList.Dispose(x), TList.Delete(x), und natürlich der Aktualisierung in der ListView).
Aber das nehmen wir mal als gegeben hin. Ich könnte natürlich auch soetwas selber schreiben und hier hereinstellen. Das wäre dann wirklich eine nette Hilfe. Eigentlich soll man den Leuten ja nur Hilfe zur Selbsthilfe geben.
Christian
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Di 07.06.05 11:48
War ja nicht gegen dich gemünzt, sonder für den Fragensteller.
|
|