AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Einfügen in TTreeView zu langsam

Ein Thema von dominikkv · begonnen am 13. Apr 2007 · letzter Beitrag vom 13. Apr 2007
Antwort Antwort
dominikkv

Registriert seit: 30. Sep 2006
Ort: Gundelfingen
1.109 Beiträge
 
Delphi 2007 Professional
 
#1

Einfügen in TTreeView zu langsam

  Alt 13. Apr 2007, 09:55
Hi
ich versuche in ein TTreeView ein paar Knoten einzufügen (so ca. 10000 Knoten ).
Das ganze soll später mal den Bestand meiner Musik auflisten^^
Hier mal der Code:
Delphi-Quellcode:
    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;
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.

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
Dominik
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#2

Re: Einfügen in TTreeView zu langsam

  Alt 13. Apr 2007, 09:59
Die Treeview ist bekannt für ihre Trägheit. Das haben schon viele erkannt und daher bessere Alternativen programmiert. Such mal nach TVirtualTreeView.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#3

Re: Einfügen in TTreeView zu langsam

  Alt 13. Apr 2007, 10:01
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;
  Mit Zitat antworten Zitat
dominikkv

Registriert seit: 30. Sep 2006
Ort: Gundelfingen
1.109 Beiträge
 
Delphi 2007 Professional
 
#4

Re: Einfügen in TTreeView zu langsam

  Alt 13. Apr 2007, 17:49
jop, danke, ich habs jetzt mit TVirtualTreeView gemacht und klappt superschnell... ich kann sogar das onChange-Event von meinem Edit nehmen
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
Dominik
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:25 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz