Page 1 of 2
Clase TActiveX mejorada y RibbonBar más fácil
Posted: Tue Apr 07, 2009 7:42 am
by Antonio Linares
Gracias a las pruebas que estamos haciendo estos dias con el RibbonBar de CodeJock, hemos mejorado la Clase TActiveX para que automaticamente use objetos TOleAuto en los eventos, por lo que el uso del RibbonBar es mucho más simple y fácil
Aqui teneis un ejemplo de uso. Fijaros en la forma en que oControl se obtiene desde RibbonBarEvent():
Code: Select all
#include "FiveWin.ch"
#define xtpControlButton 1
#define xtpFlagRightAlign 1
#define ID_ADDTAB 10
#define ID_ADDGROUP 20
#define ID_ADDBUTTON 30
static oRb
function Main()
local oWnd, oAct, oMenu, oTabs, oGroups, oControls
DEFINE WINDOW oWnd TITLE "Visual RibbonBar"
@ 0, 0 ACTIVEX oAct PROGID "Codejock.CommandBarsFrame.12.1.1" OF oWnd SIZE 0, 0
oAct:bOnEvent = { | cEvent, aParams | RibbonBarEvent( cEvent, aParams ) }
oAct:Do( "AttachToWindow", oWnd:hWnd )
oRb = oAct:Do( "AddRibbonBar", "fwh" )
oMenu = oRb:Controls:Add( 2, 0, "Menu" )
oMenu:Flags = xtpFlagRightAlign
oTabs = oMenu:CommandBar:Controls:Add( 2, 0, "Tabs" )
oTabs:CommandBar:Controls:Add( 1, ID_ADDTAB, "Add" )
oGroups = oMenu:CommandBar:Controls:Add( 3, 0, "Groups" )
oGroups:CommandBar:Controls:Add( 1, ID_ADDGROUP, "Add" )
oControls = oMenu:CommandBar:Controls:Add( 3, 0, "Controls" )
oControls:CommandBar:Controls:Add( 1, ID_ADDBUTTON, "Add Button" )
ACTIVATE WINDOW oWnd
return nil
function RibbonBarEvent( cEvent, aParams )
local oControl, oTab, oGroup, oItem
do case
case cEvent == "Execute"
oControl = aParams[ 1 ]
do case
case oControl:Id == ID_ADDTAB
oControl = oRb:InsertTab( oRb:TabCount + 1, "Tab " + AllTrim( Str( oRb:TabCount + 1 ) ) )
oControl:Id = oRb:TabCount
oControl:Selected = .T.
case oControl:Id == ID_ADDGROUP
if oRb:TabCount > 0
oGroup = oRb:SelectedTab:Groups:AddGroup( "Group " + AllTrim( Str( oRb:SelectedTab:Groups:GroupCount + 1 ) ),;
( oRb:SelectedTab:Index * 10 ) + oRb:SelectedTab:Groups:GroupCount + 1 )
endif
case oControl:Id == ID_ADDBUTTON
if oRb:SelectedTab:Groups:GroupCount > 0
oGroup = oRb:FindGroup( ( oRb:SelectedTab:Index * 10 ) + oRb:SelectedTab:Groups:GroupCount )
oItem = oGroup:Add( xtpControlButton, 1, nil )
oItem:Caption = "Button " + AllTrim( Str( oGroup:Count ) )
endif
otherwise
if ! Empty( oControl:Caption )
MsgInfo( oControl:Caption )
endif
endcase
endcase
return nil
Re: Clase TActiveX mejorada y RibbonBar más fácil
Posted: Tue Apr 07, 2009 8:26 am
by Antonio Linares
Dinamicamente inspeccionando los controles del RibbonBar:
RibonBar.prg
Code: Select all
#include "FiveWin.ch"
#define xtpControlButton 1
#define xtpFlagRightAlign 1
#define ID_ADDTAB 10
#define ID_ADDGROUP 20
#define ID_ADDBUTTON 30
static oRb
function Main()
local oWnd, oAct, oMenu, oTabs, oGroups, oControls
DEFINE WINDOW oWnd TITLE "Visual RibbonBar"
@ 0, 0 ACTIVEX oAct PROGID "Codejock.CommandBarsFrame.12.1.1" OF oWnd SIZE 0, 0
oAct:bOnEvent = { | cEvent, aParams | RibbonBarEvent( cEvent, aParams ) }
oAct:Do( "AttachToWindow", oWnd:hWnd )
oRb = oAct:Do( "AddRibbonBar", "fwh" )
oMenu = oRb:Controls:Add( 2, 0, "Menu" )
oMenu:Flags = xtpFlagRightAlign
oTabs = oMenu:CommandBar:Controls:Add( 2, 0, "Tabs" )
oTabs:CommandBar:Controls:Add( 1, ID_ADDTAB, "Add" )
oGroups = oMenu:CommandBar:Controls:Add( 2, 0, "Groups" )
oGroups:CommandBar:Controls:Add( 1, ID_ADDGROUP, "Add" )
oControls = oMenu:CommandBar:Controls:Add( 2, 0, "Controls" )
oControls:CommandBar:Controls:Add( 1, ID_ADDBUTTON, "Add Button" )
ACTIVATE WINDOW oWnd
return nil
function RibbonBarEvent( cEvent, aParams )
local oControl, oTab, oGroup, oItem
do case
case cEvent == "Execute"
oControl = aParams[ 1 ]
do case
case oControl:Id == ID_ADDTAB
oControl = oRb:InsertTab( oRb:TabCount + 1, "Tab " + AllTrim( Str( oRb:TabCount + 1 ) ) )
oControl:Id = oRb:TabCount
oControl:Selected = .T.
case oControl:Id == ID_ADDGROUP
if oRb:TabCount > 0
oRb:SelectedTab:Groups:AddGroup( "Group " + AllTrim( Str( oRb:SelectedTab:Groups:GroupCount + 1 ) ),;
( oRb:SelectedTab:Index * 10 ) + oRb:SelectedTab:Groups:GroupCount + 1 )
endif
case oControl:Id == ID_ADDBUTTON
if oRb:TabCount == 0
oControl = oRb:InsertTab( oRb:TabCount + 1, "Tab " + AllTrim( Str( oRb:TabCount + 1 ) ) )
oControl:Id = oRb:TabCount
oControl:Selected = .T.
endif
if oRb:SelectedTab:Groups:GroupCount == 0
oRb:SelectedTab:Groups:AddGroup( "Group " + AllTrim( Str( oRb:SelectedTab:Groups:GroupCount + 1 ) ),;
( oRb:SelectedTab:Index * 10 ) + oRb:SelectedTab:Groups:GroupCount + 1 )
endif
if oRb:SelectedTab:Groups:GroupCount > 0
oGroup = oRb:FindGroup( ( oRb:SelectedTab:Index * 10 ) + oRb:SelectedTab:Groups:GroupCount )
oItem = oGroup:Add( xtpControlButton, 1, nil )
oItem:Caption = "Button " + AllTrim( Str( oGroup:Count ) )
endif
otherwise
if ! Empty( oControl:Caption )
ControlInspect( oControl )
endif
endcase
endcase
return nil
function ControlInspect( oControl )
local oDlg, cCaption := PadR( oControl:Caption, 30 )
DEFINE DIALOG oDlg TITLE "Control Properties" SIZE 300, 300
@ 0.9, 1 SAY "Caption:"
@ 1, 4 GET cCaption VALID ( oControl:Caption := AllTrim( cCaption ), .T. )
@ 1.9, 1 SAY "Width:"
@ 2.2, 4 GET oControl:Width SIZE 25, 12
@ 1.9, 12 SAY "Height:"
@ 2.2, 12 GET oControl:Height SIZE 25, 12
ACTIVATE DIALOG oDlg CENTERED
return nil
Re: Clase TActiveX mejorada y RibbonBar más fácil
Posted: Tue Apr 07, 2009 2:57 pm
by Antonio Linares
Code: Select all
#include "FiveWin.ch"
#define xtpControlButton 1
#define xtpFlagRightAlign 1
#define xtpImageNormal 0
#define xtpImageDisabled 1
#define xtpImageHot 2
#define xtpImageChecked 3
#define xtpImagePressed 4
#define ID_ADDTAB 10
#define ID_ADDGROUP 20
#define ID_ADDBUTTON 30
#define ID_ADDIMAGE 40
static oIcons, oRb
function Main()
local oWnd, oAct, oMenu, oTabs, oGroups, oControls, oImages
DEFINE WINDOW oWnd TITLE "Visual RibbonBar"
@ 0, 0 ACTIVEX oAct PROGID "Codejock.CommandBarsFrame.12.1.1" OF oWnd SIZE 0, 0
oAct:bOnEvent = { | cEvent, aParams | RibbonBarEvent( cEvent, aParams ) }
oAct:Do( "AttachToWindow", oWnd:hWnd )
oIcons = oAct:Do( "icons" )
oRb = oAct:Do( "AddRibbonBar", "fwh" )
oMenu = oRb:Controls:Add( 2, 0, "Menu" )
oMenu:Flags = xtpFlagRightAlign
oTabs = oMenu:CommandBar:Controls:Add( 2, 0, "Tabs" )
oTabs:CommandBar:Controls:Add( 1, ID_ADDTAB, "Add" )
oGroups = oMenu:CommandBar:Controls:Add( 2, 0, "Groups" )
oGroups:CommandBar:Controls:Add( 1, ID_ADDGROUP, "Add" )
oControls = oMenu:CommandBar:Controls:Add( 2, 0, "Controls" )
oControls:CommandBar:Controls:Add( 1, ID_ADDBUTTON, "Add Button" )
oImages = oMenu:CommandBar:Controls:Add( 2, 0, "Images" )
oImages:CommandBar:Controls:Add( 1, ID_ADDIMAGE, "Load Image" )
ACTIVATE WINDOW oWnd
return nil
function RibbonBarEvent( cEvent, aParams )
local oControl, oTab, oGroup, oItem, cBmpFile
do case
case cEvent == "Execute"
oControl = aParams[ 1 ]
do case
case oControl:Id == ID_ADDTAB
oControl = oRb:InsertTab( oRb:TabCount + 1, "Tab " + AllTrim( Str( oRb:TabCount + 1 ) ) )
oControl:Id = oRb:TabCount
oControl:Selected = .T.
case oControl:Id == ID_ADDGROUP
if oRb:TabCount > 0
oRb:SelectedTab:Groups:AddGroup( "Group " + AllTrim( Str( oRb:SelectedTab:Groups:GroupCount + 1 ) ),;
( oRb:SelectedTab:Index * 10 ) + oRb:SelectedTab:Groups:GroupCount + 1 )
endif
case oControl:Id == ID_ADDBUTTON
if oRb:TabCount == 0
oControl = oRb:InsertTab( oRb:TabCount + 1, "Tab " + AllTrim( Str( oRb:TabCount + 1 ) ) )
oControl:Id = oRb:TabCount
oControl:Selected = .T.
endif
if oRb:SelectedTab:Groups:GroupCount == 0
oRb:SelectedTab:Groups:AddGroup( "Group " + AllTrim( Str( oRb:SelectedTab:Groups:GroupCount + 1 ) ),;
( oRb:SelectedTab:Index * 10 ) + oRb:SelectedTab:Groups:GroupCount + 1 )
endif
if oRb:SelectedTab:Groups:GroupCount > 0
oGroup = oRb:FindGroup( ( oRb:SelectedTab:Index * 10 ) + oRb:SelectedTab:Groups:GroupCount )
oItem = oGroup:Add( xtpControlButton, 1, nil )
oItem:Caption = "Button " + AllTrim( Str( oGroup:Count ) )
endif
case oControl:Id = ID_ADDIMAGE
cBmpFile = cGetFile( "*.bmp", "Please select a BMP file" )
if File( cBmpFile )
MsgInfo( oIcons:Count + 1 )
oIcons:LoadBitmap( cBmpFile, oIcons:Count + 1, xtpImageNormal )
endif
otherwise
if ! Empty( oControl:Caption )
ControlInspect( oControl )
endif
endcase
endcase
return nil
function ControlInspect( oControl )
local oDlg, cCaption := PadR( oControl:Caption, 30 )
DEFINE DIALOG oDlg TITLE "Control Properties" SIZE 300, 300
@ 0.9, 1 SAY "Caption:"
@ 1, 4 GET cCaption VALID ( oControl:Caption := AllTrim( cCaption ), .T. )
@ 1.9, 1 SAY "Width:"
@ 2.2, 4 GET oControl:Width SIZE 25, 12
@ 1.9, 12 SAY "Height:"
@ 2.2, 12 GET oControl:Height SIZE 25, 12
@ 2.9, 1 SAY "Icon Id:"
@ 3.4, 4 GET oControl:IconId SIZE 25, 12
ACTIVATE DIALOG oDlg CENTERED
return nil
Re: Clase TActiveX mejorada y RibbonBar más fácil
Posted: Tue Apr 07, 2009 3:04 pm
by Antonio Linares
Una Clase TActiveX modificada y ampliada es necesaria para estos ejemplos.
Esta Clase la incluiremos en FWH 9.04.
Posiblemente publiquemos ya una versión preliminar de FWH 9.04 con _, para que podais empezar a usarlos
Re: Clase TActiveX mejorada y RibbonBar más fácil
Posted: Tue Apr 07, 2009 9:13 pm
by Antonio Linares
Re: Clase TActiveX mejorada y RibbonBar más fácil
Posted: Tue Apr 07, 2009 11:29 pm
by Antonio Linares
Editando el texto del Tab y del Grupo:
Podeis descargarlo y probarlo desde aqui:
http://www.mediafire.com/?sharekey=d045 ... 8114394287
Code: Select all
#include "FiveWin.ch"
#define xtpControlButton 1
#define xtpFlagRightAlign 1
#define xtpImageNormal 0
#define xtpImageDisabled 1
#define xtpImageHot 2
#define xtpImageChecked 3
#define xtpImagePressed 4
#define ID_ADDTAB 10
#define ID_ADDGROUP 20
#define ID_ADDBUTTON 30
#define ID_ADDIMAGE 40
static oIcons, oRb
function Main()
local oWnd, oAct, oMenu, oTabs, oGroups, oControls, oImages
if ! IsActiveX( "Codejock.CommandBars.v13.0.0.Demo.ocx" )
RegisterServer( "Codejock.CommandBars.v13.0.0.Demo.ocx" )
endif
DEFINE WINDOW oWnd TITLE "Visual RibbonBar"
@ 0, 0 ACTIVEX oAct PROGID "Codejock.CommandBarsFrame.13.0.0" OF oWnd SIZE 0, 0
oAct:bOnEvent = { | cEvent, aParams | RibbonBarEvent( cEvent, aParams ) }
oAct:Do( "AttachToWindow", oWnd:hWnd )
oIcons = oAct:Do( "icons" )
oRb = oAct:Do( "AddRibbonBar", "fwh" )
oMenu = oRb:Controls:Add( 2, 0, "Menu" )
oMenu:Flags = xtpFlagRightAlign
oTabs = oMenu:CommandBar:Controls:Add( 2, 0, "Tabs" )
oTabs:CommandBar:Controls:Add( 1, ID_ADDTAB, "Add" )
oGroups = oMenu:CommandBar:Controls:Add( 2, 0, "Groups" )
oGroups:CommandBar:Controls:Add( 1, ID_ADDGROUP, "Add" )
oControls = oMenu:CommandBar:Controls:Add( 2, 0, "Controls" )
oControls:CommandBar:Controls:Add( 1, ID_ADDBUTTON, "Add Button" )
oImages = oMenu:CommandBar:Controls:Add( 2, 0, "Images" )
oImages:CommandBar:Controls:Add( 1, ID_ADDIMAGE, "Load Image" )
ACTIVATE WINDOW oWnd
return nil
function RibbonBarEvent( cEvent, aParams )
local oControl, oTab, oGroup, oItem, cBmpFile
do case
case cEvent == "Execute"
oControl = aParams[ 1 ]
do case
case oControl:Id == ID_ADDTAB
oControl = oRb:InsertTab( oRb:TabCount + 1, "Tab " + AllTrim( Str( oRb:TabCount + 1 ) ) )
oControl:Id = oRb:TabCount
oControl:Selected = .T.
case oControl:Id == ID_ADDGROUP
if oRb:TabCount > 0
oRb:SelectedTab:Groups:AddGroup( "Group " + AllTrim( Str( oRb:SelectedTab:Groups:GroupCount + 1 ) ),;
( oRb:SelectedTab:Index * 10 ) + oRb:SelectedTab:Groups:GroupCount + 1 )
endif
case oControl:Id == ID_ADDBUTTON
if oRb:TabCount == 0
oControl = oRb:InsertTab( oRb:TabCount + 1, "Tab " + AllTrim( Str( oRb:TabCount + 1 ) ) )
oControl:Id = oRb:TabCount
oControl:Selected = .T.
endif
if oRb:SelectedTab:Groups:GroupCount == 0
oRb:SelectedTab:Groups:AddGroup( "Group " + AllTrim( Str( oRb:SelectedTab:Groups:GroupCount + 1 ) ),;
( oRb:SelectedTab:Index * 10 ) + oRb:SelectedTab:Groups:GroupCount + 1 )
endif
if oRb:SelectedTab:Groups:GroupCount > 0
oGroup = oRb:FindGroup( ( oRb:SelectedTab:Index * 10 ) + oRb:SelectedTab:Groups:GroupCount )
oItem = oGroup:Add( xtpControlButton, 1, nil )
oItem:Caption = "Button " + AllTrim( Str( oGroup:Count ) )
endif
case oControl:Id = ID_ADDIMAGE
cBmpFile = cGetFile( "*.bmp", "Please select a BMP file" )
if File( cBmpFile )
MsgInfo( oIcons:Count + 1 )
oIcons:LoadBitmap( cBmpFile, oIcons:Count + 1, xtpImageNormal )
endif
otherwise
if ! Empty( oControl:Caption )
ControlInspect( oControl )
endif
endcase
endcase
return nil
function ControlInspect( oControl )
local oDlg, cCaption := PadR( oControl:Caption, 30 )
local cTabCaption := PadR( oRb:SelectedTab:Caption, 30 )
local cGrpCaption := PadR( oControl:RibbonGroup:Caption, 30 )
DEFINE DIALOG oDlg TITLE "Control Properties" SIZE 300, 300
@ 0.9, 1 SAY "Caption:"
@ 1, 4 GET cCaption VALID ( oControl:Caption := AllTrim( cCaption ), .T. )
@ 1.9, 1 SAY "Width:"
@ 2.2, 4 GET oControl:Width SIZE 25, 12
@ 1.9, 12 SAY "Height:"
@ 2.2, 12 GET oControl:Height SIZE 25, 12
@ 2.9, 1 SAY "Icon Id:"
@ 3.4, 4 GET oControl:IconId SIZE 25, 12
@ 4.9, 1 SAY "Tab caption:"
@ 5.6, 5.3 GET cTabCaption VALID ( oRb:SelectedTab:Caption := AllTrim( cTabCaption ), .T. ) SIZE 100, 12
@ 5.7, 1 SAY "Group caption:"
@ 6.6, 5.3 GET cGrpCaption VALID ( oControl:RibbonGroup:Caption := AllTrim( cGrpCaption ), oRb:RedrawBar(), .T. ) SIZE 100, 12
@ 7, 10 BUTTON "Ok" ACTION oDlg:End()
ACTIVATE DIALOG oDlg CENTERED
return nil
Re: Clase TActiveX mejorada y RibbonBar más fácil
Posted: Wed Apr 08, 2009 12:05 am
by Cgallegoa
Hola Antonio,
Ya encaramelados con Codejock, podrías darme alguna pista de cómo usar TASKPANEL de Codejock. Le doy por todos los lados, y aunque no me sale error no pinta nada. Tengo FWH 8.07
Un abrazo,
Carlos Gallego
Re: Clase TActiveX mejorada y RibbonBar más fácil
Posted: Wed Apr 08, 2009 12:25 am
by Antonio Linares
Carlos,
Ni sabia que existiese
Como la usas ? Pon algunos ejemplos que podamos probar
Re: Clase TActiveX mejorada y RibbonBar más fácil
Posted: Wed Apr 08, 2009 12:37 am
by Cgallegoa
Antonio,
Code: Select all
#include "FiveWin.ch"
function Main()
local oWnd
local oTaskP, oGrps
LOCAL oMenu
MENU oMenu
ENDMENU
DEFINE WINDOW oWnd TITLE "FWH Support Codejock ActiveX" MENU oMenu // MDI
oTaskP := TActiveX():New( oWnd, "Codejock.TaskPanel.12.1.1", 0, 0, 0, 0 )
oGrps := oTaskP:Do( "Visisble",.T.)
oGrps := oTaskP:Do( "Enable",.T.)
oGrps := oTaskP:Do( "Expandable",.T.)
oGrps := oTaskP:Do( "Groups")
oItGr1 := oGrps:Add(0,"Uno")
oItGr1:Caption := "Dificil"
oItGr1:Special := .T.
xxx := oItGr1:Items:Add(1,"Uno",1,1)
oItGr1:Items:Add(1,"Uno",1,2)
MsgInfo(ValType(xxx))
oItGr2 := oGrps:Add(1,"Dos")
oItGr3 := oGrps:Add(2,"Tres")
ACTIVATE WINDOW oWnd
return nil
Saludos,
Carlos Gallego
Re: Clase TActiveX mejorada y RibbonBar más fácil
Posted: Wed Apr 08, 2009 12:40 am
by Cgallegoa
También he probado SKINFRAMEWORK, inclusive la combiné con RIBBONBAR, y funciona perfecto !!! en XP y en vista
Re: Clase TActiveX mejorada y RibbonBar más fácil
Posted: Wed Apr 08, 2009 12:48 am
by Cgallegoa
Realmente Codejock es excepcional. El único problema es que su manual es super difícil de enterder para los que no manejamos Visual Basic.
Si nos dieras una buena guía de cómo manejar los objetos en esta OCX estaríamos hechos en cuanto a mejorar sensiblemente la presentación y diseño de nuestras aplicaciones, y, de esta forma, lograrías una excelente dupleta entra FiveWin y Codejock en beneficio de la comunidad fivewinera.
Saludos,
Carlos Gallego
Re: Clase TActiveX mejorada y RibbonBar más fácil
Posted: Wed Apr 08, 2009 8:58 am
by Antonio Linares
Carlos,
Yo ni siquiera he mirado el manual
Desde Microsoft Word, abres VBA (Visual Basic for Applications) y tiene un inspector de classes. Y ahi puedes ir viendo datos, metodos y eventos. Es bastante intuitivo
Re: Clase TActiveX mejorada y RibbonBar más fácil
Posted: Wed Apr 08, 2009 9:36 am
by Antonio Linares
Carlos,
Mira a ver si soporta este método:
oActiveX:Do( "AttachToWindow", oWnd:hWnd )
Re: Clase TActiveX mejorada y RibbonBar más fácil
Posted: Wed Apr 08, 2009 12:24 pm
by Rossine
Antonio,
Seria possível incluir estas mudanças activex na versão de 9.01 ?
Re: Clase TActiveX mejorada y RibbonBar más fácil
Posted: Wed Apr 08, 2009 3:59 pm
by Cgallegoa
Antonio,
Si soporta oActiveX:Do( "AttachToWindow", oWnd:hWnd ), pero igual no pinta nada
Vale la pena que veas el manual "SymbolReference.chm".
He revisado con VBA, pero igual, no encuentro por dónde hacerla funcionar, me quedó grande