AGB  ·  Datenschutz  ·  Impressum  







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

Typecast von TObject zum Interface?

Ein Thema von sunny-andy · begonnen am 11. Nov 2007 · letzter Beitrag vom 12. Nov 2007
Antwort Antwort
sunny-andy

Registriert seit: 11. Nov 2007
26 Beiträge
 
#1

Typecast von TObject zum Interface?

  Alt 11. Nov 2007, 23:58
Hallo liebe Leute,

seit Stunden suche ich eine Möglichkeit, ein TObject in ein Interface zu typecasten.

Ich habe für das Observer-Pattern eine Methode namens Aktualisieren, welche ein Objekt mitliefert.
Manchmal implementiert das mitgelieferte Objekt ein Interface (IFilterFrame), und dessen Methoden möchte ich dann gern ausführen:

Delphi-Quellcode:
{*
  Observer-Methode.
}

procedure TFrameKundenliste.Aktualisieren(Sender: TObject);
var
  FilterFrame: IFilterFrame;
begin
  if Supports(Sender, IFilterFrame) then
  begin
    FilterFrame := (Sender as IFilterFrame); // <- Funktioniert nicht!
    FilterFrame.DoSomething;
  end;
Was ich auch probiert habe, es gibt nur Fehler.
Habt ihr vielleicht einen Tipp für mich?

Danke!
Andy
  Mit Zitat antworten Zitat
Benutzerbild von cruiser
cruiser

Registriert seit: 23. Dez 2003
Ort: Königsbrück/Sachsen
455 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Typecast von TObject zum Interface?

  Alt 12. Nov 2007, 03:34
Rein theoretisch müsste das gehn...

Delphi-Quellcode:
procedure TFrameKundenliste.Aktualisieren(Sender: TObject);
var
  FilterFrame: IFilterFrame;
begin
  if Supports(Sender, IFilterFrame, FilterFrame) then
    FilterFrame.DoSomething;

{...}
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Typecast von TObject zum Interface?

  Alt 12. Nov 2007, 07:30
du schreibst das es nicht funktioniert und nur fehler gibt. Welche Fehler gibt es denn? Gibt es die Fehler erst beim ausführen oder schon beim compilieren?
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#4

Re: Typecast von TObject zum Interface?

  Alt 12. Nov 2007, 09:20
Hallo,

ich gebe mal einen Tipp ab: Du hast Deinem Interface keinen GUID verpasst. Das benötigt Delphi aber für "Supports" und "as". Übrigens muss bei meinem Delphi "Supports" nicht mit dem Interface, sondern mit dem GUID aufgerufen werden.

Gruß
xaromz
I am a leaf on the wind - watch how I soar
  Mit Zitat antworten Zitat
efknarf

Registriert seit: 13. Jan 2007
Ort: Erfurt
21 Beiträge
 
Delphi 2007 Professional
 
#5

Re: Typecast von TObject zum Interface?

  Alt 12. Nov 2007, 09:33
Hallo,

Filterframe ist eine Variable des Typs IFrame, welche jedes beliebige Object speichern kann, das diesen Interface-Typ implementiert. Nun nehme ich an, daß du feststellen möchtest, ob das Object diese Schnittstelle unterstützt. Schaue dazu mal in der Hilfe unter:

* TObject.GetInterfaceEntry
* TObject.GetInterface
* TObject.GetInterfaceTable

Gruß

Frank

//Edit: Jedes Interface hat eine GUID. Falls bei der Deklaration keine angegeben wird, dann erstellt diese der Compiler.
//Edit2: Nachlesen konnte ich, daß ür eine GUID auch der Name des Interfaces angegeben werden kann. Der Compiler ersetzt diesen dann durch die GUID.
  Mit Zitat antworten Zitat
sunny-andy

Registriert seit: 11. Nov 2007
26 Beiträge
 
#6

Re: Typecast von TObject zum Interface?

  Alt 12. Nov 2007, 09:50
Zitat von cruiser:
Rein theoretisch müsste das gehn...

