Hallo,
stell mal etwas mehr Code rein.
Delphi-Quellcode:
//Stringliste erstellen,füllen
function TForm1.TVKnotenData(aNode: TTreeNode) : TStringList;
var s : string;
begin
Result := TStringList.Create;
Result.Add(aNode.Text);
Result.Add(CheckListBox3.Items[CheckListBox3.ItemIndex]);
Result.Add(Edit1.Text);
end;
//Stringliste verbinden
procedure TForm1.SetTVKnotenData;
begin
TreeView1.Selected.Data := TVKnotenData(aNode);
end;
//Data freigeben Version 1 *********************************
procedure TForm1.TV1DataFree;
var i : Integer;
begin
if TreeView1.Items.Count 0 then
for i := 0 to TreeView1.Items.Count-1 do
if TreeView1.Items.Item[i].Data <> nil then
begin
Dispose(TreeView1.Items.Item[i].Data); //Dispose(...)
TreeView1.Items.Item[i].Data := nil;
end;
end;
//Data freigeben Version 2 ***********************************
procedure TForm1.TV1DataFree;
var i : Integer;
begin
if TreeView1.Items.Count 0 then
for i := 0 to TreeView1.Items.Count-1 do
if TreeView1.Items.Item[i].Data <> nil then
begin
TStrings(TreeView1.Items.Item[i].Data).Free; //TStrings(...).Free
// ... := nil entfernt
end;
end;
//Data freigeben Version 3 ***********************************
procedure TForm1.TV1DataFree;
var i : Integer;
begin
if TreeView1.Items.Count 0 then
for i := TreeView1.Items.Count-1 downto 0 do //downto
if TreeView1.Items.Item[i].Data <> nil then
begin
TStrings(TreeView1.Items.Item[i].Data).Free;
// ... := nil entfernt
end;
end;
Alle 3 Versionen laufen ohne Fehler und geben auch den Speicher frei.
Bei einer größeren Anzahl von Knoten(>1000) mit .Data wird
die Schleife zur Speicherfreigabe zum Ende immmer langsamer.
(ist unabhängig von der Größe der verbundenen Stringlisten)
Mit einer downto-Schleife (Version3) dreht sich das Verhalten um.
Warum vermindert sich die Geschwindigkeit?
Hat jemand eine Idee die Speicherfreigabe schneller zu machen ?
Würde mich freuen
MfG
Lannes