Problemas con @ browse FiveLinux-harbour

Post Reply
jgayoso
Posts: 170
Joined: Sat Aug 07, 2010 11:36 pm
Location: Chile

Problemas con @ browse FiveLinux-harbour

Post by jgayoso »

Tengo 2 problemas en el código adjunto:
1) ¿Como hago para personalizar el ancho de cada columna? Salen todas del mismo ancho.
2) ¿Se puede usar y como, los metodos KeyDown() o LButtonDown() para marcar, en vez de un button?

Se agradece cualquier ayuda a mi problema... :cry:

DEFINE DIALOG oDlg TITLE hb_strtoutf8(cTitle) SIZE 510, 350
@ 1, 1 BROWSE oBrw OF oDlg ;
HEADERS hb_strtoutf8("Selección"), hb_strtoutf8("Descripción"), hb_strtoutf8("Archivo") ;
FIELDS If( vdbf_[ oBrw:nAt ][ 1 ], "X", " " ), vdbf_[ oBrw:nAt ][ 2 ], vdbf_[ oBrw:nAt ][ 3 ]
oBrw:SetArray( vdbf_ )
oBrw:nRowPos = 2
oBrw:nAt = 2

@31, 3 BUTTON "Seleccionar" OF oDlg SIZE 120, 33 ACTION ( vdbf_[ oBrw:nRowPos ][ 1 ] := ! vdbf_[ oBrw:nRowPos ][ 1 ], oBrw:Refresh() )
@31, 19 BUTTON "Aceptar" OF oDlg SIZE 120, 33 ACTION ( lModal:=.F., aSeleccion := {cValor}, oDlg:End() )
@31, 36 BUTTON "Cancelar" OF oDlg SIZE 120, 33 ACTION ( lModal:=.F., lRetorno:=.F., aSeleccion:={}, oDlg:End() )
ACTIVATE DIALOG oDlg CENTERED
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: Problemas con @ browse FiveLinux-harbour

Post by Antonio Linares »

Jorge,

Si revisas FiveLinux/include/FiveLinux.ch verás que el comando BROWSE admite las siguientes claúsulas:

Code: Select all

#xcommand @ <nRow>, <nCol> BROWSE <oBrw> ;
             [ <of: OF, WINDOW, DIALOG> <oWnd> ] ;
             [ <headers: HEAD, HEADER, HEADERS, TITLE> <cHeading,...> ] ;
             [ FIELDS <Expr1> [,<ExprN>] ] ;
             [ <sizes: FIELDSIZES, SIZES, COLSIZES> <aColSizes,...> ] ;
             [ FIELDS <Expr1> [,<ExprN>] ] ;
             [ ALIAS <cAlias> ] ;
         [ SIZE <nWidth>, <nHeight> ] ;
         [ <update: UPDATE> ] ;
      => ;
             [ <oBrw> := ] TWBrowse():New( <nRow>, <nCol>,;
         [<oWnd>], [\{<cHeading>\}], [\{<aColSizes>\}],;
         \{ \{|o|<Expr1>\} [ ,\{|o|<ExprN>\} ] \}, <cAlias>,;
         <nWidth>, <nHeight>, <.update.> )
 
luego puedes especificar:
@ ..., ... BROWSE ... COLSIZES 30, 80, 70 ...
un valor para cada ancho de columna :-)
regards, saludos

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

Re: Problemas con @ browse FiveLinux-harbour

Post by Antonio Linares »

Para poder seleccionar usando el teclado, tenemos que modificar el método KeyDown() para que evalúe bKeyDown en caso de estar definido:

Code: Select all

METHOD KeyDown( nKey ) CLASS TWBrowse

   do case
      case nKey == K_DOWN
           ::GoDown()
       ::oVScroll:SetValue( ::oVScroll:GetValue() + 1 )

      case nKey == K_UP
           ::GoUp()
       ::oVScroll:SetValue( ::oVScroll:GetValue() - 1 )

      case nKey == K_HOME
           ::GoTop()
       ::oVScroll:SetValue( 1 )

      case nKey == K_END
           ::GoBottom()

      case nKey == K_PAGEUP
           ::PageUp()

      case nKey == K_PAGEDOWN
           ::PageDown()

      case nKey == K_LEFT
           ::GoLeft()
       ::oHScroll:SetValue( ::oHScroll:GetValue() - 1 )

      case nKey == K_RIGHT
           ::GoRight()
       ::oHScroll:SetValue( ::oHScroll:GetValue() + 1 )
   endcase

   if ! Empty( ::bKeyDown )
      Eval( ::bKeyDown, nKey, Self )
   endif

return nil
 
De igual forma hay que modificar el método LButtonDown() para que procese bLClicked en caso de estar definido:

Code: Select all

METHOD LButtonDown( nRow, nCol ) CLASS TWBrowse

   local nRowSize := ::nHeight / ::nRowCount()
   local nRowAt   := Int( nRow / nRowSize )
   local nRowPos  := ::nRowPos
   local nSkipped

   ::SetFocus()

   if nRowAt == 0 .or. nRowAt == nRowPos
      return nil
   endif

   ::DrawLine( nRowPos )
   if ( nSkipped := ::Skip( nRowAt - nRowPos ) ) != 0
      ::nRowPos = nRowAt
      ::oVScroll:SetValue( ::oVScroll:GetValue() + ( nRowAt - nRowPos ) )
      if ! Empty( ::bLClicked )
         Eval( ::bLClicked, nRowAt, nCol, Self )
      endif
   endif
   ::DrawSelect()

return nil
 
Vamos a incorporar _ en FiveLinux y te enviamos las nuevas librerias :-)
regards, saludos

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

Re: Problemas con @ browse FiveLinux-harbour

Post by Antonio Linares »

El ejemplo quedaría asi:

Code: Select all

// Using a browse to display a multidimensional array

#include "FiveLinux.ch"

function Main()

   local oWnd, oBrw, aTest := { { .F., "one", "two" }, { .F., "three", "four" }, { .F., "five", "six" } }

   DEFINE WINDOW oWnd TITLE "Testing Browses" SIZE 522, 317

   @ 2, 2 BROWSE oBrw OF oWnd ;
      HEADERS "Selected", "First", "Second" ;
      FIELDS  If( aTest[ oBrw:nAt ][ 1 ], "X", " " ), aTest[ oBrw:nAt ][ 2 ], aTest[ oBrw:nAt ][ 3 ]

   oBrw:SetArray( aTest )
   oBrw:nRowPos = 2
   oBrw:nAt = 2

   oBrw:bKeyDown = { | nKey | If( nKey == 32, ( aTest[ oBrw:nRowPos ][ 1 ] := ! aTest[ oBrw:nRowPos ][ 1 ], oBrw:Refresh() ),) }
   oBrw:bLClicked = { | nRowAt, nCol | If( nCol < 80, ( aTest[ oBrw:nRowPos ][ 1 ] := ! aTest[ oBrw:nRowPos ][ 1 ], oBrw:Refresh() ),) }

   @ 28, 2 BUTTON "_Ok" OF oWnd ACTION oWnd:End()
   
   @ 28, 30 BUTTON "Add" OF oWnd ACTION ( AAdd( aTest, { .F., "five", "six" } ), oBrw:SetArray( aTest ), oBrw:GoTop(), oBrw:Refresh() )

   @ 28, 40 BUTTON "Select" OF oWnd ACTION ( aTest[ oBrw:nRowPos ][ 1 ] := ! aTest[ oBrw:nRowPos ][ 1 ], oBrw:Refresh() )

   ACTIVATE WINDOW oWnd 

return nil
 
regards, saludos

Antonio Linares
www.fivetechsoft.com
jgayoso
Posts: 170
Joined: Sat Aug 07, 2010 11:36 pm
Location: Chile

Re: Problemas con @ browse FiveLinux-harbour

Post by jgayoso »

Ok Antonio, una vez mas todo bien.

Resulto perfecto.

Se agradece.
Post Reply