Pedro,
la aplicación en donde vas a usar la Ribbon, es MDI ?
De ser asi, entiendo que lo que usaras es multiples ventanas MDICHILD y que lo que quieres es que al pulsar una pestaña, se active ó se abra una determinada ventana MDICHILD. Es esto asi ó tu modelo es diferente a este ?
Unas cuantas cuestiones (Solucionado )
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
- Daniel Garcia-Gil
- Posts: 2365
- Joined: Wed Nov 02, 2005 11:46 pm
- Location: Isla de Margarita
- Contact:
Re: Unas cuantas cuestiones
Pedro
el ejemplo te muestra como y no usa comandos POO para ello
te explico el ejemplo, al parecer no esta claro...
el metodo RUN de la clase TApp, construye la ventana principal (como veras se usa comandos xbase para todo)
explicacion de buildStart
explicacion de metodo selectOption
explicacion de TSart():run()
explicacion metodo validaPanel
creo que es suficiente para que veas mas o menos el proceso de como lograr lo que quieres
el ejemplo te muestra como y no usa comandos POO para ello
te explico el ejemplo, al parecer no esta claro...
el metodo RUN de la clase TApp, construye la ventana principal (como veras se usa comandos xbase para todo)
Code: Select all
//se contruye la ventana principal
DEFINE WINDOW ::hObjs["MAIN_WND"] FROM 1, 1 To 22, 75
//se condtruye la ribbon
DEFINE RIBBONBAR ::hObjs["RIBBON"] PROMPTS "Start","Edition","Tools","Themes","Help" OF ::hObjs["MAIN_WND"] ;
HEIGHT 160 TOPMARGIN 25 2010
::buildStart() //construye la pestaña "start", ver metodo buildStart para mas detalle
::buildEdition() //construye la pestaña "edition", ver metodo buildEdition para mas detalle
//asignamos el codeblock que ejecuta una accion cuando se selecciona una pestaña nueva
//el codeblock recibe 2 parametros, parametro 1: la pestaña que se esta seleccionando
//parametro 2: la pestaña anteriormente seleccionada
//ver metodo selectOption para mas detalle de la accion...
::hObjs["RIBBON"]:bAction = {| nNewOption, nOldOption | ::selectOption( nNewOption, nOldOption ) }
//inicialmente selecionamos la pestaña 1 (start) para que nos ejecute la accion de la misma y nos muestre el contenido
//que depende de ella en el espacio debajo de la ribbon
::selectOption(1)
//activamos la ventana principal
ACTIVATE WINDOW ::hObjs["MAIN_WND"];
on resize( oMain:movePanel( nWidth, nHeight ) )
Code: Select all
method TApp:buildStart()
local o := TStart()
//agrega (usando comandos xbase) un grupo a la pestaña start
add group ::hObjs["GRP1_START"] ribbon ::hObjs["RIBBON"] to option "START" prompt "Only a Group to Test"
//agrega (usando comandos xbase) botones al gropo antes creado, con sus respectivas acciones
@ 05,04 add button prompt "Boton 1 Start" ;
group ::hObjs["GRP1_START"] size 142, 25;
action o:button1()
@ 35,04 add button prompt "Boton 1 Start" ;
group ::hObjs["GRP1_START"] size 142, 25;
action o:button2()
return nil
Code: Select all
method selectOption(nNew, nOld ) inline eval( ::hActions[nNew] )
//este metodo ejecuta una accion por cada pestaña seleccionada
//se creo un hash de acciones llamado ::hActions que contiene los codeblock que se ejecutaran por cada pestaña
//ejemplo:
//::hActions[1] = {|| TStart():run() }, cuando la pestaña es la numero 1 (start) selectOption ejecuta el eval de ese codeblock
//eval( ::hActions[nNew] ), le llega como parametro nNew, que es la pestaña actualmente seleccionda
//la accion siguiente es crear el panel que va debajo de la ribbon
Code: Select all
method TStart:run()
local oMain := ::oMain
//verifica que el panel debajo de la ribbon este creado
//si esta creado lo elimina y deja disponible la creacion de un nuevo panel
//el secreto esta en tener un solo panel para todas las opciones
//para mas detalle ver el metodo validaPanel
::oMain:validaPanel()
//crea el panel debajo de la ribbon
//para mas detalle ver el metodo defineWindow
::oMain:defineWindow( CLR_BLUE )
//crea controles dentro del panel
@ 10,10 say "ESTOY EN START" pixel
@ 40,10 button "Selecciona Edition" of ::oMain:hObjs["PANEL"] size 120,20 pixel action oMain:hObjs["RIBBON"]:setOption(2)
//activa el panel debajo de la ribbon
::oMain:activateWindow()
return nil
explicacion metodo validaPanel
Code: Select all
method TApp:validaPanel()
if ::oMain:hObjs["PANEL"] != nil //varibale donde se almacena el objeto panel que se usaran todas las pestañas, si el panel existe lo cierra
::oMain:closePanel() //para mas detalle ver el metodo closePanel()
::oMain:hObjs["MAIN_BRUSH"]:end()
end
return nil
our best documentation is the source code
Isla de Margarita Venezuela.
danielgarciagil@gmail.com
http://tdolphin.blogspot.com/
https://www.dropbox.com/referrals/NTI5N ... rc=global9
Isla de Margarita Venezuela.
danielgarciagil@gmail.com
http://tdolphin.blogspot.com/
https://www.dropbox.com/referrals/NTI5N ... rc=global9
Re: Unas cuantas cuestiones
Hola Antonio y Daniel
Estimado Daniel, agradezco tus explicaciones y tu ejemplo, ya que de manera fácil me has hecho ver como construir una aplicación convirtiéndola en una clase. Eso para mí es POO, mientras que comandos sería lo clásico
Espero que ahora me entiendas, lo que quiero decir.
Lo siento no he sido capaz de trasladar tu ejemplo a mi programa, más que nada porque no encontraba nOldOption fuera de su ámbito en el method SetOption.
La solución ha sido mucho más fácil de lo que pensaba, sólo que he tenido que tocar la clase Ribbon que era lo que no quería hacer, pero como decía anteriormente, faltaba algo en la clase
Lo único que he tenido que hacer es declarar la variable nOldOption que está como local en el method SetOption como data de la clase Ribbon y en el method SetOption
Por si sirve de algo y para otros, ahora si funciona bien el Codeblok y se pueden ejecutar las dos acciones.
oRbar:aDialogs[ 1 ]:bGotFocus = { | o | MsgInfo( "Entrada "+Str(o:oWnd:nOption) ) } <---------------Esto da la pestaña a la que entras
oRbar:aDialogs[ 1 ]:bLostFocus = { | o | MsgInfo( "Salida "+Str(oRbar:nOldOption) ) } <---------------Esto da la pestaña de la que has salido
Estimado Daniel, agradezco tus explicaciones y tu ejemplo, ya que de manera fácil me has hecho ver como construir una aplicación convirtiéndola en una clase. Eso para mí es POO, mientras que comandos sería lo clásico
Code: Select all
Define Windows.....
Define Ribbon....
Add groups ......
Add Button ....
Activate Windows......
Lo siento no he sido capaz de trasladar tu ejemplo a mi programa, más que nada porque no encontraba nOldOption fuera de su ámbito en el method SetOption.
La solución ha sido mucho más fácil de lo que pensaba, sólo que he tenido que tocar la clase Ribbon que era lo que no quería hacer, pero como decía anteriormente, faltaba algo en la clase
Lo único que he tenido que hacer es declarar la variable nOldOption que está como local en el method SetOption como data de la clase Ribbon y en el method SetOption
Code: Select all
METHOD SetOption( nOption ) CLASS TRibbonBar
local nAt
::nOldOption := ::nOption <---------------
nOption = ::ScanOption( nOption )
if ::oBackStage != nil .and. IsWindowVisible( ::oBackStage:hWnd )
if nOption != ::nOption
::BackStage()
endif
endif
if nOption != ::nOption .and. ::aEnable[ nOption ]
::nOption = nOption
::aDialogs[ ::nOldOption ]:Hide() <-----------------
::PaintOver( ::nOption, 1 )
::Resize( 0, ::nWidth, ::nHeight )
::aDialogs[ ::nOption ]:Show()
if !Empty( ::aDialogs[ ::nOption ]:aControls )
aeval( ::aDialogs[ ::nOption ]:aControls, {| oControl | oControl:Show(), oControl:Refresh() } )
endif
::aDialogs[ ::nOption ]:SetFocus()
::Refresh()
if ! Empty( ::bAction )
Eval( ::bAction, nOption, ::nOldOption ) <---------------------
endif
endif
return nil
Por si sirve de algo y para otros, ahora si funciona bien el Codeblok y se pueden ejecutar las dos acciones.
oRbar:aDialogs[ 1 ]:bGotFocus = { | o | MsgInfo( "Entrada "+Str(o:oWnd:nOption) ) } <---------------Esto da la pestaña a la que entras
oRbar:aDialogs[ 1 ]:bLostFocus = { | o | MsgInfo( "Salida "+Str(oRbar:nOldOption) ) } <---------------Esto da la pestaña de la que has salido
Un saludo
Pedro
gahetesoft@gmail.com
FWH12.06 BCC582, Xverce CW, Pelles C 6.00.4,PSPAD 4.54
y ahora con ADO
Pedro
gahetesoft@gmail.com
FWH12.06 BCC582, Xverce CW, Pelles C 6.00.4,PSPAD 4.54
y ahora con ADO
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
Re: Unas cuantas cuestiones (Solucionado )
Pedro,
Buena solución, muchas gracias!
Añadido para el próximo build de FWH
Buena solución, muchas gracias!
Añadido para el próximo build de FWH
Re: Unas cuantas cuestiones (Solucionado )
Gracias a ti, Antonio, y a todo el foro, de los que he aprendido muchísimo y me han ayudado infinito.
Un saludo
Pedro
gahetesoft@gmail.com
FWH12.06 BCC582, Xverce CW, Pelles C 6.00.4,PSPAD 4.54
y ahora con ADO
Pedro
gahetesoft@gmail.com
FWH12.06 BCC582, Xverce CW, Pelles C 6.00.4,PSPAD 4.54
y ahora con ADO
- Daniel Garcia-Gil
- Posts: 2365
- Joined: Wed Nov 02, 2005 11:46 pm
- Location: Isla de Margarita
- Contact:
Re: Unas cuantas cuestiones (Solucionado )
Pedro
Excelente...
Excelente...
our best documentation is the source code
Isla de Margarita Venezuela.
danielgarciagil@gmail.com
http://tdolphin.blogspot.com/
https://www.dropbox.com/referrals/NTI5N ... rc=global9
Isla de Margarita Venezuela.
danielgarciagil@gmail.com
http://tdolphin.blogspot.com/
https://www.dropbox.com/referrals/NTI5N ... rc=global9