FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para CA-Clipper Determinar header donde se ha hecho clic en un TWBrowse
Posts: 28
Joined: Tue Nov 15, 2005 01:03 AM
Determinar header donde se ha hecho clic en un TWBrowse
Posted: Fri Jan 05, 2007 06:52 PM

Saludos amigos

Visto que a un TWBrowse se le pueden asociar "actions" a los header de cada columna me pregunto como es posible saber en cual header (columna) se ha hecho clic

Entiendo que si cada bloque de codigo asociado al action de la columna tiene una funcion al estilo MsgInfo(x), donde "x" es la columna, es posible saberlo pero me gustaria encontrar otro metodo ya que el indicado obliga a construir los actions para cada grid de forma independiente

Gracias por su ayuda

Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Determinar header donde se ha hecho clic en un TWBrowse
Posted: Sat Jan 06, 2007 06:35 AM

Williams,

METHOD nAtCol( nColPixel ) CLASS TWBrowse

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 28
Joined: Tue Nov 15, 2005 01:03 AM
Determinar header donde se ha hecho clic en un TWBrowse
Posted: Sat Jan 06, 2007 05:13 PM
Gracias Antonio

Con tu ayuda, y revisando nuevamente los metodos de la clase TWbrowse de Hernan finalmente di con lo que queria.

Aprovecho la oportunidad de dejar el codigo de una funcion generica que permite la visualizacion de un arreglo en un TWBrowse y opcionalmente devolver el numero del elemento seleccionado.

Aunque se han publicado otras funciones similares, las que les entrego aqui permite:

1. Mostrar un arreglo parcialmente (solo las columnas que se suministren)
2. Presentar las columnas en el orden en que desee el usuario sin importar el orden que tengan en el arreglo
3. Definir encabezados, tamaƱo y alineacion de las columnas a criterio del usuario
4. Definir colores personalizados para los elementos del browse
5. Mostrar el browse en la posicion elegida y con dimensiones suministradas
6. Realizar busqueda incremental por cualquiera de las columnas
7. Ordenar en tiempo de ejecucion cualquier columna
8. Devolver el elemento seleccionado del arreglo al pulsar ENTER o hacer doble click

