Muy mejorada Clase TActiveX !!!

Post Reply
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Muy mejorada Clase TActiveX !!!

Post by Antonio Linares »

Hemos mejorado mucho la Clase TActiveX de FWH por lo que ahora no hay necesidad de usar Do(), SetProp() y GetProp(), aunque mantiene completa compatibilidad con el codigo anterior :-)

Ahora podeis enviarle mensajes directamente al objeto ActiveX, por ejemplo:

oRb = oActiveX:AddRibbonBar( "first" )
or
oSettings = oActiveX:GlobalSettings
or
oActiveX:AnyProp = ...

El codigo fuente ha quedado tan bonito, que hemos decidido publicarla aqui, para que empeceis a usarla :-)

Code: Select all

// FiveWin ActiveX support (32/64 bits only)
// (c) FiveTech Software, todos los derechos reservados

#include "FiveWin.ch"

#define  HKEY_CLASSES_ROOT       2147483648

//----------------------------------------------------------------------------//

CLASS TActiveX FROM TControl

   CLASSDATA lRegistered AS LOGICAL

   DATA   hActiveX
   DATA   cProgID
   DATA   cString
   DATA   aProperties, aMethods, aEvents
   DATA   bOnEvent
   DATA   oOleAuto

   METHOD New( oWnd, cProgID, nRow, nCol, nWidth, nHeight ) CONSTRUCTOR

   METHOD ReDefine( nId, oWnd, cProgID ) CONSTRUCTOR

   METHOD Do( cMethodName, uParam1, uParam2, uParam3, uParam4, uParam5 )

   METHOD Display() INLINE ::BeginPaint(), ::Paint(), ::EndPaint(), 0

   METHOD EraseBkGnd( hDC ) INLINE 1

   METHOD GetProp( cPropName ) INLINE __ObjSendMsg( ::oOleAuto, cPropName )

   METHOD Initiate( hDlg )
   
   METHOD OnEvent( nEvent, aParams )

   METHOD ReadTypes()

   METHOD ReSize( nFlags, nWidth, nHeight ) INLINE ;
             ActXSetLocation( ::hActiveX, 0, 0, nWidth, nHeight )

   METHOD SetProp( cPropName, uParam1 ) INLINE __ObjSendMsg( ::oOleAuto, cPropName, uParam1 )
             
   METHOD Destroy() INLINE ActXEnd( ::hActiveX ), Super:Destroy()   
   
   ERROR HANDLER OnError( uParam1 )       
             
ENDCLASS

//----------------------------------------------------------------------------//

METHOD New( oWnd, cProgID, nRow, nCol, nWidth, nHeight ) CLASS TActiveX

   DEFAULT oWnd := GetWndDefault(), nRow := 0, nCol := 0, nWidth := 200,;
           nHeight := 200

   ::nTop    = nRow
   ::nLeft   = nCol
   ::nBottom = nRow + nHeight
   ::nRight  = nCol + nWidth
   ::oWnd    = oWnd
   ::nId     = ::GetNewId()
   ::nStyle  = nOR( WS_CHILD, WS_VISIBLE, WS_TABSTOP )
   ::cProgID = cProgID
   ::cString = ActXString( cProgID )

   ::Register()

   if ! Empty( oWnd:hWnd )
      ::Create()
      oWnd:AddControl( Self )
      ::hActiveX = CreateActiveX( ::hWnd, cProgID, Self )
      ::oOleAuto = TOleAuto():New( ActXPdisp( ::hActiveX ) )
      ::nTop = nRow
      ::nLeft = nCol
      ::nWidth = nWidth
      ::nHeight = nHeight
      ::ReadTypes()
   else
      oWnd:DefControl( Self )
   endif

return Self

//----------------------------------------------------------------------------//

METHOD Do( ... ) CLASS TActiveX

#ifndef __XHARBOUR__
   return __ObjSendMsg( ::oOleAuto, ... )
#else
   local aParams := hb_aParams()

   AIns( aParams, 1, ::oOleAuto, .T. )

   return hb_execFromArray( @__ObjSendMsg(), aParams )   
#endif   

//----------------------------------------------------------------------------//