Delphi-Quellcode:
procedure TFrameKundenliste.Aktualisieren(Sender: TObject);
var
  FilterFrame: IFilterFrame;
begin
  if Supports(Sender, IFilterFrame, FilterFrame) then
    FilterFrame.DoSomething;

{...}
Hallo, danke für eure Antworten. Das GUID hatte ich von Anfang an drin.
Die obige Antwort ist genau das, was ich gesucht habe. Es funktioniert wurderbar, dankeschön!
  Mit Zitat antworten Zitat
Elvis

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

Re: Typecast von TObject zum Interface?

  Alt 12. Nov 2007, 09:55
Zitat von efknarf:
//Edit: Jedes Interface hat eine GUID. Falls bei der Deklaration keine angegeben wird, dann erstellt diese der Compiler.
Nein, wird nicht gehen.
Delphi-Quellcode:
program Blabla;

{$APPTYPE CONSOLE}

type
  IMyInterface = interface
  end;

  TMyClass = class(TInterfacedObject, IMyInterface)
  end;

var
  objRef : TMyClass;
  intfRef : IMyInterface;
begin
  intfRef := objRef as IMyInterface;
end.
Zitat:
//Edit2: Nachlesen konnte ich, daß ür eine GUID auch der Name des Interfaces angegeben werden kann. Der Compiler ersetzt diesen dann durch die GUID.
Ja, der Typ eines Interfaces kann als GUID benutzt werden. (Das nutze ich zum Bleistift um Factories oder Services zu verwalten)
Aber auch das geht nur, wenn das Interface eine GUID bekam.
Tut ja auch nicht weh, Ctrl + Shift + G und schon hat man eine GUID.
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
efknarf

Registriert seit: 13. Jan 2007
Ort: Erfurt
21 Beiträge
 
Delphi 2007 Professional
 
#8

Re: Typecast von TObject zum Interface?

  Alt 12. Nov 2007, 10:20
Hallo,

Stimmt! Mein Fehler. Dennoch sollte es mit der Funktion TObject.GetInterface gehen. Habe es eben ausprobiert.

Gruß
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#9

Re: Typecast von TObject zum Interface?

  Alt 12. Nov 2007, 18:33
Das Mischen von Objekten und Interfaces kann unangenehme Folgen haben!!
Delphi-Quellcode:
procedure TFrameKundenliste.Aktualisieren(Sender: TObject);
var
  FilterFrame: IFilterFrame;
begin
  if Supports(Sender, IFilterFrame, FilterFrame) then
  begin
    // intern wurde jetzt FilterFrame.AddRef aufgerufen
    // der Referenzzähler steht jetzt auf 1

    FilterFrame.DoSomething;
  end;

// jetzt gerät FilterFrame out-of-scope
// also wird FilterFrame.Release aufgerufen
// dann steht der Refernzzähler auf 0 und das Objekt wird freigegeben !!!
// es sei denn, man hat spezielle Maßnahmen getroffen, dass das nicht passiert
end;
Andreas
  Mit Zitat antworten Zitat
Elvis

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

Re: Typecast von TObject zum Interface?

  Alt 12. Nov 2007, 19:04
Zitat von shmia:
Das Mischen von Objekten und Interfaces kann unangenehme Folgen haben!!
In diesem Fall (bzw. jedem in dem Supports benutzt wird) schon.
Oft hat man aber eine Objektreferenz, bei der der Typ bereits ein bestimmtes Interface unterstützt.
Dann kann man problemlos die Objektreferenz an Methoden übergeben, die einen Interfacezeiger als "const" bekommen.
Delphi-Quellcode:
class procedure Miep.Mööp(const aInterfaceRef : IMyInterface);
begin
  aInterfaceRef.DoSomething();
end;

var
  objectRef : TMyClass;
begin
  Miep.Mööp(objectRef);
Natürlich klappt das nicht mehr, wenn die Methode irgendwelche unkoscheren Dinge damit anstellt. (Zuweisen von Feldern, Weitergabe an Methode ohne "const", ...)
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 06:33 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