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 Interface-Objekt (https://www.delphipraxis.net/90951-problem-mit-interface-objekt.html)

DGS 26. Apr 2007 14:10


Problem Mit Interface-Objekt
 
Moi.

Ich komm da nicht ganz weiter. Also folgende Ausgangssituation:

Ich habe mehrere Klassen, die gleichen Aufbaue haben, deshalb haben alle dasselbe Interface ( Folgend iHaupt genannt).
Also jede meiner Klassen hat die Prozeduren, die ich im Interface hingeschrieben habe.

Nun wollte ich diese Objekte "sammeln"
Hab ein "array[0..5] of iHaupt" erstellt.

Sobald ich aber versuche was auszuführen ( array[0].MainLoop; ) bekomme ich eine Exception:
Projekt1.exe raised exception class EAccessViolation with message...
Da ich bezweifle, dass die Adresse in irgendeiner weise hilfreich ist, hab ich mir gespart die abzutippen.

Auf alle Fälle hab ich im Create Ereignis des Objekts mit dem array sowas noch drin:
array[0] := tBeispiel1.Create;


Hab auch testweise ein Array durch eine Variable ersetzt, die ich wieder als iHaupt deklariert habe.
Bekomme dieselbe Fehlernachricht. Erst wenn ich die Variable von iHaupt auf tBeispiel1 ändere, funktioniert es.

Meine Frage nun:
Wie kann ich nun meine Klassen zusammenfassen und ansteuern, ohne dabei explizit wissen zu müssen, welches Klasse es genau ist?
Alle Klasse erben ja das Interface und sehen nach außen hin gleich aus.

Udontknow 26. Apr 2007 17:05

Re: Problem Mit Interface-Objekt
 
Hallo!

Poste doch mal bitte ein bisschen Code. So ist das ein Glaskugel-Spiel.

Cu,
Udontknow

mkinzler 26. Apr 2007 17:07

Re: Problem Mit Interface-Objekt
 
Zitat:

Da ich bezweifle, dass die Adresse in irgendeiner weise hilfreich ist,
Nur wen sie 0 wäre.
Wie ist TBeispiel (Interface-implementierende Klasse) deklariert?

DGS 26. Apr 2007 17:22

Re: Problem Mit Interface-Objekt
 
OK, dann mal her mit dem code ^^"

Das ist meine Unit, die die Objekte sammelt:
Delphi-Quellcode:
unit SteuerEinheit;

interface

uses
  Interface_Haupt, Beispiel1;

type
  tSteuerEinheit = class
  private    
    fAppletArray       : array[0..5] of iHaupt;

  public
    constructor Create;
    procedure MainLoop;
  end;

var
  hlp : iHaupt;

implementation

uses
  Unit1;

constructor tSteuerEinheit.Create;
begin
  inherited Create;

//  fAppletArray[0] := tBeispiel1.Create;
  hlp := tBeispiel1.Create;
end;

procedure tSteuerEinheit.MainLoop;
begin
  hlp.MainLoop;
end;

end.
> funktioniert erst dann, wenn ich hlp auf tBeispiel1 ändere.

Hier das Interface:
Delphi-Quellcode:
unit Interface_Haupt;

interface

type
  iHaupt = interface
    procedure MainLoop;
  end;

implementation

end.
Es ist derzeit noch recht leer. Sollte aber später mit Funktionen aufgefüllt werden. Ich wollte bloss vorher testen, ob der Rohbau funktioniert, was er nicht tut.

und hier meine Beispiel Unit
Delphi-Quellcode:
unit Beispiel1;

interface

uses
  Interface_Haupt;

type
  tBeispiel1 = class(tInterfacedObject, iHaupt)
  private
  public
    constructor Create;

    procedure MainLoop;
  end;

implementation

constructor tBeispiel1.Create;
begin
  inherited Create;
end;

procedure tBeispiel1.MainLoop;
begin
  // TODO: MainLoop
end;
Wegen der Speicheradresse: war nicht 0.

HeikoDD 27. Apr 2007 21:59

Re: Problem Mit Interface-Objekt
 
vielleicht hilft das etwas, also bei mir läuft es unter d5 ohne probleme.

Delphi-Quellcode:
const IIDHaupt : TGUID = '{EA6A5E02-3B7D-458E-898D-101F76832635}';

type iHaupt = interface(IUnknown)
       ['{EA6A5E02-3B7D-458E-898D-101F76832635}']
       procedure MyLoop; stdcall;
     end;

////////////////////////////////////////////////////////////////////////////////
type tCustomClass = class(tObject)
       protected
         fApplet : Array of IHaupt;
         procedure SetIhaupt(Index:Integer; Value:IHaupt); stdcall;
         function GetIHaupt(Index:integer):IHaupt; stdcall;
       public
         constructor Create;
         destructor Destroy; override;
         property Haupts[Index:Integer]:IHaupt read GetIHaupt write SetIHaupt;
     end;


procedure tCustomClass.SetIhaupt(Index:Integer; Value:IHaupt); stdcall;
begin
  if (Index > -1) and (Index < 6) then fapplet[Index] := Value else
    raise exception.CreateFmt('Bad Index %d',[Index]);
end;

function tCustomClass.GetIHaupt(Index:Integer):IHaupt; stdcall;
begin
  result := nil;
  if (index < 0) or (index > 6) then exit
    else result := fApplet[Index];
end;

constructor tCustomClass.create();
begin
  inherited;
  setlength(fApplet, 6);
end;

destructor tCustomClass.destroy;
var i:Integer;
begin
 for i := low(fApplet) to high(fApplet) do
   fApplet[i] := nil;
 inherited;
end;
////////////////////////////////////////////////////////////////////////////////

type tHauptClass = class(tInterfacedObject, IHaupt)
       protected
         procedure MyLoop; stdcall;
       public
     end;

procedure tHauptClass.MyLoop; stdcall;
begin
  showmessage('hui');
end;

////////////////////////////////////////////////////////////////////////////////

procedure TForm1.FormCreate(Sender: TObject);
var i, j  : integer;
    IH : IHaupt;
begin
  j := 0;
  with tCustomClass.Create do begin
    for i := 1 to 1000 do begin
      for j := 0 to 5 do begin
        IH := NIL;
        IH := tHauptClass.Create;
        Haupts[j] := IH;
      end;

      for j := 5 downto 0 do begin
        IH := Haupts[j];
        if (ih <> nil) then ih.MyLoop;
        Haupts[j] := NIL;
      end;
    end;
  end;
end;

DGS 27. Apr 2007 23:43

Re: Problem Mit Interface-Objekt
 
Hi!

Forum hat da ne kleine Fehlfunktion... egal, hab es nun bei mir in Delphi6 eingefügt und ausprobiert.
Funktioniert problemlos. Bekomme die nachricht "hui".
Also wird die "MyLoop" ausgeführt.

Derzeit schaue ich mir den Programmablauf an.
Was mir zB da auffällt ist die Prüfung auf NullPointer.

Weiterer unterschied:
Hier holt sich die aufrufende Klasse das Objekt zu sich und startet es. In meinem Aufbau übergibt die Klasse nur den Befehl weiter und die andere Klasse übergibt ihn dann weiter.
Allerdings glaub ich nicht, dass sowas irgendwas ändern wird.

Na gut, danke für den Code Schnippsel. Werde den mal durchkauen in der Hoffnung damit meinen zu reparieren.

*EDIT:
:oops: :oops: :oops:
Ich fühl mich echt blöd, aber wenigstens hab ich den Fehler gefunden.
Fehler lag in meiner Form1.
Da wurde meine Steuereinheit falsch aufgerufen. Bei ihr kam der Create Befehl nie an.
Was mich aber etwas verwundert, wieso es alles problemlos lief, als ich anstelle des Interface die Klasse genommen hatte.
Da hat Delphi mit Klassen gearbeitet, von denen es eigentlich nicht eine Instanz geben sollte.

sry für die unruhe. Der Fehler lag mal wieder komplett woanders. -DAP-


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:17 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 by Thomas Breitkreuz