Ich habe eine Klasse von TObject abgeleitet mit einer inneren Liste vom Typ TList. Diese fülle ich mit Objekten. Hin und wieder muss ich eine Kopie dieser Liste anfertigen. Dazu hab eich mir eine Methode
Assign geschrieben:
Delphi-Quellcode:
procedure TPageCollection.Assign(Source: TPageCollection);
var
i : Integer;
j : Integer;
hobj : Integer;
hObjSource : Integer;
Page : TImageEnVect;
begin
// Klassenattribute kopieren
PageParent := Source.PageParent;
ScaleFactor := Source.ScaleFactor;
for i := 0 to Source.Count - 1 do
begin
Page := TImageEnVect.Create(nil);
// Seiteneigenschaften kopieren
Page.Name := Source.Items[i].Name;
Page.Parent := PageParent; //Source.Items[i].Parent;
Page.Visible := False;
Page.AllowOutOfBitmapMoving := False;
Page.BorderStyle := bsNone;
Page.ScrollBars := ssNone;
Page.Cursor := crArrow;
Page.DragMode := dmManual;
Page.Width := Source.Items[i].Width;
Page.Height := Source.Items[i].Height;
Page.OnDragOver := Source.Items[i].OnDragOver;
Page.OnDragDrop := Source.Items[i].OnDragDrop;
Page.OnMouseDown := Source.Items[i].OnMouseDown;
Page.OnObjectDblClick := Source.Items[i].OnObjectDblClick;
Page.OnLayerNotify := Source.Items[i].OnLayerNotify;
// Seiten-Layer kopieren. Bitmap nicht mit kopieren.
for j := 1 to Source.Items[i].LayersCount - 1 do
begin
hobj := Page.LayersAdd;
Page.Layers[hobj].Assign(Source.Items[i].Layers[j]);
end;
// Textobjekte
for j := 0 to Source.Items[i].ObjectsCount - 1 do
begin
hobj := Page.AddNewObject;
hObjSource := Source.Items[i].GetObjFromIndex(j);
Page.ObjUserData[hObjSource] := Source.Items[i].ObjUserData[hObjSource];
Page.ObjKind[hobj] := Source.Items[i].ObjKind[hObjSource];
Page.ObjLeft[hobj] := Source.Items[i].ObjLeft[hObjSource];
Page.ObjTop[hobj] := Source.Items[i].ObjTop[hObjSource];
Page.ObjWidth[hobj] := Source.Items[i].ObjWidth[hObjSource];
Page.ObjHeight[hobj] := Source.Items[i].ObjHeight[hObjSource];
Page.ObjTextAlign[hobj] := Source.Items[i].ObjTextAlign[hObjSource];
Page.ObjFontName[hobj] := Source.Items[i].ObjFontName[hObjSource];
Page.ObjFontHeight[hobj] := Source.Items[i].ObjFontHeight[hObjSource];
Page.ObjPenColor[hobj] := Source.Items[i].ObjPenColor[hObjSource];
Page.ObjFontStyles[hobj] := Source.Items[i].ObjFontStyles[hObjSource];
Page.ObjText[hobj] := Source.Items[i].ObjText[hObjSource];
Page.Update;
end;
Add(Page);
end;
end;
Die Instanz für die Kopie ist global (in der Klasse), damit ich aber jetzt keine Speicherlecks bekomme rufe ich die Methode
Clear auf bevor ich Klasse mit der LÖiste kopiere:
Delphi-Quellcode:
procedure TPageCollection.Clear;
var
i: Integer;
begin
for i := FInnerList.Count - 1 downto 0 do
begin
TObject(FInnerList.Items[i]).Free;
end;
// inherited;
//FInnerList.Clear;
end;
Das sieht dann so aus:
Delphi-Quellcode:
TempPageCollection.Clear;
TempPageCollection.Assign(PageCollection);
Nur leider bekomme ich eine AccessViolation in der
Assign-Methode, wenn ich vorher meine
Clear-Methode aufrufe.
Was mache ich da falsch? Oder wie kann man sonst Speicherlecks vermeiden?