Ir al contenido


Foto

Saber si un objeto implementa una interfaz


  • Por favor identifícate para responder
9 respuestas en este tema

#1 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 02 octubre 2012 - 10:33

Buenas,

A ver, que ya no sé por donde mirar y seguro que es una tontería :(

Quiero saber si un determinado Objecto implementa una determinada interfaz. Es decir, si yo tengo algo como



delphi
  1.   TLinePoint = class(TCollectionItem)
  2.   private
  3.     FOwner: TObject;
  4.     FMyProp: Integer;
  5.     procedure SetMyProp(const Value: Integer);
  6.   protected
  7.   public
  8.     constructor Create(Owner: TObject; Collection: TCollection); reintroduce; virtual;
  9.     destructor Destroy; override;
  10.   published
  11.     property MyProp: Integer read FMyProp write SetMyProp;
  12.   end;
  13.  
  14.   ILinePoint = interface
  15.     ['{35926390-118A-4604-A343-73D200A36006}']
  16.     procedure LinePointChanged;
  17.   end;
  18.  
  19. .....
  20.  
  21. procedure TLinePoint.SetMyProp(const Value: Integer);
  22. var
  23.   Intf: ILinePoint;
  24. begin
  25.   FMyProp := Value;
  26.  
  27.   if FOwner.GetInterface(ILinePoint, Intf) then
  28.   begin
  29.     ShowMessage('si');
  30.     Intf.LinePointChanged;
  31.   end
  32.   else
  33.     ShowMessage('no');
  34. end;



Es decir, a TLinePoint se le pasa un Owner de tipo TObject en el constructor. Necesito saber si este Owner implementa la interfaz ILinePoint en el Set de la propiedad MyProp, pero no tengo manera de encontrar la forma. ¿Alguna ayudita?

Gracias de antemano
  • 0

#2 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 02 octubre 2012 - 11:01

Hola Xavi.

¿ El operador is no funciona para comprobar interfaces ?.

Es decir : (Owner is ILinePoint)

Saludos.
  • 0

#3 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 02 octubre 2012 - 11:10

Hola Marc

Esa fue mi primera opción, pero ni compila jejejejeje

Gracias de todas formas :)

Nos leemos
  • 0

#4 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.092 mensajes
  • LocationRepública Dominicana

Escrito 02 octubre 2012 - 11:59

Saludos.

Unit: SysUtils

Type: function

Description
Indicates whether a given object or interface supports a specified interface.

Call Supports to determine whether the object or interface specified by Instance, or the class specified by AClass, supports the interface identified by the IID parameter. If Instance supports the interface, Supports returns the interface as the Intf parameter and returns True. If AClass supports the interface, Supports does not return an interface, but still returns True. If the interface specified by IID is not supported, Supports returns False.

On the Win32 platform, to determine whether the interface specified by IID is supported, Supports calls the QueryInterface method of the supplied interface (or the interface of the supplied object). However, unlike calling QueryInterface directly, Supports lets you pass a nil (Delphi) or NULL (C++) value as the instance.

On the .NET platform, Supports uses the typecasting facilities of the .NET framework.



delphi
  1. function Supports(const Instance: IInterface;
  2. const IID: TGUID;
  3. out Intf): Boolean; overload;
  4.  
  5. function Supports(const Instance: TObject;
  6. const IID: TGUID;
  7. out Intf): Boolean; overload;
  8.  
  9. function Supports(const Instance: IInterface; const IID: TGUID): Boolean; overload;
  10.  
  11. function Supports(const Instance: TObject; const IID: TGUID): Boolean; overload;
  12.  
  13. function Supports(const AClass: TClass; const IID: TGUID): Boolean; overload;


  • 0

#5 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 02 octubre 2012 - 03:28

Gracias Rolphy

Esta función Support ya lo había probado, pero no sé por qué no me funcionó (algo haría mal). Ahora me he vuelto a mirar la ayuda y la VCL y he visto donde fallaba y todo me ha ido correcto

Muchas gracias por abrirme los ojos :)

Nos leemos
  • 0

#6 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 02 octubre 2012 - 04:25

Ahora me he vuelto a mirar la ayuda y la VCL y he visto donde fallaba y todo me ha ido correcto

Muchas gracias por abrirme los ojos :)

Nos leemos

Hola amigo, ¿Donde estaba el error? Yo suelo trabajar con interfaces. De hecho, al momento tengo unas 5 o 6 en mi actual proyecto. Y si bien no tuve que realizar esto, no estaría mal tener a mano algunas nociones por las dudas. ;)

Saludos,
  • 0

#7 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 03 octubre 2012 - 12:52

Buenas Delphius

Si te fijas, TLinePoint es un TCollectionItem. Pues bien, el Owner sólo se lo pasaba a la clase TLinePoints (TCollection), pero no a TLinePoint, por lo que al hacer la comprobación con Supports siempre me devolvía false :s :D :D :D

Un fallo de principiante, lo sé 8o| *-)

Nos leemos y nuevamente gracias a todos
  • 0

#8 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 03 octubre 2012 - 07:20

Buenas Delphius

Si te fijas, TLinePoint es un TCollectionItem. Pues bien, el Owner sólo se lo pasaba a la clase TLinePoints (TCollection), pero no a TLinePoint, por lo que al hacer la comprobación con Supports siempre me devolvía false :s :D :D :D

Un fallo de principiante, lo sé 8o| *-)

Nos leemos y nuevamente gracias a todos


Uff yo anoche me di con un error de principiante peorcito. ¿Que se debe hacer cuando uno declara un método como virtual y va a sobreescribirlo en una clase descendiente? Le añade la cláusula override ¿no es cierto? Pues eso es lo que haría cualquier persona que maneja Delphi... excepto el bruto que está teclando ahora: yo.
Con razón me estaba tirando warnings/hints de que había métodos de una subclase que estaban ocultando al de su padre. Toca ahora revisar entre 4KLDC, 10 clases y 7 módulos los métodos virtuales y sobreeescritos. Eso si es burrada ¡Y de la golda! como diría Oaki.

Saludos,
  • 0

#9 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 03 octubre 2012 - 07:30

jejeje, también está bien es tuyo ^^ Si es que esas cosas nos pasan por no fijarnos más :p
  • 0

#10 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 03 octubre 2012 - 07:38

jejeje, también está bien es tuyo ^^ Si es que esas cosas nos pasan por no fijarnos más :p

En mi caso por estar medio olvidando los conceptos de Delphi. Ultimamente como estoy más "abstracto" y me dedico más al A/DOO por momentos estoy que se olvida como era hacer x cosa en Delphi. :s

Saludos,
  • 0




IP.Board spam blocked by CleanTalk.