AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Problem Mit Interface-Objekt

Ein Thema von DGS · begonnen am 26. Apr 2007 · letzter Beitrag vom 27. Apr 2007
Antwort Antwort
DGS

Registriert seit: 10. Jul 2004
65 Beiträge
 
Delphi 6 Enterprise
 
#1

Problem Mit Interface-Objekt

  Alt 26. Apr 2007, 14:10
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.
Vorschläge für sinnvolle Signatur bitter per PN
  Mit Zitat antworten Zitat
Udontknow

Registriert seit: 17. Jun 2002
223 Beiträge
 
#2

Re: Problem Mit Interface-Objekt

  Alt 26. Apr 2007, 17:05
Hallo!

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

Cu,
Udontknow
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Problem Mit Interface-Objekt

  Alt 26. Apr 2007, 17:07
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?
Markus Kinzler
  Mit Zitat antworten Zitat
DGS

Registriert seit: 10. Jul 2004
65 Beiträge
 
Delphi 6 Enterprise
 
#4

Re: Problem Mit Interface-Objekt

  Alt 26. Apr 2007, 17:22
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.
Vorschläge für sinnvolle Signatur bitter per PN
  Mit Zitat antworten Zitat
HeikoDD

Registriert seit: 8. Okt 2003
11 Beiträge
 
#5

Re: Problem Mit Interface-Objekt

  Alt 27. Apr 2007, 21:59
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;
  Mit Zitat antworten Zitat
DGS

Registriert seit: 10. Jul 2004
65 Beiträge
 
Delphi 6 Enterprise
 
#6

Re: Problem Mit Interface-Objekt

  Alt 27. Apr 2007, 23:43
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:

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-
Vorschläge für sinnvolle Signatur bitter per PN
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:31 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