Re: TObjectList: AV wenn OwnsObject := True
Hi Angel,
Du definierst bei Dir AddImage, benutzt aber nachher Add? Ist das gewollt oder nur ein Schreibfehler? |
Re: TObjectList: AV wenn OwnsObject := True
Ist en schreibfehler im Quelltext, aber funzt au so :wall: ist doch egal ich füge auf jedenfall ein TImage hinzu un gebe das ganze wieder frei :mrgreen:
|
Re: TObjectList: AV wenn OwnsObject := True
Ja, ich überschreibe die Add Methode, damit ich nur TImage Objekte in die Liste packen kann:
Delphi-Quellcode:
procedure TPageCollection.Add(Item: TImageEnVect);
begin inherited Add(Item); end; |
Re: TObjectList: AV wenn OwnsObject := True
Hi Michael,
sofern ich mich richtig erinnern kann, hatte ich so ein Problem auch mal. Es lag aber (wie in Deinem Fall die TPageCollection) an der Liste, sondern an den Objekten (in Deinem Fall TImageEnVect), die ich hinzugefügt habe. Evtl. steht etwas im Destructor von TImageEnVect, was die AV verursacht. |
Re: TObjectList: AV wenn OwnsObject := True
Zitat:
also hier sieht man doch eigentlich schon wie man es (imho) nicht machen sollte. Wenn der Owner (Self) angegeben wird, dann wird u.U. versucht das Image zweimal frei zu geben, einmal wenn durch PageCollection.Free (wenn OwnsObjects = True) und natürlich auch nochmal, wenn der Owner (also Self) frei gegeben wird. Das sollte beim zweiten mal also ordentlich krachen. Deswegen einfach mal den Owner durch nil ersetzen oder eben OwnsObjects auf false. Und ja, wundert mich dann natürlich auch, dass das hier überhaupt funktioniert. Imho dürfte es das eben nicht (ohne Fehler). Gruß der Unwissende |
Re: TObjectList: AV wenn OwnsObject := True
Ja also das das funktioniert würde ich auch sagen das im Destructor vom TImageEnVect was drin steckt was das verursacht. Ich habs jetzt auf alle möglichen Arten versucht, aber bekomme keine AV
|
Re: TObjectList: AV wenn OwnsObject := True
Hm, also ich habe beim Erstellen des Images nil als Owner angegeben. Vor hatte ich nämlich eine einfache TList genommen und wollte mich nun von der Last befreien, die Objekte selber frei geben zu müssen, was anstandslos geklappt hatte. (Schleife über alle Objekte und freigeben mit Free.) Weil ich auch zur Laufzeit Objekte rauslöschen will. Und da dachte ich, ist eine TObjectList bequemer.
Das Hinzufügen sieht dann so aus:
Delphi-Quellcode:
function TForm1.NewPage: TImageEnVect;
var ie : TImageEnVect; dpi : Integer; ieWidth : Integer; ieHeight : Integer; begin ie := TImageEnVect.Create(nil); with ie do begin Name := 'Page' + IntToStr(PageCollection.Count); Parent := Form1; Left := 200; Top := 10; Cursor := crArrow; DragMode := dmManual; dpi := GetDeviceCaps(GetDC(0), LOGPIXELSY); ieWidth := trunc((dpi / 25.4 * 197) * 0.5); ieHeight := trunc((dpi / 25.4 * 290) * 0.5); Width := ieWidth; Height := ieHeight; LayersSync := false; MouseInteract := [miMoveLayers, miResizeLayers]; Bitmap.Width := ieWidth; Bitmap.Height := ieHeight; Bitmap.Canvas.Brush.Style := bsClear; Bitmap.Canvas.Brush.Color := clWhite; Bitmap.Canvas.Rectangle(0, 0, ieWidth, ieHeight); Update; OnDragOver := ImageEnVectDragOver; OnDragDrop := ImageEnVectDragDrop; end; result := ie; end; procedure TForm1.btnNewPageClick(Sender: TObject); begin if Assigned(ImageEnVect) then PageCollection.Update(LBCurrentIndex, ImageEnVect); ImageEnVect := NewPage; PageCollection.Add(ImageEnVect); ListBox1.Items.Add(Format('Seite %d',[ListBox1.Count + 1])); LBCurrentIndex := ListBox1.Count - 1; //Listbox1.ItemIndex := LBCurrentIndex; //lblCurrPage.Caption := Format('Aktuelle Seite: %s', [PageCollection.Items[LBCurrentIndex].Name]); end; |
Re: TObjectList: AV wenn OwnsObject := True
Und was machst du im Destructor vom TImageEnVect?
|
Re: TObjectList: AV wenn OwnsObject := True
Zitat:
|
Re: TObjectList: AV wenn OwnsObject := True
Dein Problem dürfte sein (ohne jetzt alles genau gelesen zu haben, etc.), dass Du die Objekte vom Typ TImageEnVect (geile Bibliothek, gell ;)) sowohl Deiner Liste zufügst, als auch irgendeinem Container auf Deinem Form. Wenn Du jetzt das Form schließt, dann versucht sowohl der Container des Forms, in welchem die Objekte als Children dargestellt werden, als auch die Liste diese Objekte zu releasen.
Einer schafft es, der andere kommt zu spät mit der Freigabe et voilà, es kommt zur AV. Lösung: entweder vorm FormClose die Elemente wieder aus den Containern entfernen oder der Liste verbieten die Objekte auch freizugeben (OwnsObjects := False;). ...:cat:... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:28 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz