Page 1 of 1

Ayuda con TWBrowse (de Hernán)

PostPosted: Tue Sep 09, 2008 1:08 am
by rolando
Buenas tardes,

Estoy trabado con esto y por eso pido vuestra ayuda.

Tengo una pequeña rutina para mostrar un array y logré hacer que al clickear sobre los headers, se ordene por el header pulsado.

Lo que me interesaría es que, además quede algún indicativo de que se ordenó por esa columna (porder cambiar el font al header que se pulsó o algo similar).

Un colega me recomendó usar DrawHeaders() pero no encuentro la vuelta como hacerlo.

Adjunto el código para ver si alguien me da una mano. Gracias.

Rolando :D

Code: Select all  Expand view
function muestroarray(aArray,cTrabajos)

    local oLbx , oDlg , aArray1


    define dialog oDlg resource "LISTARREGISTROS"

      redefine listbox oLbx fields ;                //
                          aArray[oLbx:nAt,1] , ;
                            +aArray[oLbx:nAt,2] , ;
                            +aArray[oLbx:nAt,3] , ;
                            +aArray[oLbx:nAt,4] , ;
                            +aArray[oLbx:nAt,5] , ;
                            +aArray[oLbx:nAt,6] , ;
                            +aArray[oLbx:nAt,7] , ;
                            +aArray[oLbx:nAt,8] , ;
                            +aArray[oLbx:nAt,9] , ;
                            +aArray[oLbx:nAt,10] , ;
                            +aArray[oLbx:nAt,11] , ;
                            +aArray[oLbx:nAt,12] , ;
                            +aArray[oLbx:nAt,13] ;
                         id 4001 ;                                                       //
                         of oDlg
       oLbx:aHeaders := { "   Talón  " ,"     NOMBRE                  " , "Dirección " , "TELEFONO" ,;
                          "Artefacto" , "        Modelo         " , "Fecha IN" , "Para El" , ;
                                "Finalizado" , "FACOMPRA" , "DEALER" , "SERIE" , " RECNO "}


       oLbx:setarray(aArray)
      oLbx:bLogicLen := { || len( aArray ) }

        oLbx:nFreeze:=2

       oLbx:nClrPane:= nRGB(230,230,250)



       oLbx:nHeaderHeight:= 20


     oLbx:bLClicked:= (oLbx:bFont :={|nRow,nCol,nStyleLine| OrdenoArray((oLbx:GetColHeader(nRow,nCol)) ,;
                         @aArray , oLbx:refresh() ) } )




     activate dialog oDlg center


      return nil

    //-----------------------------------------------------------------------


      Function OrdenoArray( nCol , aArray)



       if nCol = 7 .or. nCol = 8 .or. nCol = 9
          aArray1 := asort(aArray,,, { |x, y| dtos(ctod(x[nCol])) < dtos(ctod(y[nCol])) })
          aArray := aArray1

          return nil
       endif


       if nCol > 0
           aArray1 := asort(aArray,,, { |x, y| x[nCol] < y[nCol] })
           aArray := aArray1
            return nil
       endif

      Return nil

PostPosted: Tue Sep 09, 2008 4:35 pm
by rolando
Por favor, agradeceré cualquier ayuda.

No logro hacerlo funcionar.

Gracias.

Rolando :D

Como lo hago yo..

PostPosted: Tue Sep 09, 2008 5:30 pm
by derpipu
Rolando, espero que esto sea lo que preguntas en el foro, bueno yo lo hago asi primero esto en el codigo...

Code: Select all  Expand view
      REDEFINE LISTBOX oBrowse FIELDS ID 102 OF oDlg ;
                       ON DBLCLICK( lContinuar := .T., oDlg:End() ) UPDATE

        with object oBrowse
          :cAlias        := (pcBaseDatos)
          :cToolTip      := "Seleccione una opcion..."

          :bLine         := (bCampos)
          *:bLogicLen     := { | nRegistros| nRegistros := (pcBaseDatos)->(LastRec( )) } // Agregado el 28/01/2004 10:42a. LFRR
          :bLogicLen     := {|| (pcBaseDatos)->(OrdKeyCount())}
          //:bKeyDown      := { | nKey | lContinuar := f_bKeyDown( nKey, oDlg, oBrowse, pcBaseDatos, paNombres ) }
          :bKeyChar      := { | nKey | lContinuar := f_bKeyDown( nKey, oDlg, oBrowse, pcBaseDatos, paNombres ) }

//          :bKeyDown      := { | nKey | lContinuar := if(nKey = 13, .T., .F. ), if( nKey = 13 .or. nKey = 27, oDlg:End(), nil) }

          :bSeek         := { | | oBrowse:DbfSeek( .T. ) }
          :bUpdateBuffer := { | | ( cBuscar := oBrowse:cBuffer, oDlg:Update() ) }
          :bFont         := { | nRow, nCol, nStyleLine | SeleccionaFuente( nRow, nCol, nStyleLine, oApp:fNormal, oApp:fBold, oApp:fBold, oApp:fBold ) }

          :aHeaders      := paNombres
          :aColSizes     := { 140, 140, 100 }
          :aJustify      := { 2, 0, 0, 0 } // 2 = centrado, 0 = Izquierda, 1 = Derecha
          :aHJustify     := { 2, 2, 2, 2 } // 2 = centrado, 0 = Izquierda, 1 = Derecha

          do case
            case len(paNombres) = 2
              :aActions      := { { || f_CambiarIndice( pcBaseDatos, paNombres[1], 1, oBrowse, oDlg ), cBuscar := space(100), oDlg:Update() },;
                                  { || f_CambiarIndice( pcBaseDatos, paNombres[2], 2, oBrowse, oDlg ), cBuscar := space(100), oDlg:Update() } }
            case len(paNombres) = 3
              :aActions      := { { || f_CambiarIndice( pcBaseDatos, paNombres[1], 1, oBrowse, oDlg ), cBuscar := space(100), oDlg:Update() },;
                                  { || f_CambiarIndice( pcBaseDatos, paNombres[2], 2, oBrowse, oDlg ), cBuscar := space(100), oDlg:Update() },;
                                  { || f_CambiarIndice( pcBaseDatos, paNombres[3], 3, oBrowse, oDlg ), cBuscar := space(100), oDlg:Update() } }
            case len(paNombres) = 4
              :aActions      := { { || f_CambiarIndice( pcBaseDatos, paNombres[1], 1, oBrowse, oDlg ), cBuscar := space(100), oDlg:Update() },;
                                  { || f_CambiarIndice( pcBaseDatos, paNombres[2], 2, oBrowse, oDlg ), cBuscar := space(100), oDlg:Update() },;
                                  { || f_CambiarIndice( pcBaseDatos, paNombres[3], 3, oBrowse, oDlg ), cBuscar := space(100), oDlg:Update() },;
                                  { || f_CambiarIndice( pcBaseDatos, paNombres[4], 4, oBrowse, oDlg ), cBuscar := space(100), oDlg:Update() } }
          end case

          :nHeaderStyle  := 3
          :nFooterStyle  := 3
          :nHeaderHeight := 25 // 20
          :nLineStyle    := 10 // 3
          :nLineHeight   := 22
          :nFreeze       := len(panombres)//1

          :nClrForeFocus := CLR_WHITE      // { || CLR_BLACK }
          :nClrBackFocus := nRGB(0,78,152) // { || nRGB( 255, 255, 128 ) }
          :nClrBackHead  := nRGB(105,132,192)
          :nClrForeHead  := CLR_WHITE      //CLR_BLUE
          :nClrPane      := { || IIF( (pcBaseDatos)->( OrdKeyNo() ) % 2 == 0, nRGB( 193, 221, 255 ), nRGB( 221, 245, 255 ) ) }

          :lCellStyle     := .F.
          :lAdjLastCol    := .T.
          :lDrawFocusRect := .F.

          // Footer's
          /*
          :lDrawFooters  :=.T.
          :nFooterStyle  := 6
          :nFooterHeight := 25
          :aFJustify     := { 2,2 }
          :aFooters      := {|| { Alltrim(Transform((pcBaseDatos)->(OrdKeyCount()),'9,999,999'))+" Reg(s)", "" } }
          */

        end with


y luego la funcion f_CambiarIndice() e SeleccionaFuente() esta ultima es colaboracion de algun amiguito brasileño creo...

obvia decir que las fuentes yo las defino al inicio, igual y desde ahi las puedes cambiar..

Code: Select all  Expand view
function f_CambiarIndice( pcBaseDatos, pcIndice, pnColumna, poBrowse, poDlg )
  (pcBaseDatos)->(OrdSetFocus( pnColumna ))

  with object poBrowse
    :bBkColor      := {|nRow,nCol,nStyle| IF( nStyle == 1, IF( nCol == pnColumna, nRGB(128,0,64), ), ) }
    :bTextColor    := {|nRow,nCol,nStyle| IF( nStyle == 1, IF( nCol == pnColumna, CLR_WHITE, ), ) }

    for x := 1 to len( :aHeaders )
      :aHeaders[ x ] := lower( :aHeaders[ x ] )
    next

    :aHeaders[ pnColumna ] := upper( poBrowse:aHeaders[ pnColumna ] )
    :cBuffer       := ""

  end with
  poDlg:cTitle := "Listado de: " + NomCatalogos(pcBaseDatos) + ": Ordenando por: " + pcIndice
  (pcBaseDatos)->(dbGotop())
return(nil)

Function SeleccionaFuente( nRow, nCol, nStyleLine, tFont0, tFont1, tFont2, tFont3 )
  LOCAL hFont := nil

  IF       nStyleLine == 0 ; hFont := tFont0:hFont  // 0 -> Celda standard normal
    ElseIf nStyleLine == 1 ; hFont := tFont1:hFont  // 1 -> Celda Header
    ElseIf nStyleLine == 2 ; hFont := tFont2:hFont  // 2 -> Celda Footer
    ELseIf nStyleLine == 3 ; hFont := tFont3:hFont  // 3 -> Celda standard normal seleccionada
  EndIf
Return( hFont )




quizas no cambias la letra, pero si le cambias el color al header y lo conviertes a mayusculas y es no notorio que esta ordenado por esa columna

espero te ayude..

Saludos desde Guadalajara, Jalisco, Mexico

PostPosted: Wed Sep 10, 2008 11:28 am
by rolando
Muchas gracias Luis por responder.

No probé tus rutinas porque te comento que logré hacer lo que quería sólo agregando una línea a la función OrdenoArray( nCol , aArray).

Le agregué: "oLbx:nColHPressed:=nCol" antes del RETURN y así logro que la cabecera se mantenga como un botón "pulsado".

De nuevo, Muchas Gracias.

Rolando :D

PostPosted: Wed Sep 10, 2008 3:11 pm
by Francisco Horta
Rolando,
Ese que intentas hacer yo lo uso en todos los wbrowse del sistema, lo que hago es poner el encabezado en mayusculas y negritas, te adjunto una imagen y el codigo
salu2
Paco

http://www.mediafire.com/imageview.php? ... ie&thumb=5

<a href="http://www.mediafire.com/imageview.php?quickkey=wlbu1az24ie&thumb=5" target="_blank"><img src="http://www.mediafire.com/imgbnc.php/2c234620428a76ff9f9807076715461d2g.jpg" border="0" alt="Unlimited Free Image and File Hosting at MediaFire"></a>


DEFINE FONT oFnt NAME "Ms Sans Serif" SIZE 0,-12 BOLD


oBCos:aActions := Array( Len( oBCos:aColSizes ) )

oBCos:aActions[ 2 ] := {|| (oDCos)->(OrdSetFocus("CUENTA")), ;
oBCos:aHeaders[ 2 ] := "CUENTA" , ;
oBCos:aHeaders[ 3 ] := "N o m b r e" , ;
oBCos:bFont := {|nRow,nCol,nStyleLine| ;
IF(nStyleLine==1 .AND. nCol==2,oFnt:hFont,) },;
oBCos:cBuffer:="",;
(oDCos)->(DbGoTop()),;
oBCos:Refresh(),;
SndPlaySound("Click.Wav") }

oBCos:aActions[ 3 ] := {|| (oDCos)->(OrdSetFocus("NOMBRE")), ;
oBCos:aHeaders[ 2 ] := "Cuenta" , ;
oBCos:aHeaders[ 3 ] := "N O M B R E" , ;
oBCos:bFont := {|nRow,nCol,nStyleLine| ;
IF(nStyleLine==1 .AND. nCol==3,oFnt:hFont,) },;
oBCos:cBuffer:="",;
(oDCos)->(DbGoTop()),;
oBCos:Refresh(),;
SndPlaySound("Click.Wav") }

Re: Ayuda con TWBrowse (de Hernán)

PostPosted: Wed Sep 10, 2008 4:05 pm
by El Loco
Rolando, yo hago algo parecido a lo de Francisco, solo que yo le cambio el color de fondo de la cabecera:
Code: Select all  Expand view
oBrw:bBkColor:= {|nRow,nCol,nStyle|If(nStyle==1,If(nCol==4,Rgb(0,0,0),Rgb(77,105,115)),Nil)}


Un Abrazo. El Loco =>))

PostPosted: Wed Sep 10, 2008 9:17 pm
by rolando
Muchas gracias a todos, ahora tengo una idea más clara con los ejemplos que me brindaron.

Saludos.

Rolando :D

Re: Ayuda con TWBrowse (de Hernán)

PostPosted: Fri Apr 10, 2009 3:49 am
by goosfancito
hola
como se en que columna se hizo click?

gracias.

Re: Ayuda con TWBrowse (de Hernán)

PostPosted: Fri Apr 10, 2009 2:08 pm
by rolando
Hola,

Creo que lo que necesitas es usar el bFont, por ej.

Code: Select all  Expand view
oLbx:blClicked:=oLbx:bFont:={ |nRow,nCol,nStyleLine| OrdenoArray((oLbx:GetColHeader(nRow,nCol)) ,;
 otros datos , otros datos , otros datos ) }
 


A través del bFont, conocés la línea (nRow) y la columna (nCol) en el momento que sobre la oLbx se hizo click con el botón izquierdo del mouse (oLbx:blClicked). Esta bFont te retorna esos datos y ahí llamo a GetColHeader enviándole como parámetros los datos (nRow,nCol) obtenidos de la bFont ( oLbx:GetColHeader(nRow,nCol) ), así me entero que columna del header fue presionada y lo paso como dato junto a todos los demás datos que necesites a mi función ( OrdenoArray ) para en ella procesar todos los datos de la manera que me interese.

Espero haber sido claro y te sirva mi explicación.

Saludos

Rolando :D

Re: Ayuda con TWBrowse (de Hernán)

PostPosted: Fri Apr 10, 2009 2:33 pm
by goosfancito
Gracias.

rolando wrote:Hola,

Creo que lo que necesitas es usar el bFont, por ej.

Code: Select all  Expand view
oLbx:blClicked:=oLbx:bFont:={ |nRow,nCol,nStyleLine| OrdenoArray((oLbx:GetColHeader(nRow,nCol)) ,;
 otros datos , otros datos , otros datos ) }
 


A través del bFont, conocés la línea (nRow) y la columna (nCol) en el momento que sobre la oLbx se hizo click con el botón izquierdo del mouse (oLbx:blClicked). Esta bFont te retorna esos datos y ahí llamo a GetColHeader enviándole como parámetros los datos (nRow,nCol) obtenidos de la bFont ( oLbx:GetColHeader(nRow,nCol) ), así me entero que columna del header fue presionada y lo paso como dato junto a todos los demás datos que necesites a mi función ( OrdenoArray ) para en ella procesar todos los datos de la manera que me interese.

Espero haber sido claro y te sirva mi explicación.

Saludos

Rolando :D

Re: Ayuda con TWBrowse (de Hernán)

PostPosted: Fri Apr 10, 2009 10:17 pm
by Willi Quintana
Aqui va:

oLbx:blClicked := {|nMRow, nMCol, nCol| nCol := oLbx:GetColHeader(nMRow, nMCol), MsgAlert(nCol) }

Salu2