AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Inkompatible Typen: 'IMyInterface' und 'TPersistent'
Thema durchsuchen
Ansicht
Themen-Optionen

Inkompatible Typen: 'IMyInterface' und 'TPersistent'

Ein Thema von berens · begonnen am 24. Okt 2007 · letzter Beitrag vom 24. Okt 2007
Antwort Antwort
berens

Registriert seit: 3. Sep 2004
431 Beiträge
 
Delphi 2010 Professional
 
#1

Inkompatible Typen: 'IMyInterface' und 'TPersistent'

  Alt 24. Okt 2007, 22:27
Hi!

Ich hab eine TComponentList voll mit unterschiedlichen Objekten, die alle garantiert ein IMyInterface haben.

Nun will ich über die ComponentList für ein einzelnes Objekt einen Wert über das Interface ändern. Wie geht das?

IMyInterface(SelectedObjects.Items[i]).x := 1;
--> Inkompatible Typen: 'IMyInterface' und 'TPersistent'

bla: IMyInterface;
bla := SelectedObjects.Items[i];
bla.x := 1;
--> Inkompatible Typen: 'IMyInterface' und 'TPersistent'
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Inkompatible Typen: 'IMyInterface' und 'TPersistent'

  Alt 24. Okt 2007, 22:37
Ich bin mir nicht ganz sicher, aber es wäre durchaus möglich, dass das nicht geht - du musst eventuell wirklich auf eine Klasse casten, die das Interface implementiert - das kann theoretisch auch eine einfache Basisklasse sein, die nur das Interface implementiert - eventuell sogar alle Methoden als abstrakt. Von der leitest du dann alles andere, was das Interface implementiert, ab.

Aber ich arbeite nicht sehr viel mit Interfaces, könnte also sein, dass das auch anders möglich ist.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
berens

Registriert seit: 3. Sep 2004
431 Beiträge
 
Delphi 2010 Professional
 
#3

Re: Inkompatible Typen: 'IMyInterface' und 'TPersistent'

  Alt 24. Okt 2007, 22:39
Wenn das stimmt, dann wären Interfaces meiner Meinung nach kompletter Unsinn:

Ich habe einen TButton und ein TEdit, die beide die Prozedur .FooBar bekommen sollen. Wie soll ich denn aus den Beiden eine gemeinsame Basisklasse machen?

Weil Mehrfachvererbung in Delphi nicht geht, gibt es ja Interfaces. Ich fange aber leider eben erst mit an und kapier das noch nicht so ganz :/


Edit: OMG, alle Delphi-Interface-Tutorials die ich bisher gefunden habe, gehen davon aus, dass mir schon zur Entwicklungszeit bekannt ist, mit was für einem Objekt ich gerade arbeite. Klar, dann funktioniert das, mit Typecast auf TMyObject(foo).bla. Tjo, aber wenn das Objekt aus der ComponentList nun von der Klasse TFoo oder TBar ist, die auch das Interface haben bringt mir das afaik nix, weil der ja durch den Typecast auf die falsche Klasse den falschen Speicherbereich ausliest...
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

Re: Inkompatible Typen: 'IMyInterface' und 'TPersistent'

  Alt 24. Okt 2007, 22:53
Eigentlich (sofern es sich wirklich um eine TComponentList handelt) sollten die Elemente der Liste vom Typ TComponent sein, der wiederum IInterface implementiert und somit auf andere Interfaces castbar (Vorsicht: denglisch) ist. Die Fehlermeldung bzgl. TPersistent irritiert mich da ein wenig.

Zu deinem Nachtrag: du musst nicht wirklich den Typ des Objekts wissen, du musst nur eine gemeinsame Basisklasse wissen, die IInterface implementiert.
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.481 Beiträge
 
Delphi 10.1 Berlin Professional
 
#5

Re: Inkompatible Typen: 'IMyInterface' und 'TPersistent'

  Alt 24. Okt 2007, 23:00
