Unas cuantas cuestiones (Solucionado )

Re: Unas cuantas cuestiones

Postby Antonio Linares » Sun May 26, 2013 6:49 pm

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

Re: Unas cuantas cuestiones

Postby Daniel Garcia-Gil » Sun May 26, 2013 6:50 pm

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  Expand view
   
    //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  Expand view

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  Expand view

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  Expand view

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  Expand view

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

Re: Unas cuantas cuestiones

Postby Pedro » Mon May 27, 2013 12:07 pm

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  Expand view

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  Expand view
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
Pedro
 
Posts: 464
Joined: Tue Mar 21, 2006 7:30 pm
Location: Córdoba (España)

Re: Unas cuantas cuestiones (Solucionado )

Postby Antonio Linares » Mon May 27, 2013 2:44 pm

Pedro,

Buena solución, muchas gracias! :-)

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

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

Re: Unas cuantas cuestiones (Solucionado )

Postby Pedro » Mon May 27, 2013 2:58 pm

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
Pedro
 
Posts: 464
Joined: Tue Mar 21, 2006 7:30 pm
Location: Córdoba (España)

Re: Unas cuantas cuestiones (Solucionado )

Postby Daniel Garcia-Gil » Mon May 27, 2013 3:33 pm

Pedro

Excelente...
User avatar
Daniel Garcia-Gil
 
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita

Previous

Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Ask Jeeves [Bot], Google [Bot] and 57 guests