AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TObjectList: AV wenn OwnsObject := True

Ein Thema von Luckie · begonnen am 22. Jan 2007 · letzter Beitrag vom 22. Jan 2007
Antwort Antwort
Seite 2 von 4     12 34      
Benutzerbild von Die Muhkuh
Die Muhkuh

Registriert seit: 21. Aug 2003
7.332 Beiträge
 
Delphi 2009 Professional
 
#11

Re: TObjectList: AV wenn OwnsObject := True

  Alt 22. Jan 2007, 13:13
Hi Angel,

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

Registriert seit: 4. Okt 2005
Ort: i.d.N.v. Freiburg im Breisgau
2.199 Beiträge
 
Delphi 2010 Professional
 
#12

Re: TObjectList: AV wenn OwnsObject := True

  Alt 22. Jan 2007, 13:14
Ist en schreibfehler im Quelltext, aber funzt au so ist doch egal ich füge auf jedenfall ein TImage hinzu un gebe das ganze wieder frei
Martin Weber
Ich bin ein Rüsselmops
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#13

Re: TObjectList: AV wenn OwnsObject := True

  Alt 22. Jan 2007, 13:16
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;
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Die Muhkuh
Die Muhkuh

Registriert seit: 21. Aug 2003
7.332 Beiträge
 
Delphi 2009 Professional
 
#14

Re: TObjectList: AV wenn OwnsObject := True

  Alt 22. Jan 2007, 13:21
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.
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#15

Re: TObjectList: AV wenn OwnsObject := True

  Alt 22. Jan 2007, 13:22
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
  Mit Zitat antworten Zitat
Angel4585

Registriert seit: 4. Okt 2005
Ort: i.d.N.v. Freiburg im Breisgau
2.199 Beiträge
 
Delphi 2010 Professional
 
#16

Re: TObjectList: AV wenn OwnsObject := True

  Alt 22. Jan 2007, 13:26
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
Martin Weber
Ich bin ein Rüsselmops
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#17

Re: TObjectList: AV wenn OwnsObject := True

  Alt 22. Jan 2007, 13:28
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;
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Angel4585

Registriert seit: 4. Okt 2005
Ort: i.d.N.v. Freiburg im Breisgau
2.199 Beiträge
 
Delphi 2010 Professional
 
#18

Re: TObjectList: AV wenn OwnsObject := True

  Alt 22. Jan 2007, 13:34
Und was machst du im Destructor vom TImageEnVect?
Martin Weber
Ich bin ein Rüsselmops
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#19

Re: TObjectList: AV wenn OwnsObject := True

  Alt 22. Jan 2007, 13:37
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.
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#20

Re: TObjectList: AV wenn OwnsObject := True

  Alt 22. Jan 2007, 13:40
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.

......
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 4     12 34      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:31 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