Zitat von berens:
IMyInterface(SelectedObjects.Items[i]).x := 1;
--> Inkompatible Typen: 'IMyInterface' und 'TPersistent'
Gut dass das der Compiler abfängt. Hierbei würdest du den TPersistent-Zeiger als Interface-Zeiger interpretieren.

Zitat:
bla: IMyInterface;
bla := SelectedObjects.Items[i];
Hier verhindert der Compiler die Zuweisung, weil er keine Informationen über den Zusammenhang zwischen dem TPersistent und IMyInterface hat. Diesen Zusammenhang kann man leider nur bei der Deklaration mitteilen.


Bei TComponent kannst du den "as" Operator nutzen:
(SelectedObjects.Items[i] as IMyInterface).x := 1;

Wenn du jedoch mit TPersistent arbeitest, dass kein IInterface implementiert, also auch keine QueryInterface Methode besitzt, musst du auf die Supports() Funktionen ausweichen.
Delphi-Quellcode:
var
  bla: IMyInterface;
begin
  if Supports(SelectedObjects.Items[i], IMyInterface, bla) then
    bla.x := 1;
end;
Das ist ziemlich Umständlich, da hier der "as"-Operator nicht funktioniert weil TPersistent kein IInterface implementiert. Mit TInterfacedPersistent würde das kein Problem sein.

Kleine Hilfsfunktion wenn du einen Einzeiler haben willst.
Delphi-Quellcode:
function IntfCast(Instance: TObject; const IID: TGUID): IInterface;
begin
  if not Supports(Instance, IID, Result) then
    raise EIntfCastError.CreateRes(@SIntfCastError);
end;

var
  Persistent: TPersistent;
begin
  Persistent := Irgendwas;
  IMyInterface(IntfCast(Persistent, IMyInterface).x := 1;
end;
  Mit Zitat antworten Zitat
berens

Registriert seit: 3. Sep 2004
431 Beiträge
 
Delphi 2010 Professional
 
#6

Re: Inkompatible Typen: 'IMyInterface' und 'TPersistent'

  Alt 24. Okt 2007, 23:09
Ok, zur Verteidigung von Delphi und Schlamperei meinerseits muss natürlich noch gesagt werden, dass dies (hab den Code ein paar Wochen nicht gesehen) keine einfache TComponentList ist, sondern vom Typ TLMDDesignObjects, was zwar auch eine Liste für Komponenten, aber keine TComponenList in diesem Sinne ist.

var
comp: TComponent;
begin
comp := TComponent(SelectedObjects[i]);
(comp as IMyInterface).DS := 1;

^-- scheint zu gehen

(TComponent(SelectedObjects[i]) as IMyInterface).DS := 1;

^-- scheint auch zu gehen



So, schon mal sehr gut dass wir soweit sind, Danke erstmal.

Diese Zeile kann man aber auf die Schnelle nicht mehr vereinfachen, denke ich mal?

Der "as" Operator prüft doch zur Laufzeit alle Objekte, ob die auch wirklich das Interface haben, sonst gibt's Exception. Korrekt, oder?

Danke nochmal für die Tips!
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.481 Beiträge
 
Delphi 10.1 Berlin Professional
 
#7

Re: Inkompatible Typen: 'IMyInterface' und 'TPersistent'

  Alt 24. Okt 2007, 23:14
Zitat von berens:
sonst gibt's Exception. Korrekt, oder?
Genau. Der haut dir das um die Ohren wenn es nicht passt.
  Mit Zitat antworten Zitat
berens

Registriert seit: 3. Sep 2004
431 Beiträge
 
Delphi 2010 Professional
 
#8

Re: Inkompatible Typen: 'IMyInterface' und 'TPersistent'

  Alt 24. Okt 2007, 23:15
Ok, Danke an Alle. Thema erfolgreich abgehakt. Gute N8.
  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 21:53 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