Announcement

Collapse
No announcement yet.

TTreeView langsam

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • TTreeView langsam

    Hallo,<p>
    ich habe einen TreeView mit einer größeren Anzahl Elementen(teiweise vierstellig), der auch immer wieder während des Programmablaufs neu erstellt werden muss. Das Problem ist dass bei 1000 Einträgen das ganze schon 20 Sekunden dauert (neuer Rechner mit genug RAM vorhanden). Komischerweise hat MyTreeView->Items->Begin/End/Update(); keinerlei Auswirkung auf die Performance; Wenn ich die Sortierung auf stNone stelle geht's ca 40% schneller, aber die Wonne ist das auch nicht. Also mach ich wohl irgendwas falsch.
    <p>
    Hat jemand eine Idee??
    <p>
    Danke und Gruß Armin

  • #2
    Hallo Armini,

    mit VirtualtreeView von Mike Lischke

    http://www.lischke-online.de/

    ist Dir bestimmt geholfen.

    Gruß
    Gerhar

    Comment


    • #3
      Hallo Gerhard,<p>
      danke, ich werd's mir mal ansehen wenn lischke-online online ist ;-) Zumindest vom Büro aus komm ich nicht auf die Seite<p>
      Gruß<p>
      Armi

      Comment


      • #4
        Hallo,<p>
        beim Versuch den VirtualTreeView von Mike Lischke zu installieren, komme ich leider nicht weiter. Das Paket benötigt den XP-ThemeManager, den es auch auf der Seite zum downloaden gab und der sich prima installieren ließ, aber beim Erstellen vom VirtualTreeView bekomme ich nach dem erfolgreichen Compilieren die Meldung dass das Package geändert werden muss: <P>
        <pre>
        bcbsmp hinzufügen.
        bcbsmp enthält die impliziten Units Ccalendr, Cdiroutl, Cgauges, Perfgrap.
        </pre>
        Klick auf ok verspricht dass alles gut wird, aber dann kommt gleich die Meldung: <p>
        <pre>
        Package VTreeView kann nicht geladen werden. Es enthält die Unit Ccalendr, die auch im Package 'bcbsmp60' enthalten ist.
        </pre>
        Wenn ich die Änderung ablehne passiert komischerweise das gleiche. Im Netz hab' ich den Hinweis gefundenm, dass bcbsmp.bpi in der Requires-Section eingetragen sein muss - dann kommen zwar keine Fehler mehr, aber es sind auch keine Komponenten in dem angelegten Package *grummel*. Ich hab den CBuilder Version 6 Personal.<p>
        Wer kann mir einen kleinen Wink geben? .. oder eine andere TreeView Komponente die ein bißchen schneller als TTreeView ist verraten?<p>
        Danke und Gruß, Armi

        Comment


        • #5
          Hallo Armin,

          wie wäre es denn die Sache Ressourcen schonender anzugehen? <I>Braucht</I> der Benutzer tatsächlich alle 1000 Einträge auf einmal?

          Lade doch beim Start nur die oberste Ebene, die darunter liegenden Ebenen füllst Du wenn der Benutzer den Zweig öffnet. Aber wieder jeweils nur eine Ebene... So wie im Explorer eben.

          Grüße Joche

          Comment


          • #6
            Hallo Jochen,<p>
            als ich von den rund 1000 Einträgen gesprochen habe meinte ich die obersten, drunter sind noch weitere. Leider muss ich damit rechnen das der Anwender da keine ausblenden will (vorgesehen ist es ja schon mit einem Filter). Ich habe mit die hpp und obj Datei vom VirtualTreeView geschnappt und mal angefangen, aber sobald ich dem Teil angebe wie viel Speicher pro Node benötigt wird, schmiert er beim Anlegen des zweiten Nodes ab :-( . Hast Du ein kleines Beispiel in C++, das mit eine Handvoll Nodes mit Daten (einen Pointer auf eine Struktur würde reichen) aufbaut? So wie es unten steht klappts auch ... ohne Daten eben:
            <pre>
            TVirtualStringTree *VTree;
            TForm1 *Form1;
            struct VData
            {
            char *Caption;
            char *Text;
            };
            //---------------------------------------------------------------------------
            __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
            {
            TVirtualNode *Node, *NewNode;
            VTree = new TVirtualStringTree(this);
            int i;
            struct VData *VTData;
            //
            VTree->Parent = this;
            Node = VTree->AddChild(NULL);
            // VTree->NodeDataSize = sizeof(struct VData *); // <- Ohne Kommentar = Absturz
            VTree->OnGetText = TreeGetText;
            for (i=0; i<5; i++)
            {
            NewNode = VTree->AddChild(Node);
            // NewNode = VTree->AddChild(Node, NULL);// geht auch nicht
            // NewNode = VTree->AddChild(Node, VTData);// mit vorherigem VTData = malloc(sizeof(blabla))geht ebenfalls nicht
            // VTData = (VData *)VTree->GetNodeData(NewNode);
            // VTData->Caption = (char*)malloc(128);
            // VTData->Text = (char*)malloc(128);
            // strcpy(VTData->Caption, "CCC");
            // strcpy(VTData->Text, "TTT");
            }
            }
            //---------------------------------------------------------------------------
            void __fastcall TForm1::TreeGetText(TBaseVirtualTree *Sender, TVirtualNode *Node
            , int Column, TVSTTextType TextType, WideString &Text)
            {
            // struct VData *VTData;
            // VTData = (struct VData*)Sender->GetNodeData(Node);
            // Text = VTData->Caption;
            Text = "Test"; // zum Testen
            }
            </pre>
            ... und sobald ich die Zeile<p>
            // VTree->NodeDataSize = sizeof(struct VData *);
            <p>
            auskommentiere ist's aus. Dabei sollte das Teil doch nur 4 Bytes mehr reservieren und sonst nichts damit machen.<p>
            Trotzdem Danke für den Tipp, Armi

            Comment


            • #7
              Hallo Armin,

              ich hätte nicht gedacht, daß es 1000 Einträge auf der obersten Ebene sind.

              Beispiel könnte ich Dir nur für den normalen TTreeView geben (das hast Du wohl aber schon hinbekommen). TVirtualStringTree habe ich nicht, vielleicht kann Gerhard noch was dazu sagen.

              Wieso heißt das Ding denn TVirtual<I>String</I>Tree? Nicht, das man da nur Strings 'adden' kann und keine Objekte.

              Sorry

              Joche

              Comment


              • #8
                http://www.tmssoftware.com/

                hier gibt es auch noch TreeView's. Allerdings kostenpflichtig. Jedoch DemoVersionen
                Christian

                Comment


                • #9
                  Unter <a href="http://www.lmdinnovative.com/products/lmdelpack/screenshots0.php3">TElTree vom Elpack</a> gibt es auch einen TreeView.

                  Ist nach meinen Erfahrungen sehr schnell und hat - falls das auch nicht ausreichen würde - auch einen virtual Modus für die Eigenverwaltung der Einträge

                  Comment


                  • #10
                    Hallo Armin,

                    ich hatte auch ziemlich lange gebraucht, um VT zu installieren. Wenn Du mir Deine E-Mail Adresse schickst, kann ich Dir mein Package als ZIP (768Kb) schicken (Ich hoffe Mike Lischek hat nichts dagegen). Vielleicht klappt es damit. Ansonsten gibt unter
                    http://www.delphi-treff.de/content/tutorials/vstkurs/
                    einen recht guten Einsteigerkurs für VT

                    Beste Grüße

                    Gerhar

                    Comment


                    • #11
                      Hallo Gerhard,<P>
                      den Kurs hab' ich gesehen und bilde mir auch ein dass ich das halbwegs verstanden habe; aber wie oben beschrieben stimmt noch irgendwas nicht. Für das Package wäre ich dankbar ([email protected]), vielleicht hab ich Glück und Du kannst mir ein Mini-Beispiel eines Baums mit ein klitzekleinen Datensatz an jedem Node (wie oben) mitschicken??? <p>
                      Vielen Dank schonmal, auch an die anderen die hier Zeit investiert haben<p>
                      Armin

                      An Jochen: Man kann eigentlich alles an einen Node dranhängen, und wenn die Größe angegeben wird bekommt man noch die Speicherverwaltung abgenommem (wenn's klappt *gg*). Es gibt noch einen VirtualImageTree, was den auszeichnet hab ich aber nicht nachgelesen (an den StringTree können auch Icons angebracht werden

                      Comment


                      • #12
                        Hallo Armin,

                        ist unterwegs.

                        Gruß
                        Gerhar

                        Comment


                        • #13
                          Hallo, Armini!

                          Auf der Suche nach der Lösung meines Problems, das ich als Anfänger habe und das darin besteht, eine Datei von einem HTTP-Speicherplatz (als URL-Adresse vorliegend) direkt herunterzuladen und lokal zu speichern, bin ich auch deine Frage gestossen.

                          Da ich es ebenfalls mit einer sehr grossen Baumstruktur zu tun habe (ca. 60.000 "RootNodes" bei ca. 240.000 Nodes mit bis zu 100 Ebenen - durchschn. ca. 6 Ebenen tief), kann ich hier nur empfehlen, den <a href="http://www.entwickler-forum.de/webx?14@@.2cb7d797/3">Gedanken von Jochen</a> als Lösungsweg zu prüfen.

                          Die Einzeleinträge werden als Text in einer Datei gespeichert und zwei zusätzliche Datei nehmen die Knotennummern (ggf. interne Ordnungszahl), mit entsprechenden Positionszeiger aus der "NodeItem"-Datei und die Zeiger in die Pfad-Datei.

                          Die Einzeleinträge je Koten ergeben sich dem Text und dem Zeilenendezeichen.

                          Nun lassen sich jeweils die in der Anwendung sichtbaren Knoten eines "Fenster" laden (ggf. vorheriger und nachfolgender Bereich), indem eine Baumstruktur mit "sinnvollen" Ausmassen, über ein Offset-Parameter geladen wird.

                          Diese Art eignet sich wohl für einen weitestgehend statische Struktur bei grosser Knotenzahl (bei rein statischer Struktur kann auch auf das bei der Methode TreeSaveToFile erzeugte Format verwendet werden).

                          Die Umsetzung der dynamischen Erweiterung ist angedacht (Abstmmung der Index und NodeItem-Datei als Reorganisationsaufgabe, da Einträge via Indexdatei an jeder Stelle im Path- und Item-File zu finden sind).

                          Der Umfang der Daten (Zeiger- und Text-Einträge) wird entscheiden, ob eine gesamtspeicherung in eine Laufzeitvariable sinnvoll werden läßt.

                          Soweit mein Ansatzversuch, einen Mammutbaum zu "stemmen".

                          Gruß,
                          Uw

                          Comment


                          • #14
                            Hallo Uwe,<p>
                            danke für den Tipp, ich werde mich zuerst mal an den virtuellen Trees versuchen, erste kleine Erfolge habe ich. Wenn das nicht geht dann werde ich es wohl so machen müssen. Habe das auch schon mal an einem großen TListView durchgeführt, in das bis zu 70.000 Einträge reinwandern ohne dass es große Verzögerungen gibt. Statisch ist der Baum allerdings in meinem Programm nicht, eher sehr lebendig, da der Anwender flexibel und rekursiv beliebige Änderungen und Ergänzungen zu seinen Daten (die im Tree-View angezeigt werden) durchführen kann. Na ich werd dem Teil schon Beine machen ;-)<p>
                            Griß, Armi

                            Comment


                            • #15
                              Hallo,<p>
                              nochmal vielen Dank, besonders an Gerhard. Der VirtualtreeView von Mike Lischke ist klasse, alle Performanceprobleme sind gelöst :-)
                              <p>
                              Gruß, Armi

                              Comment

                              Working...
                              X