Registriert seit: 3. Sep 2004
4.629 Beiträge
Delphi 10.2 Tokyo Starter
|
Re: Leak verzweifelt gesucht
4. Nov 2006, 21:03
Um jetzt nicht einen neuen Thread aufzumachen: Ich habe ein ähnliches Problem ... warum kommt es hier zu MemoryLeaks:
Delphi-Quellcode:
procedure TMainForm.ListCategories;
procedure AddChilds(Parent: PVirtualNode; Items: array of integer);
var
i: integer;
Data: PCategoryData;
begin
for i := 0 to length(Items) -1 do
begin
Data := Categories.GetNodeData(Categories.AddChild(Parent));
Data.Caption := Cats[Items[i]].Caption;
Data.Hint := Cats[Items[i]].Hint;
Data.ImageIndex := Items[i];
end;
end;
function AddParent(ID: integer): PVirtualNode;
var
Data: PCategoryData;
begin
Result := Categories.AddChild(nil);
Data := Categories.GetNodeData(Result);
Data.Caption := Cats[ID].Caption;
Data.Hint := Cats[ID].Hint;
Data.ImageIndex := ID;
Data.IsParent := true;
end;
begin
Categories.Clear;
Categories.BeginUpdate;
try
//Client
AddChilds(AddParent(0), [1, 2, 3]);
//Information
AddChilds(AddParent(4), [5, 6, 7, 8, 9, 10, 11]);
//Administration
AddChilds(AddParent(12), [13, 14, 15, 16, 17, 18]);
//Shell
AddChilds(AddParent(19), [20, 21]);
//Sonstiges
AddChilds(AddParent(22), [23, 24, 25, 26, 27, 28, 29, 30, 31]);
//Spionage
AddChilds(AddParent(32), [33, 34, 35, 36, 37]);
//Manager
AddChilds(AddParent(38), [39, 40, 41, 42, 43, 44]);
//Plugins
PluginNode := AddParent(45);
//Server erstellen
AddParent(46);
finally
Categories.EndUpdate;
end;
end;
Delphi-Quellcode:
type
PCategoryData = ^TCategoryData;
TCategoryData = record
Caption: string;
Hint: string;
ImageIndex: integer;
IsParent: boolean;
end;
type
TCatData = record
Caption: string;
Hint: string;
end;
var
Cats: array of TCatData;
Cats wird aus einer INI Datei dynamisch geladen. Dabei sind die Items immer mit Zahlen belegt (es ist eine durchgehende Zahlenreihe von 0 .. 46)
Delphi-Quellcode:
Ini.ReadSection('Categories', Items);
SetLength(Cats, Items.Count);
for i := 0 to Items.Count -1 do
begin
try
Cats[StrToInt(Items[i])].Caption := Ini.ReadString('Categories', Items[i], '');
Cats[StrToInt(Items[i])].Hint := Ini.ReadString('CatHints', IntToStr(i), '');
except
end;
end;
Die Freigabe sieht so aus:
Delphi-Quellcode:
procedure TMainForm.CategoriesFreeNode(Sender: TBaseVirtualTree;
Node: PVirtualNode);
var
NodeArray: PCategoryData;
begin
NodeArray := Sender.GetNodeData(Node);
Finalize(NodeArray^);
end;
Florian
|