![]() |
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. |
Re: Problem Mit Interface-Objekt
Hallo!
Poste doch mal bitte ein bisschen Code. So ist das ein Glaskugel-Spiel. Cu, Udontknow |
Re: Problem Mit Interface-Objekt
Zitat:
Wie ist TBeispiel (Interface-implementierende Klasse) deklariert? |
Re: Problem Mit Interface-Objekt
OK, dann mal her mit dem code ^^"
Das ist meine Unit, die die Objekte sammelt:
Delphi-Quellcode:
> funktioniert erst dann, wenn ich hlp auf tBeispiel1 ändere.
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. Hier das Interface:
Delphi-Quellcode:
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.
unit Interface_Haupt;
interface type iHaupt = interface procedure MainLoop; end; implementation end. und hier meine Beispiel Unit
Delphi-Quellcode:
Wegen der Speicheradresse: war nicht 0.
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; |
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; |
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