Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Utilizando COM con delphi (https://www.clubdelphi.com/foros/showthread.php?t=70116)

raulb 30-09-2010 17:20:58

Utilizando COM con delphi
 
Tengo una DLL registrada que me genero un UCBioBSPCOMLib_TLB.pas,
Creo un form y en el uses cito UCBioBSPCOMLib_TLB, hasta ahi todo ok, pero UCBioBSPCOMLib_TLB.pas es una clase con 7 interfaces, en consecuencia cuando la quiero usar

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
scannero : UCBioBSP;
scannerid : IDevice;
{ Private declarations }
public
{ Public declarations }
end;

scannero := CreateComObject(CLASS_UCBioBSP) as UCBioBSP;
hasta aca todo ok, porque puedo acceder a las propiedades y funciones

Pero las funciones que necesito esta en una Interface IDevice y según un ejemplo en VB6 y transformado a delphi debería hacer

scannerid := scannero.device;

y de esa manera comenzar a utilizar las propiedades y funciones de esa interfase, pero ocurre algo curioso :

scannero.device es un Olevariant y no es compatible con el tipo Idevice definido para scannerid

Existe alguna forma de al momento de crear el objeto
createcomobject, se puede crear las demas interfaces ???.

y si no como las inicializo para poder utilizarla ???

Gracias





showmessage(inttostr(scannero._Release));
showmessage(scannero.MajorVersion);
showmessage(scannero.MinorVersion);
scannerid := scannero.
showmessage(inttostr(scannerid.OpenedDeviceID));

Al González 30-09-2010 19:20:13

Cita:

Empezado por raulb (Mensaje 378003)
Pero las funciones que necesito esta en una Interface IDevice y según un ejemplo en VB6 y transformado a delphi debería hacer

scannerid := scannero.device;

y de esa manera comenzar a utilizar las propiedades y funciones de esa interfase, pero ocurre algo curioso :

scannero.device es un Olevariant y no es compatible con el tipo Idevice definido para scannerid

Hola raulb.

Los tipos Variant y OLEVariant sí son compatibles con las interfaces.

La solución es declarar al elemento scannerid como OLEVariant, o bien asignarle scannero.device haciendo un molde de tipo (type casting):

Código Delphi [-]
scannerid := IInterface (scannero.device) As IDevice;

En efecto, aún cuando optes por la primera opción (declarar a scannerid como OLEVariant), podrás tratar a ese campo de la clase como un objeto.

scannerid.PropiedadX := Valor;
scannerid.MetodoX (Parametros);

Además de las expresiones de tipo clase y objeto, Delphi admite esta sintaxis con los valores de tipo Variant / OLEVariant. Claro, siempre que el variante en cuestión contenga una interfaz y la sentencia o expresión sea válida (si la propiedad o método no existe en la interfaz o están mal dados los parámetros, se elevará una excepción al ejecutarse).

Espero sea de utilidad.

Saludos.

Al González. :)


La franja horaria es GMT +2. Ahora son las 04:23:05.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi