Unas cuantas cuestiones (Solucionado )

User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: Unas cuantas cuestiones

Post by Antonio Linares »

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 ?
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Daniel Garcia-Gil
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita
Contact:

Re: Unas cuantas cuestiones

Post by Daniel Garcia-Gil »

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)

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 ) ) 
 
 
explicacion de buildStart

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
 
explicacion de metodo selectOption

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
 
explicacion de TSart():run()

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
creo que es suficiente para que veas mas o menos el proceso de como lograr lo que quieres
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
User avatar
Pedro
Posts: 457
Joined: Tue Mar 21, 2006 7:30 pm
Location: Córdoba (España)

Re: Unas cuantas cuestiones

Post by Pedro »

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

Code: Select all

Define Windows.....
Define Ribbon....
Add groups ......
Add Button ....
Activate Windows......
 
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

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

Re: Unas cuantas cuestiones (Solucionado )

Post by Antonio Linares »

Pedro,

Buena solución, muchas gracias! :-)

Añadido para el próximo build de FWH
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Pedro
Posts: 457
Joined: Tue Mar 21, 2006 7:30 pm
Location: Córdoba (España)

Re: Unas cuantas cuestiones (Solucionado )

Post by Pedro »

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
User avatar
Daniel Garcia-Gil
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita
Contact:

Re: Unas cuantas cuestiones (Solucionado )

Post by Daniel Garcia-Gil »

Pedro

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
Post Reply