Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Pointer geht verloren (https://www.delphipraxis.net/87651-pointer-geht-verloren.html)

Neutral General 3. Mär 2007 18:08


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:
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;
Wie ist denn das zu erklären ? o.O

Ich habs doch eigentlich genauso gemacht wie jbg hier auch.

Gruß
Neutral General

Corpsman 3. Mär 2007 18:20

Re: Pointer geht verloren
 
Also es ist nur ne Vermutung.

Aber wenn du das

Delphi-Quellcode:
function TApp.GetEditor: IEditor;
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

wenn du dann das 2. mal drauf zugreifen willst zeigt dein
Delphi-Quellcode:
FEditor
auf einen bereits Freigegebenen Speicherplatz und das erzeugt dann die AV.

Neutral General 3. Mär 2007 18:23

Re: Pointer geht verloren
 
Ich gebe FEditor: IEditor ja niemals frei...

DGL-luke 3. Mär 2007 18:36

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.

Neutral General 3. Mär 2007 18:41

Re: Pointer geht verloren
 
Im Plugin:

Delphi-Quellcode:
var
  Edit: IEditor;

{ TPlugin }

function TPlugin.Execute(App: IApp): Integer;
begin
  Result := 1;
  if Edit = nil then
    Edit := App.GetEditor;
  Edit.Clear;
end;
So hab ichs jetzt gemacht. Hast du das so gemeint?
Jedenfalls klappts trotzdem nicht...

DGL-luke 3. Mär 2007 18:44

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.

Neutral General 3. Mär 2007 18:47

Re: Pointer geht verloren
 
Zitat:

Zitat von DGL-luke
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.

Jo hab ich jetzt auch gemacht.. Aber das ändert an der ganzen Sache nicht wirklich was :(

Gruß
Neutral General

DGL-luke 3. Mär 2007 18:49

Re: Pointer geht verloren
 
Tja, ich bin am Ende meines Lateins.

Neutral General 4. Mär 2007 11:29

Re: Pointer geht verloren
 
Delphi-Quellcode:
function Execute(App: IApp): Integer; stdcall;
So Leute schaut euch das mal an.. Was fällt euch auf ? .... Und?

RICHTIG

:arrow:

Delphi-Quellcode:
function Execute(const App: IApp): Integer; stdcall;
:wall: :mrgreen: -.-^^

Naja aber so lernt mans... :mrgreen:

Gruß
Neutral General


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