METHOD ReDefine( nId, oWnd, cProgID ) CLASS TActiveX

   DEFAULT oWnd := GetWndDefault()
   
   ::nId     = nId
   ::oWnd    = oWnd
   ::cProgID = cProgID
   ::cString = ActXString( cProgID )

   ::Register( nOR( CS_VREDRAW, CS_HREDRAW ) )
   
   oWnd:DefControl( Self )

return Self

//----------------------------------------------------------------------------//

METHOD Initiate( hDlg ) CLASS TActiveX

   Super:Initiate( hDlg )

   ::hActiveX = CreateActiveX( ::hWnd, ::cProgID, Self )
   ::oOleAuto = TOleAuto():New( ActXPdisp( ::hActiveX ) )
   ::ReadTypes()

return nil

//----------------------------------------------------------------------------//

METHOD OnEvent( nEvent, aParams ) CLASS TActiveX

   local nAt := AScan( ::aEvents, { | aEvent | aEvent[ 2 ] == nEvent } )
   local cEvent := If( nAt != 0, ::aEvents[ nAt ][ 1 ], "" )
   
   if ! Empty( ::bOnEvent )
      Eval( ::bOnEvent, If( ! Empty( cEvent ), cEvent, nEvent ), aParams )
   endif   

return nil

//----------------------------------------------------------------------------//

METHOD ReadTypes() CLASS TActiveX

   local oReg := TReg32():New( HKEY_CLASSES_ROOT, "CLSID\" + ::cString + ;
                               "\InprocServer32" )
   local cTypeLib := oReg:Get( "" )

   oReg:Close()
   
   if ! Empty( cTypeLib ) .and. File( cTypeLib )
      ::aEvents = ActXEvents( cTypeLib, ::hActiveX )
   endif   

return nil

//----------------------------------------------------------------------------//

METHOD OnError( ... ) CLASS TActiveX

#ifndef __XHARBOUR__
   return __ObjSendMsg( ::oOleAuto, __GetMessage(), ... )
#else
   local aParams := hb_aParams()

   AIns( aParams, 1, ::oOleAuto, .T. )
   AIns( aParams, 2, __GetMessage(), .T. )   

   return hb_execFromArray( @__ObjSendMsg(), aParams )   
#endif   

//----------------------------------------------------------------------------//
regards, saludos

Antonio Linares
www.fivetechsoft.com
Cgallegoa
Posts: 335
Joined: Sun Oct 16, 2005 3:32 am
Location: Quito - Ecuador
Contact:

Re: Muy mejorada Clase TActiveX !!!

Post by Cgallegoa »

Antonio,

Formidable.

Tengo FWH 8.07, xHarbour 1.1.0 PCode 9 y Borland 5.51.

Ya estoy super avanzado en una nueva aplicación basada totalmente en CodeJock (RibbonBar, TasPanel, Skinners y Calendar) y acceso a MySql en Internet. :D

Aunque ha sido muy difícil el manejo de los Objetos, Methods, Propiedades y Eventos de CodeJock, y ni hablar del manual (demasiado complejo y poco explicativo), voy avanzado y me está quedando con una presentación de maravilla. :lol:

He provado con la nueva versión de TActivex que publicas en este hilo, y me generó error al linkear:
error: Unresolved external symbol '_HB_FUN_ACTXEND referenced from (activex.obj)

Bajé "ActX.obj" de link que indicaste en este hilo: http://forums.fivetechsupport.com/viewt ... it=actxend

Linkie los dos archivos (el nuevo TActivex.prg y Actx.obj) a mi aplicación y funcionó perfecto.

Pero..... Al salir me genera este error : Destructors disabled! Destructor of class: 'TOLEAUTO' can't be executed.
que antes no salía. Cómo puedo corregirlo.? :?

Saludos y gracias,

Carlos Gallego
Saludos,

Carlos Gallego

*** FWH-20.07, xHarbour 1.2.3 Build 20190603, Borland C++7.30, PellesC ***
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: Muy mejorada Clase TActiveX !!!

Post by Antonio Linares »

Carlos,

Prueba a hacer:

oActiveX:oOleAuto = nil

cuando termines de usar el ActiveX.

Con las versiones recientes de Harbour y xHarbour no es necesario.
regards, saludos

