AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Problem bei Zugriff auf Elemente eine TInterfaceList
Thema durchsuchen
Ansicht
Themen-Optionen

Problem bei Zugriff auf Elemente eine TInterfaceList

Ein Thema von Astan212 · begonnen am 21. Sep 2006 · letzter Beitrag vom 21. Sep 2006
Antwort Antwort
Astan212

Registriert seit: 28. Apr 2005
9 Beiträge
 
#1

Problem bei Zugriff auf Elemente eine TInterfaceList

  Alt 21. Sep 2006, 13:11
Moin,

für Schulungszwecke habe ich Java-Code auf Delphi umzuschreiben und bin ich auf folgendes Problem gestoßen:

Der Delphi-Code sieht so aus:
Delphi-Quellcode:

 IGemuese = interface(IInterface)
    function toString : string;
 end;

...

 TKnoblauch = class(TInterfacedObject,IGemuese)
  public
    function toString : string;
  end;

  TPaprika = class(TInterfacedObject, IGemuese)
  public
    function toString : string;
  end;

  TPilze = class(TInterfacedObject, IGemuese)
  public
    function toString : string;
  end;
...

 function TKnoblauch.toString : String;
 begin
   Result := 'Knoblauch';
 end;
 //usw. für die anderen Gemüse

...

function TMyBelag.erstelleGemuese: TInterfaceList;
var i: Integer;
    gemueseListe: TInterfaceList;
begin
  gemueseListe := TInterfaceList.Create;
  gemueseListe.Add(TKnoblauch.Create);
  gemueseListe.Add(TPilze.Create);
  gemueseListe.Add(TPaprika.Create);

  
  for i:=0 to gemueseListe.Count-1 do
  begin
    WriteLn(IGemuese(gemueseListe[i]).toString); //und das geht dann hier nicht (Zugriffsverletzung)!
  end;

  result := gemueseListe;
end;
Wie kann ich die Methode toString der Elemente der gemueseListe verwenden wenn ich nur den Typ IGemuese der Elemente kenne?

bis denne
Guido
  Mit Zitat antworten Zitat
Benutzerbild von TKC
TKC

Registriert seit: 21. Apr 2004
Ort: Tuningen
367 Beiträge
 
Delphi XE2 Enterprise
 
#2

Re: Problem bei Zugriff auf Elemente eine TInterfaceList

  Alt 21. Sep 2006, 13:33
Hi,

bist du gezwungen das per Interfaces zu machen oder ist das nur ein Ansatz von dir ?
  Mit Zitat antworten Zitat
Astan212

Registriert seit: 28. Apr 2005
9 Beiträge
 
#3

Re: Problem bei Zugriff auf Elemente eine TInterfaceList

  Alt 21. Sep 2006, 13:40
Es geht dabei um ein Beispiel der Umsetzung einer einfachen verteilten Anwendung in C#, Java und Delphi in mehreren Schritten.

Dem Client sind am Ende nur die Interfaces mit u.a. IGemuese bekannt.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: Problem bei Zugriff auf Elemente eine TInterfaceList

  Alt 21. Sep 2006, 13:59
Ob harte Casts mit Interfaces gehen

Mach lieber folgendes:

Statt
IGemuese(gemueseListe[i]).toString lieber
Delphi-Quellcode:
if gemueseListe[i] is IGemuese then
  (gemueseListe[i] as IGemuese).toString
Du mußt "nur" deinem Interface eine GUID zuweisen:

Delphi-Quellcode:
IGemuese = interface(IInterface)
    ['{ABAD6C43-AE24-4719-9319-9E775365F45E}'] // <- Bitte neue eigene GUID mittels <Shift> + <Strg> + <g> erzeugen
    function toString : string;
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: Problem bei Zugriff auf Elemente eine TInterfaceList

  Alt 21. Sep 2006, 14:05
Hallo Bernhard,

rein interessehalber.
was passiert denn, wenn man die GUID ganzwegläßt ?


Heiko
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: Problem bei Zugriff auf Elemente eine TInterfaceList

  Alt 21. Sep 2006, 14:07
Zitat von hoika:
Hallo Bernhard,

rein interessehalber.
was passiert denn, wenn man die GUID ganzwegläßt ?


Heiko
Dann funktioniert is/as nicht.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Astan212

Registriert seit: 28. Apr 2005
9 Beiträge
 
#7

Re: Problem bei Zugriff auf Elemente eine TInterfaceList

  Alt 21. Sep 2006, 14:19
Moin,

is funktioniert auch mit GUID nicht (Fehler: Operator ist auf diesen Operandentyp nicht anwendbar).
Das (gemueseListe[i] as IGemuese).toString funktioniert aber und reicht mir eigentlich schon als Lösung.
Vielen Dank, Bernhard!

bis denne
Guido
  Mit Zitat antworten Zitat
Astan212

Registriert seit: 28. Apr 2005
9 Beiträge
 
#8

Re: Problem bei Zugriff auf Elemente eine TInterfaceList

  Alt 21. Sep 2006, 15:12
Moin,

So funktioniert es auch mit Typ-Überprüfung:

Delphi-Quellcode:
function TMyBelag.erstelleGemuese: TInterfaceList;
var i: Integer;
    MyObject: TInterfacedObject;
begin
  gemueseListe := TInterfaceList.Create;
  gemueseListe.Add(TKnoblauch.Create);
  gemueseListe.Add(TPilze.Create);
  gemueseListe.Add(TPaprika.Create);

  for i:=0 to gemueseListe.Count-1 do
  begin

    if gemueseListe[i].QueryInterface(IGemuese,MyObject) = S_OK then
      WriteLn((gemueseListe[i] as IGemuese).toString);
  end;
  result := gemueseListe;
end;
Etwas kompliziert ist das mit den Interfaces in Delphi schon...

bis denne
Guido
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#9

Re: Problem bei Zugriff auf Elemente eine TInterfaceList

  Alt 21. Sep 2006, 15:32
Zitat von Astan212:
Etwas kompliziert ist das mit den Interfaces in Delphi schon...
Ohne COM würde ich dir Recht geben, aber COM-compliant interfaces mit autom. Referenzzählung sind schon sehr praktisch beim Konsumieren oder Bereitstellen von COM-Schnittstellen.

btw:
Delphi-Quellcode:
if supports(objectInstance, IDeinInterface, interfaceInstance) then
  interfaceInstance.DoSomething()
else
  WTF('?');
Geht aber auch nur über eine GUID, da GUIDs nunmal COM-Interfaces identifizieren.
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  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 10:40 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