Ayuda con TWBrowse (de Hernán)

Ayuda con TWBrowse (de Hernán)

Postby rolando » Tue Sep 09, 2008 1:08 am

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
User avatar
rolando
 
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Postby rolando » Tue Sep 09, 2008 4:35 pm

Por favor, agradeceré cualquier ayuda.

No logro hacerlo funcionar.

Gracias.

Rolando :D
User avatar
rolando
 
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Como lo hago yo..

Postby derpipu » Tue Sep 09, 2008 5:30 pm

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
Luis Fernando Rubio Rubio
derpipu
 
Posts: 94
Joined: Tue Mar 28, 2006 4:09 pm
Location: Tequila, Jalisco Mexico

Postby rolando » Wed Sep 10, 2008 11:28 am

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
User avatar
rolando
 
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Postby Francisco Horta » Wed Sep 10, 2008 3:11 pm

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") }
Francisco Horta
 
Posts: 845
Joined: Sun Oct 09, 2005 5:36 pm
Location: la laguna, mexico.

Re: Ayuda con TWBrowse (de Hernán)

Postby El Loco » Wed Sep 10, 2008 4:05 pm

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 =>))
El Loco
 
Posts: 328
Joined: Fri May 19, 2006 4:08 pm
Location: Buenos Aires - Argentina

Postby rolando » Wed Sep 10, 2008 9:17 pm

Muchas gracias a todos, ahora tengo una idea más clara con los ejemplos que me brindaron.

Saludos.

Rolando :D
User avatar
rolando
 
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Re: Ayuda con TWBrowse (de Hernán)

Postby goosfancito » Fri Apr 10, 2009 3:49 am

hola
como se en que columna se hizo click?

gracias.
FWH 21.02
Harbour 3.2.0dev (r2104281802)
Copyright (c) 1999-2021, https://harbour.github.io/
User avatar
goosfancito
 
Posts: 1954
Joined: Fri Oct 07, 2005 7:08 pm

Re: Ayuda con TWBrowse (de Hernán)

Postby rolando » Fri Apr 10, 2009 2:08 pm

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
User avatar
rolando
 
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Re: Ayuda con TWBrowse (de Hernán)

Postby goosfancito » Fri Apr 10, 2009 2:33 pm

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
FWH 21.02
Harbour 3.2.0dev (r2104281802)
Copyright (c) 1999-2021, https://harbour.github.io/
User avatar
goosfancito
 
Posts: 1954
Joined: Fri Oct 07, 2005 7:08 pm

Re: Ayuda con TWBrowse (de Hernán)

Postby Willi Quintana » Fri Apr 10, 2009 10:17 pm

Aqui va:

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

Salu2
User avatar
Willi Quintana
 
Posts: 1002
Joined: Sun Oct 09, 2005 10:41 pm
Location: Cusco - Perú


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Google [Bot] and 83 guests