Antonio Linares
www.fivetechsoft.com
csincuir
Posts: 305
Joined: Sat Feb 03, 2007 6:36 am
Location: Guatemala
Contact:

Re: Muy mejorada Clase TActiveX !!!

Post by csincuir »

Qué buenas noticias Antonio, felicitaciones!!
Ahora solo nos toca estudiar mas sobre los ActiveX, y aprovechar otras herramientas como bien lo ha hecho mi tocayo Carlos Gallego.

Saludos cordiales.

Carlos Sincuir
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: Muy mejorada Clase TActiveX !!!

Post by Antonio Linares »

Hemos publicado un nuevo build de FWH 9.04 con estas importantes mejoras :-)
regards, saludos

Antonio Linares
www.fivetechsoft.com
Cgallegoa
Posts: 335
Joined: Sun Oct 16, 2005 3:32 am
Location: Quito - Ecuador
Contact:

Re: Muy mejorada Clase TActiveX !!!

Post by Cgallegoa »

Antonio,
oActiveX:oOleAuto = nil
1. - Lo puse al final de la apliación, cuando cierra la ventana principal, que es cuando deja de usar el Activex.

Sigue saliendo el mismo error:
  • Destructors disabled! Destructor of class: 'TOLEAUTO' can't be executed.
2.- Otra pregunta:

Porqué funciona bien con esta instrucción :

Code: Select all

    oAct := TActiveX():New( oWnd, "Codejock.CommandBarsFrame.12.1.0", 0, 0, 0, 0 )
   oSettings := oAct:GetProp( "GlobalSettings" )
   oSettings:Title := "Prueba1"
   MsgInfo( oSettings:Title )    // Funciona BIEN
pero falla con esta otra:

Code: Select all

   oActXCal := TActiveX():New(oDlg,"Codejock.CalendarControl.12.1.0",2,1,760,281)
  oSettCal := oActXCal:GetProp( "GlobalSettings" )
  oSettCal:Title := "Prueba2"
  MsgInfo(oSettCal:Title)
Ambos, CommandBarsFrame y CalendarControl son controles que devuelven un objeto, y cada uno tiene entre sus propiedades :Title.

Porqué el primero acepta la instrucción ...:GetProp( "GlobalSettings" ) , y el segundo no, si en ambos exite la propiedad "GlobalSettings" ?. La verdad es que ando más enredado que una bolsa de anzuelos :?

Saludos,

Carlos Gallego
Saludos,

Carlos Gallego

*** FWH-20.07, xHarbour 1.2.3 Build 20190603, Borland C++7.30, PellesC ***
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: Muy mejorada Clase TActiveX !!!

Post by Antonio Linares »

Carlos,

Por el nombre oDlg parece que estas creando el control sobre un dialogo:

oActXCal := TActiveX():New(oDlg,"Codejock.CalendarControl.12.1.0",2,1,760,281)

en tal caso, el codigo a continuacion solo te funcionara desde la clausula ON INIT del dialogo, que es cuando el ActiveX realmente se inicializa.
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: Muy mejorada Clase TActiveX !!!

Post by Antonio Linares »

Carlos,

Por lo visto, el error "Destructors disabled! Destructor of class: 'TOLEAUTO' can't be executed" ha sido arreglado en las versiones recientes de xHarbour.

Si usas la version 1.2.1 no deberia aparecerte.
regards, saludos

Antonio Linares
www.fivetechsoft.com
El Loco
Posts: 220
Joined: Fri May 19, 2006 4:08 pm

Re: Muy mejorada Clase TActiveX !!!

Post by El Loco »

Antonio Linares wrote:Hemos publicado un nuevo build de FWH 9.04 con estas importantes mejoras :-)
Antonio, los que bajamos el FTDN de Abril, podemos bajarlo sin que se cuente como una bajada mas de las permitidas?
Un abrazo.
El Loco =>))
User avatar
carlos vargas
Posts: 1421
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua

Re: Muy mejorada Clase TActiveX !!!

Post by carlos vargas »

Antonio

una pregunta, :-(, Por que cEvent regresa un valor numerico, aun con esta tactivex.
y mira que me aseguro que estoy usado esta y no la anterior.

uso una demo de xharbour de abril 2009.

salu2
carlos vargas
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
Post Reply