Muy mejorada Clase TActiveX !!!

Muy mejorada Clase TActiveX !!!

Postby Antonio Linares » Sat Apr 18, 2009 12:51 am

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  

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

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

Re: Muy mejorada Clase TActiveX !!!

Postby Cgallegoa » Sat Apr 18, 2009 2:25 am

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
Saludos,

Carlos Gallego

*** FWH-23.10, xHarbour 1.2.3 Build 20190603, Borland C++7.30, PellesC ***
Cgallegoa
 
Posts: 414
Joined: Sun Oct 16, 2005 3:32 am
Location: Quito - Ecuador

Re: Muy mejorada Clase TActiveX !!!

Postby Antonio Linares » Sat Apr 18, 2009 8:41 am

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
User avatar
Antonio Linares
Site Admin
 
Posts: 41314
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Muy mejorada Clase TActiveX !!!

Postby csincuir » Sat Apr 18, 2009 12:39 pm

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
csincuir
 
Posts: 396
Joined: Sat Feb 03, 2007 6:36 am
Location: Guatemala

Re: Muy mejorada Clase TActiveX !!!

Postby Antonio Linares » Sat Apr 18, 2009 3:18 pm

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

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

Re: Muy mejorada Clase TActiveX !!!

Postby Cgallegoa » Sat Apr 18, 2009 8:54 pm

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
Saludos,

Carlos Gallego

*** FWH-23.10, xHarbour 1.2.3 Build 20190603, Borland C++7.30, PellesC ***
Cgallegoa
 
Posts: 414
Joined: Sun Oct 16, 2005 3:32 am
Location: Quito - Ecuador

Re: Muy mejorada Clase TActiveX !!!

Postby Antonio Linares » Sat Apr 18, 2009 11:32 pm

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: 41314
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Muy mejorada Clase TActiveX !!!

Postby Antonio Linares » Sun Apr 19, 2009 6:24 pm

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
User avatar
Antonio Linares
Site Admin
 
Posts: 41314
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Muy mejorada Clase TActiveX !!!

Postby El Loco » Mon Apr 20, 2009 3:46 pm

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 =>))
FWH 32/64 14.04
Harbour 3.2.0 (r1306211258)
PellesC
El Loco
 
Posts: 328
Joined: Fri May 19, 2006 4:08 pm
Location: Buenos Aires - Argentina

Re: Muy mejorada Clase TActiveX !!!

Postby carlos vargas » Mon Apr 20, 2009 4:11 pm

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)
User avatar
carlos vargas
 
Posts: 1686
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 91 guests