Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Problem mit Destroy und IInterface (https://www.delphipraxis.net/111245-problem-mit-destroy-und-iinterface.html)

Meta777 1. Apr 2008 07:54


Problem mit Destroy und IInterface
 
Huhu...

Habe ein kleines Problem mit einem Object das im Constructor ein Object erzeugt, welches das "Parent"-Object im Constructor als Interface übergibt.
Das Problem ist, dass beim Destructor ein AV erzeugt wird (direkt nach dem "begin" vom Destroy)
Erzeuge ich das Postfach-Object nicht gibs auch kein Probs.
Bin für jeden Hinweis dankbar.

Shalom

Delphi-Quellcode:
destructor TPMPostFach.Destroy;
begin        //hier Breakpoint gesetzt - nach "F7" -> AV - kommt also nicht zum "inherited"
  inherited;
end;
Die Klasse die das "Postfach"-Object beinhaltet...

Delphi-Quellcode:
constructor TPmGateway.Create;
begin
  inherited;
  FPostfach := TPMPostFach.Create(Self);//Das Object mit dem übergebenen Interface (Self imlpementiert das Interface)
end;
Hier die "Postfach"-Klasse...

Delphi-Quellcode:
constructor TPMPostFach.Create(const aPmOnlineImportAction: PmIOnlineImportAction);
begin
  inherited Create();
  PmOnlineImportAction := aPmOnlineImportAction;
end;

Bernhard Geyer 1. Apr 2008 07:58

Re: Problem mit Destroy und IInterface
 
Arbeite entweder mit Parent-Child-Beziehung oder mit Interface. Ansonsten wird es passieren das sowohl der Parent als auch die automatische Referenzzählung versucht die Instanz freizugebn.

Meta777 1. Apr 2008 09:24

Re: Problem mit Destroy und IInterface
 
Zitat:

Zitat von Bernhard Geyer
Arbeite entweder mit Parent-Child-Beziehung oder mit Interface. Ansonsten wird es passieren das sowohl der Parent als auch die automatische Referenzzählung versucht die Instanz freizugebn.

Ich vergass zu werwähnen das die Klassen direkt von TObject abgeleitet werden. Also gibt es auch kein Parent-Child-Beziehung.

Die Exception kommt an folgender Stelle (RefCount ist "1"):
Delphi-Quellcode:
procedure TInterfacedObject.BeforeDestruction;
begin
  if RefCount <> 0 then
    Error(reInvalidPtr);
end;
Zur Lösung des Problems habe ich jetzt eine procedure "Free_" mit folgendem Code eingeführt:
Delphi-Quellcode:
procedure TPmGateway.Free_;
begin
  Self._Release;
end;
Wäre aber dennoch schön wenn mir einer erklären kann wie das Problem normalerweise zu lösen ist, so dass ".Free"/der normaler Destructor benutzt werden kann.

Sahlom&TIA

xaromz 1. Apr 2008 09:37

Re: Problem mit Destroy und IInterface
 
Hallo,

das Problem ist auf einfache Weise zu lösen: Entweder immer Objektreferenz oder immer Interfacereferenz. Gemischter Betrieb ist in Delphi ein Spiel mit dem Feuer. Das sollte man nur machen, wenn man ganz genau weiß, was man tut.

Gruß
xaromz

Meta777 1. Apr 2008 10:31

Re: Problem mit Destroy und IInterface
 
Zitat:

Zitat von xaromz
Hallo,

das Problem ist auf einfache Weise zu lösen: Entweder immer Objektreferenz oder immer Interfacereferenz. Gemischter Betrieb ist in Delphi ein Spiel mit dem Feuer. Das sollte man nur machen, wenn man ganz genau weiß, was man tut.

Gruß
xaromz

Hab ich schonmal gelesen - ich glaub in deinem Tut!? ^^
Aber wie kann ich speziell bei meinem Fall das Problem lösen. Da ja das Postfach-Object welches das Interface benötigt in der Klasse ist die das Interface darstellt, kann ich ja nicht einfach das interface im Postfach-Object auf nil setzen. Im Destroy kommt ja schon die Exception!?...

xaromz 1. Apr 2008 10:53

Re: Problem mit Destroy und IInterface
 
Hallo,
Zitat:

Zitat von Meta777
Aber wie kann ich speziell bei meinem Fall das Problem lösen.

Zeig mal etwas mehr Code. Insbesondere die Deklaration der beiden Klassen und des Interfaces wäre interessant.

Gruß
xaromz


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:38 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