FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Muy mejorada Clase TActiveX !!!
Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM
Muy mejorada Clase TActiveX !!!
Posted: 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 (fw): Select all Collapse
// 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
Posts: 514
Joined: Sun Oct 16, 2005 03:32 AM
Re: Muy mejorada Clase TActiveX !!!
Posted: Sat Apr 18, 2009 02: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. :-)

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. :-)

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-25.12, xHarbour 1.3.1 Build 20241008, Borland C++7.70, PellesC, ADS 11.1***

Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM
Re: Muy mejorada Clase TActiveX !!!
Posted: Sat Apr 18, 2009 08: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
Posts: 476
Joined: Sat Feb 03, 2007 06:36 AM
Re: Muy mejorada Clase TActiveX !!!
Posted: 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

Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM
Re: Muy mejorada Clase TActiveX !!!
Posted: Sat Apr 18, 2009 03:18 PM

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

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 514
Joined: Sun Oct 16, 2005 03:32 AM
Re: Muy mejorada Clase TActiveX !!!
Posted: Sat Apr 18, 2009 08: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.[/list:u]
    2.- Otra pregunta:

    Porqu茅 funciona bien con esta instrucci贸n :
    Code (fw): Select all Collapse
     聽 聽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 (fw): Select all Collapse
     聽 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-25.12, xHarbour 1.3.1 Build 20241008, Borland C++7.70, PellesC, ADS 11.1***

Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM
Re: Muy mejorada Clase TActiveX !!!
Posted: 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
Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM
Re: Muy mejorada Clase TActiveX !!!
Posted: Sun Apr 19, 2009 06: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
Posts: 328
Joined: Fri May 19, 2006 04:08 PM
Re: Muy mejorada Clase TActiveX !!!
Posted: Mon Apr 20, 2009 03: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
Posts: 1789
Joined: Tue Oct 11, 2005 05:01 PM
Re: Muy mejorada Clase TActiveX !!!
Posted: Mon Apr 20, 2009 04: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)

Continue the discussion