![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|
|
#1
|
|||
|
|||
|
Hola de nuevo.
Os voy a poner el codigo de prueba que estoy realizando. Esta es la interface: Código:
unit MyInterface;
interface
type
IMyInterface = interface ['{6E93F07C-AD0C-494B-85BC-A960AF01EF0A}']
procedure HacerAlgo();
end;
implementation
end.
Código:
unit MyClass;
interface
uses QExtCtrls,Dialogs,MyInterface;
type
TMyClass=Class(TTimer,IMyInterface)
procedure HacerAlgo();
end;
implementation
procedure TMyClass.HacerAlgo();
begin
showmessage('Estoy haciendo algo');
end;
end.
Código:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,ExtCtrls,MyClass,MyInterface ;
type
TForm1 = class(TForm)
Button1: TButton;
Timer1: TTimer;
procedure Button1Click(Sender: TObject);
procedure Miprocedimiento(Objeto:TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
MiClase:TMyClass;
begin
MiClase:=TMyClass.create(self);
MiProcedimiento(MiClase);
MiClase.Free;
end;
procedure TForm1.Miprocedimiento(Objeto:TObject);
begin
if Supports(Objeto,IMyInterface) then
(Objeto as IMyInterface).HacerAlgo();
end;
end.
En el caso de declarar Objeto como TObject, se produce el siguiente error de compilación:"Operator not aplicable to this operand type" en la línea "(Objeto as IMyInterface).HacerAlgo();" y es por la sentencia as Puedo hacer typecast a Objeto para que sea TMyClass, pero el problema es que no todos los objetos que recibirá será TMyClass. No se como puedo arreglarlo. Gracias de nuevo. Salu22222 |
|
#2
|
|||
|
|||
|
Hola de nuevo.
Releyendo vuestros mensajes se me ha ocurrido hacer lo siguiente: Código:
procedure TForm1.Miprocedimiento(Objeto:IInterface);
begin
if Supports(Objeto,IMyInterface) then
(Objeto as IMyInterface).HacerAlgo()
else
showmessage('este no tiene la interface');
end;
También lo puedo hacer con IUnknown y funciona igualmente. Gracias Salu22222 |
|
#3
|
||||
|
||||
|
Cita:
Si aún deseas usar TObject en lugar de IInterface como tipo de datos del parámetro lo puedes hacer con Supports que acepta un tercer parámetro en el que se recibe una interfaz en caso de soportarse:
// Saludos |
|
#4
|
|||
|
|||
|
Ciertamente este último uso de Support me parece más limpio y funciona correctamente en el caso de que un objeto implemente un tipo determinado de interface.
Gracias por todo. Salu22222 |
|
#5
|
|||
|
|||
|
Ciertamente, es mas elegante. Ya dije que no lo había comprobado, estaba poniéndolo de memoria. Perdonad por el tiempo perdido.
__________________
Guía de Estilo del Foro |
|
#6
|
||||
|
||||
|
Cita:
Va un 'regaño' amistoso para el amigo Virata: al ver que no funcionaba el Supports tal como se escribió originalmente lo mínimo era consultar la ayuda acerca de la función en donde te hubieras dado cuenta de inmediato del uso correcto. // Saludos |
|
#7
|
|||
|
|||
|
Acepto el regaño de buen grado
.Las prisas nunca son buenas consejeras. Gracias de nuevo y perdonad las molestias.Salu22222 |
![]() |
| Herramientas | Buscar en Tema |
| Desplegado | |
|
|
|