AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein VirtualSourceTree selektierte Nodes löschen?
Thema durchsuchen
Ansicht
Themen-Optionen

VirtualSourceTree selektierte Nodes löschen?

Ein Thema von SneakyBagels · begonnen am 17. Jun 2017 · letzter Beitrag vom 20. Jun 2017
 
SneakyBagels
(Gast)

n/a Beiträge
 
#16

AW: VirtualSourceTree selektierte Nodes löschen?

  Alt 19. Jun 2017, 15:21
Zitat:
Hat es irgendeinen Grund, warum du die Objekte überhaupt in einer TObjectList ablegst? Ich persönlich gehe immer so vor, dass ich beim Einfügen einer Node mein Datenobjekt/Datenrecord mit Create erstelle und zuweise.
Ich bin mir noch nicht sicher, ob ich TObjectList behalte. Man hört von der einen Seite Zurufe "Ja, verwende es, dann verwaltest du den Speicher selber" und von der anderen Seite das Gegenteil.

Was ist denn jetzt richtiger?
Mir ist nur wichtig, dass ich immer vollen Zugriff auf alle Daten habe. Daher dachte ich, wäre eine ObjectList nicht schlecht.

Zitat:
Zumindest früher hat der VST das definitiv nicht von alleine gemacht.
Kann ich nicht beurteilen. Ich gebe jedenfalls keinerlei Instanzen der in der ObjectListe enthaltenen Daten frei und habe keine Speicherlecks.

Zitat:
IndexOf ist nebenbei bemerkt keine sehr schnelle Operation und kann bei extrem vielen Nodes deine Performance schon ziemlich verschlechtern.
Ich gehe von nicht mehr als 100 und im aller schlechtesten Fall 200 Nodes ohne Children aus.

Delphi-Quellcode:
// ObjectList mit OwnObjects auf FALSE

procedure TForm2.VSTFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
var
 Data: TVSTData;
 idx: Integer;
begin
 Data := Node.GetData<TVSTData>;

 idx := aVSTDataClasses.IndexOf(Data);
 if idx > -1 then
  aVSTDataClasses.Delete(idx);

 Data.Free;
end;
Und so erzeuge ich meine Nodes
Delphi-Quellcode:
type
 TVSTData = class(TObject)
  Col1, Col2, Col3, Col4, Col5, sDescription: string;
  Icon: Byte;
 end;

 TVSTDataClasses = TObjectList<TVSTData>;

var
 aVSTDataClasses: TVSTDataClasses;
...

procedure TForm2.Button1Click(Sender: TObject);
var
 aVSTData: TVSTData;
 i: Integer;
begin
 if not Assigned(aVSTDataClasses) then
  aVSTDataClasses := TVSTDataClasses.Create(False);

 for i := 0 to 5 do
  begin
   aVSTData := TVSTData.Create;
   aVSTData.Col1 := IntToStr(i);
   aVSTData.Col2 := IntToStr(Random(1000));
   aVSTData.Col3 := IntToStr(Random(1000));
   aVSTData.Col4 := IntToStr(Random(1000));
   aVSTData.Col5 := IntToStr(Random(1000));
   aVSTData.Icon := Random(ImageList2.Count - 1);

   if i mod 3 = 0 then
    aVSTData.sDescription := 'Das ist ein ganz langer String - ok so lang ist er nicht!'
   else
    aVSTData.sDescription := '';

   aVSTDataClasses.Add(aVSTData);
  end;

 VST.RootNodeCount := aVSTDataClasses.Count;
end;

Geändert von SneakyBagels (19. Jun 2017 um 15:26 Uhr)
  Mit Zitat antworten Zitat
 


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 14:31 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