![]() |
Einfügen in TTreeView zu langsam
Hi
ich versuche in ein TTreeView ein paar Knoten einzufügen (so ca. 10000 Knoten :stupid: ). Das ganze soll später mal den Bestand meiner Musik auflisten^^ Hier mal der Code:
Delphi-Quellcode:
Inta ist dabei eine Liste mit den Interpreten (damit ich sehe ob ich schon den Interpret hinzugefügt habe oder ob ich doch noch einen Knoten erzeugen muss) und Alb eine Liste der jeweiligen Alben.
TreeView1.Visible := False;
TreeView1.Items.Clear; Inta := TstringList.Create; setLength(Alb, 0); TreeView1.Items.Add(NIL, 'Meine Musik'); TreeView1.Images := ImageList1; for I := 1 to high(l) do // Diese Schleife braucht sehr lang if Inta.IndexOf(l[i]^.Interpret) < 0 then begin Node := TreeView1.Items.AddChild(TreeView1.Items[0], l[i]^.Interpret); Node.ImageIndex := 1; Node.SelectedIndex := 1; Node := TreeView1.Items.AddChild(Node, l[i]^.Album); Node.ImageIndex := 2; Node.SelectedIndex := 2; Node := TreeView1.Items.AddChild(Node, l[i]^.Titel); Node.ImageIndex := 3; Node.SelectedIndex := 3; Inta.Add(l[i]^.Interpret); SetLength(Alb, length(Alb)+1); ka[high(Alb)] := TStringList.Create; ka[high(Alb)].Add(l[i]^.Album); end else if Alb[Inta.IndexOf(l[i]^.Interpret)].IndexOf(l[i]^.Album) < 0 then begin Node := TreeView1.Items.AddChild(TreeView1.Items[0].Item[Inta.IndexOf(l[i]^.Interpret)], l[i]^.Album); Node.ImageIndex := 2; Node.SelectedIndex := 2; Node := TreeView1.Items.AddChild(Node, l[i]^.Titel); Node.ImageIndex := 3; Node.SelectedIndex := 3; Alb[Inta.IndexOf(l[i]^.Interpret)].Add(l[i]^.Album); end else begin Node := TreeView1.Items.AddChild(TreeView1.Items[0]. Item[Inta.IndexOf(l[i]^.Interpret)]. Item[Alb[Inta.IndexOf(l[i]^.Interpret)].indexOf(l[i]^.Album)], l[i]^.Titel); Node.ImageIndex := 3; Node.SelectedIndex := 3; end; TreeView1.Items[0].AlphaSort(True); if (TreeView1.Items.Count <= (TreeView1.Height/16.25)) and not CheckBox1.Checked then TreeView1.Items[0].Expand(True) else TreeView1.Items[0].Expand(False); Inta.Free; if length(Alb) > 0 then for I := 0 to high(Alb) do Alb[i].Free; TreeView1.Visible := True; Mein Problem: bei ca 5000 Datensätzen (High(l) = 5000) dauert die Schleife in der die Knoten hinzugefügt werden ca 13 Sekunden... Ich hab auch schon versucht Alb am Anfang auf length = 3000 zu setzen damit ich nicht immer erneut die Länge um 1 erhöhen muss, hat aber exakt gleich lang gedauert -.- Hat jemand ne Idee welcher Befehl in der Schleife so lange dauert und wie ich das umgehen kann? Danke für jede Antwort. mfg.Dominik :coder: |
Re: Einfügen in TTreeView zu langsam
Die Treeview ist bekannt für ihre Trägheit. Das haben schon viele erkannt und daher bessere Alternativen programmiert. Such mal nach TVirtualTreeView.
|
Re: Einfügen in TTreeView zu langsam
Grundsätzlich: Wenn du bei Oberflächenelementen mit mehren Listeneinträgen arbeitest, dann nutze BeginUpdate und EndUpdate um das neuzeichnen nach dem Hinzufügen eines Eintrages zu unterbinden innerhalb der Schleife.
Delphi-Quellcode:
treeview.items.clear;
treeview.items.BeginUpdate; try // deine schleife hier... finally treeview.items.EndUpdate; end; |
Re: Einfügen in TTreeView zu langsam
jop, danke, ich habs jetzt mit TVirtualTreeView gemacht und klappt superschnell... ich kann sogar das onChange-Event von meinem Edit nehmen :mrgreen:
war zwar nen bisschen kompliziert, jetzt gehts aber^^ und das mit BeginUpdate... hat nÜx gebracht... wahrscheinlich weil ich eh TreeView1.Visible auf False gesetzt hatte nochmal danke an euch 2 mfg.Dominik |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:39 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz