![]() |
Pointer geht verloren
Hi,
Mein Plugin ruft bei der Ausführung TApp.GetEditor.Clear auf. Das funktioniert auch. Einmal... Beim zweiten mal ist FEditor irgendwie nil o.O -> AV. Dieser Quelltext ist jetzt aus der Anwendung selbst.
Delphi-Quellcode:
Wie ist denn das zu erklären ? o.O
TApp = class(TInterfacedObject,IApp)
private FEditor: IEditor; public constructor Create; function GetEditor: IEditor; stdcall; procedure Terminate; stdcall; end; TEditor = class(TInterfacedObject,IEditor) private FEditor: TMemo; public constructor Create(AEditor: TMemo); procedure Clear; stdcall; procedure SetContent(const Value: WideString); stdcall; function GetContent: WideString; stdcall; end; constructor TApp.Create; begin inherited Create; FEditor := TEditor.Create(Form1.Memo1); end; function TApp.GetEditor: IEditor; begin Result := FEditor; // Batsch (beim 2. mal) end; constructor TEditor.Create(AEditor: TMemo); begin inherited Create; FEditor := AEditor; end; procedure TEditor.Clear; begin FEditor.Lines.Clear; end; Ich habs doch eigentlich genauso gemacht wie jbg ![]() Gruß Neutral General |
Re: Pointer geht verloren
Also es ist nur ne Vermutung.
Aber wenn du das
Delphi-Quellcode:
Aufrufst und einer Variable zuweist dann darfst du bei dieser kein Free machen. Denn der Pointer COpiert das Object ja nicht sondern gibt nur eine 2. Referenz
function TApp.GetEditor: IEditor;
wenn du dann das 2. mal drauf zugreifen willst zeigt dein
Delphi-Quellcode:
auf einen bereits Freigegebenen Speicherplatz und das erzeugt dann die AV.
FEditor
|
Re: Pointer geht verloren
Ich gebe FEditor: IEditor ja niemals frei...
|
Re: Pointer geht verloren
Eigentlich solltest du den Editor (im PlugIn) sogar freigeben(bzw. nur einmal holen und dann behalten) (bzw. aus dem Scope laufen lassen). Denn Result := FEditor sollte ja schon ein _AddRef auslösen.
|
Re: Pointer geht verloren
Im Plugin:
Delphi-Quellcode:
So hab ichs jetzt gemacht. Hast du das so gemeint?
var
Edit: IEditor; { TPlugin } function TPlugin.Execute(App: IApp): Integer; begin Result := 1; if Edit = nil then Edit := App.GetEditor; Edit.Clear; end; Jedenfalls klappts trotzdem nicht... |
Re: Pointer geht verloren
OK, scheint zu passen. Ich hoffe du nillst "Edit" irgendwo am Anfang? Da es ne globale Variable ist, kannst du sie auch auf "=nil" initialisieren.
|
Re: Pointer geht verloren
Zitat:
Gruß Neutral General |
Re: Pointer geht verloren
Tja, ich bin am Ende meines Lateins.
|
Re: Pointer geht verloren
Delphi-Quellcode:
So Leute schaut euch das mal an.. Was fällt euch auf ? .... Und?
function Execute(App: IApp): Integer; stdcall;
RICHTIG :arrow:
Delphi-Quellcode:
:wall: :mrgreen: -.-^^
function Execute(const App: IApp): Integer; stdcall;
Naja aber so lernt mans... :mrgreen: Gruß Neutral General |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:03 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