Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Interface und zweimaliger Methodenaufruf (https://www.delphipraxis.net/112649-interface-und-zweimaliger-methodenaufruf.html)

Eidechsenlord 24. Apr 2008 23:15


Interface und zweimaliger Methodenaufruf
 
hI!
Ich steh offenbar grad auf meinem eigenen Schlauch. Kann mir jemand einen Tip geben, warum in folgendem
Delphi-Quellcode:
unit InterfaceSpaszUnit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  IMyIF = Interface(IInterface)
    function GetLength(i: Integer): Integer;
  end;

  TMyExample = class(TInterfacedObject, IMyIF)
  private
    FEinFeld: array of array of Integer;
  public
    constructor Create(); overload;
    function GetLength(i: Integer): Integer;
  end;

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private-Deklarationen }
    MyExample: TMyExample;
    function GetWert(bsp: IMyIF): String;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TMyExample }
constructor TMyExample.Create;
var
  i: Integer;
begin
  inherited Create;
  SetLength(FEinFeld, 2);
  for i := 0 to Length(FEinFeld) - 1 do
    SetLength(FEinFeld[i], i);
end;

function TMyExample.GetLength(i: Integer): Integer;
begin
  Result := Length(FEinFeld[i]);
end;

{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
begin
  MyExample := TMyExample.Create;
end;

function TForm1.GetWert(bsp: IMyIF): String;
begin
  Result := IntToStr(bsp.GetLength(1));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(GetWert(MyExample));
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Close;
end;
end.
der zweite Click auf den Go-Button zu einer Verletzung fuehrt? Unversehrt bleibt alles, wenn
Delphi-Quellcode:
function GetWert(bsp: IMyIF): String;
als Argument
Delphi-Quellcode:
TMyExample
bekommen soll.
Ich grueble, warum nur!?

Vorschuszdank & Abschied,
Berni

jottkaerr 25. Apr 2008 06:05

Re: Interface und zweimaliger Methodenaufruf
 
Beim ersten Verlassen von TForm1.GetWert() schlägt die automatische Referenzzählung von Interfaces zu, und das Objekt wird freigegeben, weil es keinen weiteren Verweis auf das Interface gibt. Beim zweiten Aufruf gibt es dann das Objekt nicht mehr.

Wenn Du MyExample als IMyIF deklarierst, sollte es funktionieren, weil es dann auch nach Verlassen von GetWert() einen Verweis auf das Interface gibt.

jkr

Eidechsenlord 25. Apr 2008 13:42

Re: Interface und zweimaliger Methodenaufruf
 
hI!
Vielen Dank fuer die schnelle Antwort -- sie hat mir geholfen. Das Problem hatte ich natuerlich vereinfacht dargestellt. In Wirklichkeit sollen mehrere (ein und das selbe Interface implementierende) Klassen ueber dieses Interface angesprochen werden. Die haben nun alle nen Wrapper und alles ist fein.

Dank nochmal,
Berni


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