Para evitar el uso de funciones auxiliares he basado el trabajo en bloques de codigo de tal forma que sea mas sencilla su implementacion. La funcion debe ser llamada con los siguientes valores:

    ShowTable( aTable, cTitle, aSize, aCoord, aCols, aCargo, bColor )[/list:u]
    donde:
      aTable= Arreglo a procesar
      cTitle = Titulo del dialogo
      aSize = TamaƱo en pixeles del browse
      aCoord = Coordenadas donde se debe ubicar el dialogo
      aCols = Arreglo de columnas a mostrar donde cada columna admite 5 parametros a saber:
        Posicion en el arreglo (N)
        Titulo (C)
        TamaƱo (N)
        Alineacion (N)
        Seleccion (L) (para sombrear la columna activa)[/list:u][/list:u]
        Ejemplo
        	aArray := { 
        	            { 1, "Activo" },                       ;
        	            { 11, "Activo Corriente" },            ;
        	            { 111, "Efectivo en Caja" },           ;
        	            { 11101, "Efectivo en Caja General" }  ;
        	          }
        	nPos   := ShowTable( aArray,                          ; // Tabla
        		                 "Seleccione Cuenta",             ; // Titulo
        		                 { 190, 115 },                    ; // TamaƱo
        		                 aCoord,                          ; // Coordenadas
        		                 { {  1, "Codigo", 100, 0 },      ;
        		                   {  2, "Nombre", 270, 0 }       ;
        			             }  )

        la funcion admite elementos de tipo character, date o numericos y los transforma para su correcta visualizacion en el browse. A pesar de esto es posible hacer los cambios que mas se ajusten a las necesidades particulares de cada quien

        Por ultimo quiero indicar que la funcion Selcolor que aparece en el codigo es una funcion generica de pintado de colores fila par/impar que puede ser omitida. En cualquier caso al final dejo el codigo de la misma a partir de algunos ejemplos publicados en este foro

        Espero que les sirva
        /*********************************************************************************************
              ShowTable()     : Muestra un array en un browse y permite opcionalmente escoger un valor
        *********************************************************************************************/
        function ShowTable( aTable, cTitle, aSize, aCoord, aCols, aCargo, bColor )
        
        	local oDlg, oLbx, oSay, vSay, aData, n, m, oFont[1], nRetVal := 0
        	local aColSize, aJustify, aRecord, aAction, nActiveCol := 0
        
        	default aCargo := { 0 }
        	bColor := if( bColor = nil, { || SelColor( oLbx:nAt, 2 ) }, &( bColor ) )
        
        	default aSize  := { 160, 115 }
        	default aCoord := { oCfg:nRow+85, oCfg:nCol }
        
        	if ValType( aTable ) == "A"
        		define font oFont[1] name "Tahoma" size 0,-12
        		define dialog oDlg title cTitle font oFont[1]
        		oDlg:lHelpIcon := .F.
        		
        		aData    := {}
        		aColSize := {}
        		aHeader  := {}
        		aJustify := {}
        		aAction  := {}
        		for n := 1 to Len( aTable )
        			aRecord := {}
        			for m := 1 to Len( aCols )
        				AADD( aRecord, if( ValType( aTable[n,aCols[m,1]] ) = "D", DtoC( aTable[n,aCols[m,1]] ),                  ;
        				               if( ValType( aTable[n,aCols[m,1]] ) = "N", Transform( aTable[n,aCols[m,1]], aCols[m,5] ), ;
        				                   aTable[n,aCols[m,1]] )) )
        				if n = 1
        					AADD( aHeader,  aCols[m,2] )
        					AADD( aColSize, aCols[m,3] )
        					AADD( aJustify, aCols[m,4] )
        					AADD( aAction,  { |Self, nRow, nCol| nLbxCol := oLbx:nAtCol(nCol),                                       ;
        					                                     if( oLbx:cargo[1] <> nLbxCol,                                       ;
        					                                         ( cSearch := "", vSay := Space(200), oSay:Refresh(),            ;
        					                                           aData := ASort( aData,,, { |x,y| x[nLbxCol] < y[nLbxCol] } ), ;
        					                                           oLbx:nColHPressed := nLbxCol, oLbx:cargo[1] := nLbxCol,       ;
        					                                           oLbx:Refresh() ),                                             ;
        					                                          nil ) } )
        					nActiveCol := if( Len(aCols[m]) >= 5 .and. aCols[m,5], m, nActiveCol )
        				endif
        			next
        			AADD( aRecord, Str(n,4) )
        			AADD( aData, AClone( aRecord ) )
        		next
        		
        		// Se agrega otra columna para el control del orden original
        		AADD( aHeader,  "No." )
        		AADD( aColSize, 10 )
        		AADD( aJustify, 1 )
        		AADD( aAction, { nil } )
        		
        		vSay := ""
        		@ aSize[2]+3, 5 say oSay var vSay of oDlg size 100,12 pixel
        		
        		oLbx := TWBrowse():New( 0, 0, aSize[1], aSize[2],,,,,,,,,,,,,,,,,,.t.,,,,, )
        		LbxConfig( oLbx )
        		oLbx:SetArray( aData )
        		oLbx:bLine := { |nAt| nAt := oLbx:nAt,                              ;
        		                      if( Len( aData ) < 1 .or. nAt > Len( aData ), ;
        			                      Array(6),                                 ;
        				                  aData[nAt] ) }
        		oLbx:aHeaders       := aHeader
        		oLbx:aColSizes      := aColSize
        		oLbx:aJustify       := aJustify
        		oLbx:aActions       := aAction
        		oLbx:bUpdateBuffer  := { || oLbx:cBuffer := Upper(oLbx:cBuffer),                                                       ;
        		                            vSay := if( Len(oLbx:cBuffer) > 0, PadR( "Buscando: " + oLbx:cBuffer, 200 ), Space(200) ), ;
        		                            oSay:Refresh()                                                                             ;
        		                       }
        		oLbx:bSeek          := { || if( oLbx:cargo[1] = 0,                                                                      ;
        		                                MsgStop( 'Haga clic en el titulo de la columna' + CRLF +                                ;
        		                                         'por la que desea buscar', 'Atención' ),                                       ;
        		                                ( cSearch := Upper( oLbx:cBuffer ),                                                     ;
        		                                  nLen := Len( cSearch ),                                                               ;
        		                                  vSay := if( Len(cSearch) > 0, PadR( "Buscando: " + cSearch, 200 ), Space(200) ),      ;
        		                                  oSay:Refresh(),                                                                       ;
        		                                  nCol := oLbx:cargo[1],                                                                ;
        		                                  if( nLen > 0,                                                                         ;
        		                                      ( nAt := AScan( aData, { |x,y| Upper( SubStr( x[nCol], 1, nLen )) == cSearch } ), ;
        		                                        if( nAt > 0,                                                                    ;
        		                                            ( oLbx:nAt := nAt,                                                          ;
        		                                              if( oLbx:oVScroll != nil,  oLbx:oVScroll:SetPos(nAt), nil ),              ;
        		                                              oLbx:Refresh() ),                                                         ;
        		                                            nil )),                                                                     ;
        		                                      nil )) ) }
        		oLbx:nBuffer        := 10
        		oLbx:lAutoEdit      := .f.
        		oLbx:lAutoSkip      := .f.
        		oLbx:lAdjLastCol    := .t.
        		oLbx:cargo          := { nActiveCol }
        		oLbx:nHeaderHeight  := 18
        		oLbx:nLineStyle     := 1
        		oLbx:nClrLine       := nRGB( 200, 200, 215 )
        		oLbx:lDrawFocusRect := .f.
        		oLbx:nClrPane       := bColor
        		oLbx:nClrLine       := nRGB( 200, 200, 215 )
        		oLbx:nClrBackHead   := nRGB( 215, 215, 215 )
        		oLbx:nClrForeHead   := nRGB(   0,   0,   0 )
        		oLbx:nClrForeFocus  := nRGB( 255, 255, 255 )
        		oLbx:nClrBackFocus  := nRGB(   0,   0,   0 )
        		oLbx:nClrNFFore     := nRGB(   0,   0,   0 )
        		oLbx:nClrNFBack     := nRGB( 180, 180, 180 )
        		oLbx:bBkColor       := { |nRow,nCol,nStyle| if( nCol = oLbx:cargo[1] .and. ( nStyle = 0 .or. nStyle = 1 ), ;
        		                                                oCfg:aLbxColors[2],                                        ;
        		                                                nil ) }
        		
        		oLbx:bKeyDown       := { | nKey | if( nKey == VK_RETURN,                               ;
        		                                      (  nAt     := oLbx:nAt,                          ;
        		                                         nRetVal := Val( aData[nAt,Len(aData[nAt])] ), ;
        		                                         oDlg:End() ),                                 ;
        		                                      nil ) }
        		
        		oLbx:bLDblClick     := { | nKey | nRetVal := oLbx:nAt, oDlg:End() }
        
        		activate dialog oDlg on init ( oDlg:SetSize( oLbx:nWidth+8, oLbx:nHeight+60 ), ;
        									   oDlg:Move( aCoord[1],aCoord[2]),                ;
        									   oDlg:Update() )
        		AEval( oFont, {|o| o:End() } )
        	endif
        
        return nRetVal

         ===================================================================================================
        //         SelColor()  : Configura las filas del grid en bi-color
        // ===================================================================================================
        function SelColor( nVal, nColor, cAlias, cColor ) 
            local nClr, nIndex
        
            if cAlias <> nil
                if !Empty( (cAlias)->( OrdBagName() ) )
        			nIndex := (cAlias)->( OrdKeyNo() ) % 2
                else
                    nIndex := (cAlias)->( RecNo() ) % 2
                endif
            else
                nIndex := if( nVal == nil, 0, nVal % 2 )
            endif
        
            if nIndex = 0
                do case
                case nColor == 1
                    nClr := oCfg:aLbxColors[1]
                case ncolor == 2
                    nClr := oCfg:aLbxColors[2]
                case nColor == 3
                    nClr := RGB(238,238,238)               //   RGB( 163, 202, 197 )
                case nColor == 4
                    nClr := RGB( 160, 160, 128 )
                case nColor == 5
                    nClr := RGB( 245, 235, 195 )
                case nColor == 0
                    nClr := ColorName( AllTrim( cColor ))
                endcase
            else 
                nClr := CLR_WHITE
            endif 
        
        return nClr
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Determinar header donde se ha hecho clic en un TWBrowse
Posted: Sat Jan 06, 2007 07:44 PM

Williams,

gracias!

regards, saludos

Antonio Linares
www.fivetechsoft.com

Continue the discussion