-
Forum: Programmieren allgemein
by Aviator,
6. Okt 2016
Naja. Jeden das Seine. Aber gerade dieses rumgecaste macht es doch erst unübersichtlich. Das fällt ja bei den Generics weg. Lediglich beim Instanziieren und bei der Deklaration findet man ein solches Konstrukt TObjectList<TMyDataType>. Und dafür kann man sich dann noch einen eigenen Type anlegen und schon ist alles schön übersichtlich und man muss den Datentyp auch nur noch an einer Stelle im...
-
Forum: Programmieren allgemein
by Aviator,
6. Okt 2016
Ich glaube da hast du irgendwo noch einen Denkfehler in deinem Code. An der Klasse wird es so wie die aufgebaut ist und so wie du es sagst nicht liegen.
Ich vermute eher, dass da doch mit dem Init und so noch nicht so richtig funktioniert. Aber ohne mehr SourceCode oder eine ganze Unit wird das sehr schwer dir da weiterzuhelfen.
Genaugenommen haben MemoryLeaks ja auch nix mehr mit dem...
-
Forum: Programmieren allgemein
by Aviator,
6. Okt 2016
Sorry. Hatte den Kommentar übersehen. In dem Fall wäre der SourceCode deiner erzeugten Klasse hilfreich. Ich befürchte aber das da irgendwas beim Verschieben der Objekte in eine andere Liste passiert.
-
Forum: Programmieren allgemein
by Aviator,
6. Okt 2016
Wie erzeugst du deine ObjectList?
Wenn du folgendes machst, dann brauchst du gar nichts freizugeben. Das macht die Liste dann für dich. Anders sieht es aus wenn du dem Constructor als Parameter ein False mitgibst.
procedure CreateList();
begin
MeineObjektListe := TObjectList.Create(); // Create hat einen optionalen Boolean Parameter OwnsObjects der standardmäßig true ist
end;
-
Forum: Programmieren allgemein
by Aviator,
6. Okt 2016
Ohne SourceCode ist das reine Spekulation. Wenn du den noch hast, dann stell ihn mal hier rein. Bei Gelegenheit schau ich (oder die anderen) dann mal drüber. Wird ja nichts extrem kompliziertes sein denke ich.
Die andere Frage wäre jetzt, ob das nicht egal ist. Es läuft ja jetzt. ReportMemoryLeaksOnShutdown gibt dir auch keine Meldung aus? Wenn nicht, dann ist alles gut.
Und beachte auch...
-
Forum: Programmieren allgemein
by Aviator,
6. Okt 2016
Doch klar wusste ich das. :lol:
Ohne mich jetzt größer darzustellen als ich bin, aber ich glaube es gibt keine Funktion des VST die ich nicht kenne. Ich arbeite mittlerweile schon seit einigen Jahren mit der Komponente und habe schon sehr viele Werke damit vollbracht. :-D
Und ja: Mit dem setzen des CheckTypes und des CheckStates liegst du richtig. Das musst du jetzt (wie vorher auch) jeder...
-
Forum: Programmieren allgemein
by Aviator,
6. Okt 2016
Super! :thumb:
Welche Checkboxen? :shock:
Möglicherweise wurde seit deiner letzten Version in den TreeOptions etwas verändert und du musst noch einen zusätzlichen Haken setzen. Ich gehe mal davon aus, dass du die Checkboxen vor den Nodes meinst mit denen du diese auswählen kannst.
-
Forum: Programmieren allgemein
by Aviator,
6. Okt 2016
Ich würde mal sagen ja. Bei einer anderen Anwendung bei der ich sehr viele Daten aus einer SQLite Datenbank lade habe ich den Effekt zwar nicht, aber solange alles freigegeben wird, ist da alles in Ordnung.
Zur Kontrolle kannst du in deiner DPR Datei mal die Zeile ReportMemoryLeaksOnShutdown := True; einfügen. Dann erhälst du nach dem Beenden deines Programms ein Fenster in der MemoryLeaks...
-
Forum: Programmieren allgemein
by Aviator,
6. Okt 2016
Hallo Jim,
vertauscht ist da nichts. Das ist schon alles richtig so. In der Version WITHCARDINAL habe ich in NodeData^ nur den Index des Objektes in der TObjectList. Folglich muss ich bei GetText auf das Object in der TObjectList mit dem Index NodeData^ zugreifen.
Ich hatte mit den Compilerschaltern nur zeigen wollen, dass man entweder mit einem Index ODER mit einem (Zeiger auf ein) Objekt...
-
Forum: Programmieren allgemein
by Aviator,
6. Okt 2016
Ich sehe gerade, dass ich das Projekt im Release Build hochgeladen habe. Habe die Buildkonfiguration nicht umgestellt. Daher funktionieren wohl auch die Breakpoints nicht (wie ich bereits in einem der vorherigen Beiträge erwähnt hatte).
Stell mal die Konfiguration um indem du in der Projektverwaltung die Build-Konfiguration öffnest und dann doppelt auf Debug klickst. Siehe Bild im Anhang. Wenn...
-
Forum: Programmieren allgemein
by Aviator,
6. Okt 2016
Wie DeddyH schon sagt ist TObjectList<T> in System.Generics.Collections deklariert. Wenn du aus TObjectList<TMyDataClass> eine reine TObjectList machst ist das zwar nicht direkt falsch, aber du musst dann an jeder Stelle auf das passende Objekt casten. Durch die Generics hast du eben den Vorteil, dass du direkt die Elemente vom richtigen Typ zurück bekommst.
-
Forum: Programmieren allgemein
by Aviator,
6. Okt 2016
Weiß jetzt leider nicht welche Delphi Version du hast. Könntest du bei Gelegenheit mal in deinem Profil hinterlegen.
Aber hast du auch die Build Konfiguration auf Debug und nicht auf Release stehen? Wie wird die Zeile/der Breakpoint nach dem Compilieren angezeigt? Ist er blau oder grün? Blau bedeutet, dass er angesprungen wird (sofern keine Bedingung im BreakPoint hinterlegt ist). Grün heißt,...
-
Forum: Programmieren allgemein
by Aviator,
6. Okt 2016
Ja natürlich werden dann auch die Nodes gelöscht wenn der Tree freigegeben wird, das ist ja klar. Das wäre ja sonst ein Fehler in der VirtualTreeView Komponente. :shock:
Nur es hat sich für mich so angehört, dass der Speicherverbrauch bei der Benutzung nicht sinkt wenn er Nodes löscht oder eine neue Ansicht laden will. Eventuell hat er ja auch das Event falsch implementiert oder ist mit seinen...
-
Forum: Programmieren allgemein
by Aviator,
6. Okt 2016
Hallo zusammen,
ich habe mal ein kleines Beispiel zusammengestellt das Wahlweise 100.000 oder auch 1.000.000 Objekte und dementsprechend genauso viele Nodes erzeugt. Zusätzlich wird das ganze noch minimalistisch mit GetTickCount protokolliert damit man mal eine grobe Vorstellung hat wie lange so etwas dauert.
Ich hoffe das Beispiel hilft dir/euch beim besseren Verwalten eurer Nodes und...
-
Forum: Programmieren allgemein
by Aviator,
6. Okt 2016
Löschst du denn auch die Nodes mit vst.Clear(). Ansonsten kann auch nichts freigegeben werden. Setz doch mal einen Breakpoint auf die erste Zeile in deinem OnFree Event. Hält der Debugger dort überhaupt an?
-
Forum: Programmieren allgemein
by Aviator,
6. Okt 2016
Lies dir mal Beitrag #4 durch. Dort erklärt jaenicke wieso das so ist. :stupid:
-
Forum: Programmieren allgemein
by Aviator,
5. Okt 2016
Du machst ja scheinbar jetzt folgendes:
procedure TForm1.LoadNodes();
var
NodeData: PNodeData;
Node: PVirtualNode;
begin
Node := vst.AddChild(nil);
NodeData := vst.GetNodeData(Node);
-
Forum: Programmieren allgemein
by Aviator,
5. Okt 2016
Wenn du RootNodeCount setzt, dann wird das vst.AddChild() überflüssig. Vorher solltest du natürlich (wie auch bei AddChild()) vst.Clear aufrufen. Der Code den du dann in deiner Funktion ausführst die AddChild aufruft wird dann in das OnInitNode Event verlagert. Dort wird dann pro Node die entsprechende NodeData gesetzt. Habe aktuell kein Beispiel zur Hand, werde dir aber morgen früh eins...
-
Forum: Programmieren allgemein
by Aviator,
5. Okt 2016
3 Sekunden für 100.000 Nodes sind doch noch sehr lange finde ich. Es kommt natürlich auch darauf an, wo du deine Informationen zum Füllen der Klasseninstanzen herbekommst.
Ich würde dir aber empfehlen, dass über RootNodeCount zu machen. Dann werden nämlich nur die Nodes initialisiert die aktuell angezeigt werden. Alle Children bspw. erst dann, wenn du sie aufklappst.
Wenn du dazu noch ein...
-
Forum: Programmieren allgemein
by Aviator,
5. Okt 2016
Dann musst du umstellen. Setze den RootNodeCount des Trees auf den gewünschten Wert und benutze die Events OnInitNode() und OnInitChildren(). Beispiele kann ich aktuell nicht machen. Erst so in 2 Stunden wieder.
Lies dir auch mal den großen Kommentar zu AddChild() durch den Mike Lischke drüber geschrieben hat. Die Funktion sollte man eigentlich nicht verwenden.