![]() |
Re: Hilfe mit Access Violation
Hallo
der Fehler ist behoben. Der PluginManager wollte ein Package entladen in welchem ein Frame nicht freigesetzt wurde. Unter finally fehlte der Eintrag FfrmTH.Free. Dabei wirft sich für mich die nächste Frage auf warum die Variable FfrmTH nicht von Delphi freigegeben wurde. Um was genau kümmert sich Delphi und um welche Objekte muß ich mich kümmern?
Delphi-Quellcode:
Oliver
procedure TfrmErstgespraech.ZeigeTexthilfeAn;
var TVL : TTextvorlage; Titel : string; FfrmTH : TFrmTexthilfe; begin try TVL := TTextvorlage.Create; TVL.Produkt:= FD.Produkt; TVL.Kategorie:= pcErstgespraech.ActivePage.Caption; FfrmTH := TFrmTexthilfe.Erzeugen(TVL); FfrmTH.ShowModal; if FfrmTH.ModalResult = mrOK then begin ZeigeTextVorlagenAn(FfrmTH.Textvorlagen); end; finally FfrmTH.Free; end; end; |
Re: Hilfe mit Access Violation
Grobe Faustregel: Alles was Du selber erzeugst, musst Du auch wieder abräumen. Ausnahmen bestätigen die Regel (z.B. TObjectList, Childcontrols, etc.) :)
|
Re: Hilfe mit Access Violation
[OT]
Ein try...finally sollte folgendermassen aufgebaut sein
Delphi-Quellcode:
..
MyObject := TSomeClass.Create; try ... ... finally MyObject.Free; end; .. [/OT] |
Re: Hilfe mit Access Violation
Zitat:
Delphi-Quellcode:
Oliver
procedure TfrmErstgespraech.ZeigeTexthilfeAn;
var TVL : TTextvorlage; FfrmTH : TFrmTexthilfe; begin TVL := TTextvorlage.Create; try TVL.Produkt:= FD.Produkt; TVL.Kategorie:= pcErstgespraech.ActivePage.Caption; FfrmTH := TFrmTexthilfe.Erzeugen(TVL); FfrmTH.ShowModal; if FfrmTH.ModalResult = mrOK then begin ZeigeTextVorlagenAn(FfrmTH.Textvorlagen); end; finally FfrmTH.Free; end; TVL.Free; end; |
Re: Hilfe mit Access Violation
Ja du musst es freigeben.
Guck mal den Code unten an und vergleich mal mit deinem bitte. So wäre der Umgang mit try...finally richtig.
Delphi-Quellcode:
procedure TfrmErstgespraech.ZeigeTexthilfeAn;
var TVL : TTextvorlage; FfrmTH : TFrmTexthilfe; begin TVL := TTextvorlage.Create; try TVL.Produkt:= FD.Produkt; TVL.Kategorie:= pcErstgespraech.ActivePage.Caption; FfrmTH := TFrmTexthilfe.Erzeugen(TVL); try FfrmTH.ShowModal; if FfrmTH.ModalResult = mrOK then begin ZeigeTextVorlagenAn(FfrmTH.Textvorlagen); end; finally FfrmTH.Free; end; finally TVL.Free; end; end; |
Re: Hilfe mit Access Violation
Zitat:
Unwissenheit ist nichts schlimmes und sollte nicht mit Demütigung bestraft werden sondern durch ordentliche Hilfe in umgänglichen Formen gemindert werden. |
Re: Hilfe mit Access Violation
Jens, ich glaube, das hast Du falsch verstanden.
Zitat:
|
Re: Hilfe mit Access Violation
oh, wenn das so ist entschuldige ich mich für den Vorworf :oops:
Allerdings zeigt es dan man das ganze wohl durchaus auch missverstehen kann. |
Re: Hilfe mit Access Violation
@ SirThornberry: hab das auch so verstanden wie DeddyH.
@Tyrael Y.: O.K ich sehe den Unterschied, jetzt muß ich nur noch begreifen warum Dein Vorschlag richtiger ist. Der finally-Block bedeutet doch das sein Inhalt immer ausgeführt wird. Wenn ich nun beide Objekte(FfrmTH,TVL) vor dem schliessenden end der Prozedur freisetze und auf try verzichte, wird mir im Fehler-Fall eine Fehlermeldung angezeigt, bevor ich das Objekt wieder freisetzten kann. Verwende ich dageben try ..finally wird der try-Block ausgeführt, aber bei einem Fehler das Objekt freigesetzt und keine Fehlermeldung angezeigt - auch wenn der Fehler in einem anderen Objekt auftritt. Verstehe ich das so richtig? Oliver |
Re: Hilfe mit Access Violation
Deshalb nennt man try-finally auch Ressourcenschutzblock. Ein finally wird immer durchlaufen, selbst bei einem exit-Befehl im Block.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:25 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-2025 by Thomas Breitkreuz