Page 1 of 1

Muy mejorada Clase TActiveX !!!

PostPosted: Sat Apr 18, 2009 12:51 am
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  Expand view

// 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  

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

Re: Muy mejorada Clase TActiveX !!!

PostPosted: Sat Apr 18, 2009 2:25 am
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: viewtopic.php?f=6&t=15146&hilit=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

Re: Muy mejorada Clase TActiveX !!!

PostPosted: Sat Apr 18, 2009 8:41 am
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.

Re: Muy mejorada Clase TActiveX !!!

PostPosted: Sat Apr 18, 2009 12:39 pm
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

Re: Muy mejorada Clase TActiveX !!!

PostPosted: Sat Apr 18, 2009 3:18 pm
by Antonio Linares
Hemos publicado un nuevo build de FWH 9.04 con estas importantes mejoras :-)

Re: Muy mejorada Clase TActiveX !!!

PostPosted: Sat Apr 18, 2009 8:54 pm
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  Expand view
   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  Expand view
  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

Re: Muy mejorada Clase TActiveX !!!

PostPosted: Sat Apr 18, 2009 11:32 pm
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.

Re: Muy mejorada Clase TActiveX !!!

PostPosted: Sun Apr 19, 2009 6:24 pm
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.

Re: Muy mejorada Clase TActiveX !!!

PostPosted: Mon Apr 20, 2009 3:46 pm
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 =>))

Re: Muy mejorada Clase TActiveX !!!

PostPosted: Mon Apr 20, 2009 4:11 pm
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