Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   TObjectList: AV wenn OwnsObject := True (https://www.delphipraxis.net/84818-tobjectlist-av-wenn-ownsobject-%3D-true.html)

Die Muhkuh 22. Jan 2007 13:13

Re: TObjectList: AV wenn OwnsObject := True
 
Hi Angel,

Du definierst bei Dir AddImage, benutzt aber nachher Add? Ist das gewollt oder nur ein Schreibfehler?

Angel4585 22. Jan 2007 13:14

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:

Luckie 22. Jan 2007 13:16

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;

Die Muhkuh 22. Jan 2007 13:21

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.

Der_Unwissende 22. Jan 2007 13:22

Re: TObjectList: AV wenn OwnsObject := True
 
Zitat:

Zitat von Angel4585
Delphi-Quellcode:
procedure TtfMain.Button1Click(Sender: TObject);
begin
  PageCollection := TPageCollection.Create;
  PageCollection.Add(TImage.Create(Self));
end;

Hi,
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

Angel4585 22. Jan 2007 13:26

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

Luckie 22. Jan 2007 13:28

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;

Angel4585 22. Jan 2007 13:34

Re: TObjectList: AV wenn OwnsObject := True
 
Und was machst du im Destructor vom TImageEnVect?

Der_Unwissende 22. Jan 2007 13:37

Re: TObjectList: AV wenn OwnsObject := True
 
Zitat:

Zitat von Luckie
Hm, also ich habe beim Erstellen des Images nil als Owner angegeben.

Und Du entfernst die Controls auch wieder vom Parent, bevor Du die freigibst? Das wäre das Einzigste was mir noch einfällt, woran es scheitern könnte.

sakura 22. Jan 2007 13:40

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.
Seite 2 von 4     12 34      

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