Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi EInvalidPointer - Ungültige Zeigeroperation (https://www.delphipraxis.net/133781-einvalidpointer-ungueltige-zeigeroperation.html)

DerAndereMicha 8. Mai 2009 15:36


EInvalidPointer - Ungültige Zeigeroperation
 
Hallo,

wie kann es sein, daß es beim Konstrukt

Delphi-Quellcode:

Form2:=TForm2.Create(application);
Try
   Form2.Showmodal;
Finally
   Form2.free;
End;
bei Form2.Free manchmal zu einer EInvalidPointer-Exception kommt?

Gruß
Micha

quendolineDD 8. Mai 2009 15:40

Re: EInvalidPointer - Ungültige Zeigeroperation
 
Wenn ein Owner angegeben wird, kümmert der sich auch um das Freigeben.

DerAndereMicha 8. Mai 2009 15:45

Re: EInvalidPointer - Ungültige Zeigeroperation
 
Und warum sollte das die Application nur manchmal machen? Besonders während das Programm noch läuft ...

Gruß
Micha

quendolineDD 8. Mai 2009 15:50

Re: EInvalidPointer - Ungültige Zeigeroperation
 
Nun weiß ich nicht, wie die Mechanismen dahinter genauer sind, da ich mich da mehr in C/Java auskenne. Aber wenn dort auch eine Art Garbage-Collector benutzt wird kann es natürlich sein, dass nach dem Zurückkehren aus ShowModal manchmal dein Programm schneller im entfernen ist, als der Garbage Collector.
Aber ich glaube mich zu entsinnen, das bei Angabe eines Parents dieser erst nach Zerstörung seinerselbst alle ihm zugeordneten Child-Elemente zerstört.

DerAndereMicha 8. Mai 2009 16:05

Re: EInvalidPointer - Ungültige Zeigeroperation
 
Der Meinung bin ich eben auch - deshalb find ich die Meldung etwas seltsam.

himitsu 8. Mai 2009 16:15

Re: EInvalidPointer - Ungültige Zeigeroperation
 
passiert das auch, wenn du nun statt des application ein nil übergibst?

eventuell liegt es ja auch an was anderem :gruebel:


PS:
Delphi-Quellcode:
constructor TComponent.Create(AOwner: TComponent);
begin
  FComponentStyle := [csInheritable];
  if AOwner <> nil then AOwner.InsertComponent(Self);
end;
allerdings wird dieses nicht wieder entfernt, was du selber machen müßtest
(denn wenn jetzt Application mal seine Child-Liste durchgeht und seine Kinder etwas fragen will, dann knallt es schonmal, wenn ein Kind plötzlich einfach so fehlt, es aber nicht bescheidgesagt hat)

Delphi-Quellcode:
Form2:=TForm2.Create(application);
Try
   Form2.Showmodal;
Finally
   Application.RemoveComponent(Form2);
   Form2.free;
End;
oder eben
Delphi-Quellcode:
Form2:=TForm2.Create(nil);
Try
   Form2.Showmodal;
Finally
   Form2.free;
End;
[add]
ich seh grad ... im Destructor :gruebel:
Delphi-Quellcode:
  if FOwner <> nil then FOwner.RemoveComponent(Self);

DerAndereMicha 8. Mai 2009 16:25

Re: EInvalidPointer - Ungültige Zeigeroperation
 
Die Exception trat heut zum ersten Mal auf (nach 3 Monaten), da ist es schwer festzustellen, ob sie mit einem nil als Owner nicht aufgetreten wäre - jetzt funktionierts ja wieder alles ohne Probleme. Zumal ich immer die Application als Owner verwende und mir bei diesem Konstrukt noch nie ne Exception an dieser Stelle untergekommen ist. Vielleicht lag das Problem ja wirklich wo anders - nur wo?

Edit: Ich werde es mal mit Deinem Konstrukt probieren und sehen ob der Fehler wieder auftritt. Danke.

Gruß
Micha

quendolineDD 8. Mai 2009 16:32

Re: EInvalidPointer - Ungültige Zeigeroperation
 
Wer weiß, was da an der Speicherstelle passiert ist und in dem Moment wirklich gestanden hat. Ich übergebe auch immer Self als Parameter und hab damit noch nie Probleme gehabt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:26 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz