FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Ayuda con TWBrowse (de Hernán)
Posts: 593
Joined: Sat May 12, 2007 11:47 AM
Ayuda con TWBrowse (de Hernán)
Posted: Tue Sep 09, 2008 01: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 :-)

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
Posts: 593
Joined: Sat May 12, 2007 11:47 AM
Ayuda con TWBrowse (de Hernán)
Posted: Tue Sep 09, 2008 04:35 PM

Por favor, agradeceré cualquier ayuda.

No logro hacerlo funcionar.

Gracias.

Rolando :D

Posts: 94
Joined: Tue Mar 28, 2006 04:09 PM
Como lo hago yo..
Posted: Tue Sep 09, 2008 05:30 PM
Rolando, espero que esto sea lo que preguntas en el foro, bueno yo lo hago asi primero esto en el codigo...

      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..

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
Posts: 593
Joined: Sat May 12, 2007 11:47 AM
Ayuda con TWBrowse (de Hernán)
Posted: 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

Posts: 845
Joined: Sun Oct 09, 2005 05:36 PM
Ayuda con TWBrowse (de Hernán)
Posted: Wed Sep 10, 2008 03: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? ... iethumb=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") }

&

____________________

Paco
Posts: 328
Joined: Fri May 19, 2006 04:08 PM
Re: Ayuda con TWBrowse (de Hernán)
Posted: Wed Sep 10, 2008 04:05 PM
Rolando, yo hago algo parecido a lo de Francisco, solo que yo le cambio el color de fondo de la cabecera:
oBrw:bBkColor:= {|nRow,nCol,nStyle|If(nStyle==1,If(nCol==4,Rgb(0,0,0),Rgb(77,105,115)),Nil)}


Un Abrazo. El Loco =>))
FWH 32/64 14.04

Harbour 3.2.0 (r1306211258)

PellesC
Posts: 593
Joined: Sat May 12, 2007 11:47 AM
Ayuda con TWBrowse (de Hernán)
Posted: Wed Sep 10, 2008 09:17 PM

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

Saludos.

Rolando :D

Posts: 1956
Joined: Fri Oct 07, 2005 07:08 PM
Re: Ayuda con TWBrowse (de Hernán)
Posted: Fri Apr 10, 2009 03: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/
Posts: 593
Joined: Sat May 12, 2007 11:47 AM
Re: Ayuda con TWBrowse (de Hernán)
Posted: Fri Apr 10, 2009 02:08 PM
Hola,

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

Code (fw): Select all Collapse
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 :-)
Posts: 1956
Joined: Fri Oct 07, 2005 07:08 PM
Re: Ayuda con TWBrowse (de Hernán)
Posted: Fri Apr 10, 2009 02:33 PM
Gracias.

rolando wrote:Hola,

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

Code (fw): Select all Collapse
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 :-)
FWH 21.02
Harbour 3.2.0dev (r2104281802)
Copyright (c) 1999-2021, https://harbour.github.io/
Posts: 1054
Joined: Sun Oct 09, 2005 10:41 PM
Re: Ayuda con TWBrowse (de Hernán)
Posted: Fri Apr 10, 2009 10:17 PM

Aqui va:

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

Salu2

Continue the discussion