FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Indexar un listbox dando click en el encabezado
Posts: 131
Joined: Tue Dec 26, 2006 04:50 PM
Indexar un listbox dando click en el encabezado
Posted: Mon Mar 08, 2010 04:23 PM

Asi de simple como parece no he podido hacer que el usuario pueda ordenar el contenido de un browse dando click en la columna correspondiente, estoy usando un Browse simple:

define dialog oDialsv resource "DLGVERDB6" of oVentprinc title "Test"
redefine listbox oLbx1sv FIELDS clientes->nombre,cliente->direccion,clientes-ciudad.....
redefine button oBtn1sv ID 23 of oDialsv action(oDialsv:end(),repos:=report_no,conts:=continue,encuesta())
redefine button oBtn2sv ID 24 of oDialsv action (oDialsv:end(),cicsur:="N")
activate dialog oDialsv center

La pregunta es como puedo hacer que el usuario pueda tener esta caracteristica usando el brose que ya tengo desarrollado?

Les agradezco mucho la ayuda que me puedan brindar.

Saludos.

Posts: 1076
Joined: Fri Oct 07, 2005 10:41 PM
Re: Indexar un listbox dando click en el encabezado
Posted: Mon Mar 08, 2010 06:37 PM
Puedes hacer que en el bloque click del header le cambies en el caso de CDX el TAG correspondiente y en el caso de NTX el indice respectivo.

por ejemplo con xbrowse.
Code (FW): Select all Collapse
oBrw := TXBrowse():new( oDlg )
oBrw:aCols[1]:bLClickHeader :={|| mi_alias->(dbsetorder( "indice1"), oBrw:refresh())


As铆 podr铆a ser una idea.
William, Morales

Saludos



m茅xico.sureste
Posts: 34
Joined: Tue Dec 30, 2008 07:22 PM
Re: Indexar un listbox dando click en el encabezado
Posted: Mon Mar 08, 2010 07:16 PM
Yo por ejemplo lo hago con el bRclicked(), pero bueno, eso ya es cueti贸n de gustos...

aqu铆 te dejo algo de c贸digo por si te puede servir para coger ideas, est谩 hecho para TSbrowse.

Code (fw): Select all Collapse
#include "FiveWin.ch"
#include "TSBrowse.ch"

#define CLR_PINK 聽 nRGB( 255, 128, 128)
#define CLR_NBLUE 聽nRGB( 128, 128, 192)
#define CLR_1 nRGB( 190, 215, 190 )聽// Azul Clarito
#define CLR_2 nRGB( 230, 230, 230 )聽// Gris muy Clarito
#define CLR_3 nRGB( 217, 217, 255 )聽// Morado Clarito

//----------------------------------------------------------------------------//
// Nueva implementaci贸n con la clase TSBrowse de Manuel Mercado.
FUNCTION Browse3( cTitle, cListName, bNew, bModify, bDelete, bSearch, bList, oParWnd, oDbf )

聽 聽LOCAL oDlg, oLbx, oFont, nOrden
聽 聽LOCAL btnList, btnEnd, i, aFields:={}

聽 聽//Guardamos el orden de entrada.
聽 聽nOrden:= IndexOrd()

聽 聽
聽 聽DEFAULT cTitle 聽:= "Ver fichas ", cListName := "",;
聽 聽 聽 聽 聽 聽bList 聽 := { || Reporte( oLbx ) }

聽 聽DEFINE FONT oFont NAME "Arial" SIZE 0, -12 //BOLD

聽 聽DEFINE DIALOG oDlg FROM 3, 3 TO 26, 79 TITLE cTitle FONT oFont

聽 聽@ 0, 1 SAY cListName 聽OF oDlg

聽 聽@ 1, 1 BROWSE oLbx SIZE 284, 137 OF oDlg FONT oFont;
聽 聽 聽 聽 聽 ON CHANGE ( IF(oDbf!=NIL,oDbf:Gather(),), IF( oParWnd!=NIL,oParWnd:Update(),) );
聽 聽 聽 聽 聽 ON dblClick ( oDlg:End() )

聽 聽oLbx:LoadFields( .F. )
聽 聽oLbx:nLineStyle := LINES_DOTTED 
聽 聽oLbx:nHeightHead += 4
聽 聽oLbx:lMoveCols := .T. 
聽 聽oLbx:nAdjColumn := 0

聽 聽aFields:= DbStruct()
聽 聽FOR i:=1 TO LEN( oLbx:aColumns )
聽 聽 聽 聽oLbx:aColumns[ i ]:cHeading:= UPPER( oLbx:aColumns[ i ]:cHeading )
聽 聽 聽 聽oLbx:aColumns[ i ]:l3DLookHead:=.T.
聽 聽 聽 聽oLbx:SetColSize( i, oLbx:aColumns[ i ]:nWidth + 42 )
聽 聽 聽 聽IF aFields[i][2] = "N"聽 聽// Num茅rico
聽 聽 聽 聽 聽oLbx:aColumns[ i ]:nAlign:= 2
聽 聽 聽oLbx:aColumns[ i ]:nHAlign:= 0
聽 聽 聽 聽ENDIF
聽 聽 聽 聽//oLbx:Set3DText( , , 聽i , 2 聽) 
聽 聽NEXT

聽 聽// Seteo de colores del Browse.
聽 聽oLbx:SetColor( { 2, 3, 4, 5, 6, 15 },{ { | Pos | If( Pos % 2 = 0, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 CLR_3, CLR_2 ) }, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 CLR_WHITE,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 { CLR_WHITE, CLR_BLUE },;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 CLR_WHITE,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 { CLR_WHITE, CLR_BLACK },;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 CLR_BLUE })

聽 聽
聽 聽//Botones del dialogo
聽 聽@ 10.4, 33.6 BUTTON btnList 聽 PROMPT "&Imprimir" OF oDlg SIZE 40, 12
聽 聽@ 10.4, 41.7 BUTTON btnEnd 聽 聽PROMPT "&Salir" 聽 聽OF oDlg SIZE 40, 12


聽 聽btnList:bAction 聽 = { || Eval( bList ), oLbx:Refresh() }
聽 聽btnEnd:bAction 聽 聽= { || oDlg:End() }

聽 聽// Para ejecutar la funci贸n de ordenar por la columna.
聽 聽oLbx:bRClicked := {|nRowPix, nColPix| CreaIndice( oLbx, oDbf, aFields, oLbx:nATCol(nColPix)) }


聽 聽ACTIVATE DIALOG oDlg Centered;
聽 聽 聽 聽 聽 聽 ON PAINT FillWnd( oDlg, nRGB( 13, 147, 185 ),, 10 );
聽 聽 聽 聽 聽 聽 ON INIT CampoIndice( oLbx, aFields );
聽 聽 聽 聽 VALID ( DBSETORDER(nOrden), .T. )
// En el ON INIT estamos colocando como primera columna al campo clave del 铆ndice activo

RELEASE FONT oFont

return nil


//----------------------------------------------------------------------------//
// Colocaci贸n del campo 铆ndice activo como primera columna en el browse
//----------------------------------------------------------------------------//
STATIC FUNCTION CreaIndice( oLbx, oDbf, aFields, nCol )
LOCAL aIndices:={}, aIndices2:={}, n, j

//Averiguamos si el campo ya tiene un 铆ndice activo, en caso de tenerlo lo activamos
//En caso contrario generamos un 铆ndice temporal y lo a帽adimos a los 铆ndices activos.
//Cambiamos la columna a la 1陋 posici贸n en el browse.


//Indices en uso del fichero:
FOR j := 1 TO 15
聽 聽IF !Empty( cExpKey:= IndexKey( j ) )
聽 聽 聽 AADD( aIndices2, 聽ORDBAGNAME(j) 聽)
聽 聽 聽 聽 聽IF (n := AT("(", cExpKey)) > 0//n > 0 聽 //Quitamos los caracteres STR(
聽 聽 聽 聽 聽 聽 cExpKey:= LEFT(cExpKey, n-4) + RIGHT(cExpKey, LEN(ALLTRIM(cExpKey))-n )
聽 聽 聽 聽 聽ENDIF
聽 聽 聽 聽 聽IF (n := AT(")", cExpKey) ) > 0聽 聽 //n > 0 聽 //Quitamos los caracteres ,n,y)
聽 聽 聽 聽 聽 聽 cExpKey:= LEFT(cExpKey, n-5) + RIGHT(cExpKey, LEN(ALLTRIM(cExpKey))-n )
聽 聽 聽 聽 聽ENDIF
聽 聽 聽 聽 聽IF (n := AT("+", cExpKey) ) >0聽//n > 0 //Quitamos todo lo que est谩 por detr谩s del caracter +
聽 聽 聽 聽 聽 聽 cExpKey:=LEFT(cExpKey, n-1)
聽 聽 聽 聽 聽ENDIF
聽 聽 聽 AADD( aIndices, 聽UPPER(cExpKey) 聽)
聽 聽 ENDIF
NEXT

IF ( n:=ASCAN( aIndices, oLbx:aColumns[ nCol ]:cHeading 聽) ) > 0
聽 聽//Ya existe ese 铆ndice
聽 聽//Ponemos el orden como activo.
聽 聽DBSETORDER(n)
ELSE
聽 聽//Creamos un 铆ndice si no existe.
聽 聽CreaIndex( oLbx:aColumns[ nCol ]:cHeading, aIndices2 )
聽 聽SET INDEX TO
聽 聽FOR j := 1 TO LEN( aIndices2 )
聽 聽 聽oDbf:AddIndex(aIndices2[j],aIndices2[j])
聽 聽NEXT
聽 聽SELECT( oDbf:cAlias )
聽 聽DBSETORDER( LEN(aIndices2) )
ENDIF

//Cambiamos el campo 铆ndice como 1陋 columna
oLbx:MoveColumn( nCol, 1 )
oDbf:GoFirst()
oLbx:GoTop()
oLbx:Reset()

RETURN NIL

//----------------------------------------------------------------------------//
// Colocaci贸n del campo 铆ndice activo como primera columna en el browse
//----------------------------------------------------------------------------//
STATIC FUNCTION CreaIndex( cHeading, aIndices2 )
LOCAL tempind1, passind, pasfor

tempind1 = "CC" + SUBSTR(TIME(),1,2) + SUBSTR(TIME(),4,2) + SUBSTR(TIME(),7,2) + ".ntx"
passind 聽= cHeading聽//"Recno()"
passfor 聽= "Recno() > 0"

MsgMeter( { | ometer, otext, odlg, lend | genindex( ometer, otext, odlg, @lend, tempind1, passind, passfor ) }, ;
聽 聽 聽 聽 聽 聽 "Ordenando fichero ...", "Ordenando fichero ...." )
AADD( aIndices2, 聽tempind1 聽)

RETURN NIL

//----------------------------------------------------------------------------//
// Creaci贸n del fichero 铆ndice temporal.
//----------------------------------------------------------------------------//
STATIC FUNCTION genindex( ometer, otext, odlg, lend, tempind1, passind, passfor )
LOCAL cDbf
cDbf:=ALIAS()
ometer:ntotal := LASTREC()

INDEX ON &passind TO &tempind1 聽FOR &passfor ;
聽 聽EVAL ( ometer:SET( RECNO() ), otext:settext("Ordenando ficha " + ALLTRIM(STR(RECNO()))), ;
聽 聽sysrefresh(), !lend )

RETURN( nil )

//----------------------------------------------------------------------------//
// Colocaci贸n del campo 铆ndice activo como primera columna en el browse
//----------------------------------------------------------------------------//
STATIC FUNCTION CampoIndice( oLbx, aFields )
LOCAL nOrden, cExpKey
聽 聽//Posicionamiento de campo 铆ndice activo en primer lugar.
聽 聽nOrden:= IndexOrd()
聽 聽cExpKey:= IndexKey( nOrden )
聽 聽IF LEN(ALLTRIM(cExpKey)) > 0
聽 聽 聽 n := AT("(", cExpKey)聽//Quitamos los caracteres STR(
聽 聽 聽 IF n > 0
聽 聽 聽 聽 聽cExpKey:= LEFT(cExpKey, n-4) + RIGHT(cExpKey, LEN(ALLTRIM(cExpKey))-n )
聽 聽 聽 ENDIF
聽 聽 聽 n := AT(")", cExpKey)聽//Quitamos los caracteres ,n,y)
聽 聽 聽 IF n > 0
聽 聽 聽 聽 聽cExpKey:= LEFT(cExpKey, n-5) + RIGHT(cExpKey, LEN(ALLTRIM(cExpKey))-n )
聽 聽 聽 ENDIF
聽 聽 聽 n := AT("+", cExpKey)聽//Quitamos todo lo que est谩 por detr谩s del caracter +
聽 聽 聽 IF n > 0
聽 聽 聽 聽 聽cExpKey:=LEFT(cExpKey, n-1)
聽 聽 聽 ENDIF
聽 聽 聽 //La movemos a la primera columna
聽 聽 聽 IF (nPos:=ASCAN( aFields, {|x| x[1] = UPPER(cExpKey) } ) ) > 0
聽 聽 聽 聽 聽oLbx:MoveColumn( nPos, 1 )
聽 聽 聽 ENDIF
聽 聽ENDIF

RETURN NIL
Pedro

FWH9.06 / XMate 1.15 / Borland C++ 5.5.1 / xHarbour build 1.1.0 Intl. (SimpLex) (Rev. 6195)
Posts: 1710
Joined: Tue Oct 28, 2008 06:26 PM
Re: Indexar un listbox dando click en el encabezado
Posted: Tue Mar 09, 2010 12:54 PM
Mario, tenes que usar TAG en tus indices

Code (fw): Select all Collapse
//En el programas de 铆ndices
USE DATOS ALIAS DATPER EXCLUSIVE
INDEX On NOMBRE  TAG DATOS1
INDEX On CARGO  TAG DATOS2
DATPER->( dBCloseArea() )
...
//En el programa del Browse
Use DATOS INDEX DATOS ALIAS DATPER NEW SHARED
 
  DEFINE DIALOG oDlg RESOURCE "MUESTRA" Title 'MUESTRA DATOS PERSONALESS'
   oBrw:=TXBrowse():New( oDlg )
   oBrw:nMarqueeStyle:=MARQSTYLE_HIGHLROW
   oBrw:nColDividerStyle:= LINESTYLE_LIGHTGRAY
   oBrw:nRowDividerStyle:= LINESTYLE_LIGHTGRAY
      
   oCol:=oBrw:AddCol()
   oCol:bStrData  := { || DATPER->NOMBRE}
   oCol:nHeadStrAlign := AL_CENTER
   oCol:cHeader:= "NOMBRE"
   oCol:nWidth:=200
   oCol:cSortOrder:="DATOS1"
   oCol:bLClickHeader:= {|| oBrw:Gotop() }  //Por si queres que puntero se vaya al inicio
   
   oCol:=oBrw:AddCol()
   oCol:bStrData  := { || DATPER->CARGO}
   oCol:nHeadStrAlign := AL_CENTER
   oCol:cHeader:= "CARGO"
   oCol:nWidth:=150
   oCol:cSortOrder:="DATOS2"
   oCol:bLClickHeader:= {|| oBrw:Gotop() } 
 
   oBrw:CreateFromCode()

  ACTIVATE DIALOG oDlg CENTERED

Dando Click sobre el Header se ordena por esa columna si le volves a dar se invierte el orden

Saludos

Adhemar
Saludos,



Adhemar C.
Posts: 131
Joined: Tue Dec 26, 2006 04:50 PM
Re: Indexar un listbox dando click en el encabezado
Posted: Tue Mar 09, 2010 03:37 PM
Compa帽eros del foro, muchas gracias por su apoyo hasta el momento no he logrado implementar esta opci贸n, al compilar me aparece el error:

Error description: Error BASE/1005 Message not found: TXBRWCOLUMN:_CSORTORDER
Stack Calls
===========
Called from TXBRWCOLUMN:ERROR(175)
Called from (b)HBOBJECT(105)
Called from TXBRWCOLUMN:MSGNOTFOUND(0)
Called from TXBRWCOLUMN:_CSORTORDER(167)
Called from INVGRAL(67)
Called from (b)CREAMENU(388)
Called from TMENU:COMMAND(0)
Called from TWINDOW:COMMAND(0)
Called from TMDIFRAME:COMMAND(0)
Called from TMDIFRAME:HANDLEEVENT(0)
Called from _FWH(0)
Called from WINRUN(0)
Called from TMDIFRAME:ACTIVATE(0)
Called from MAIN(139)

Estoy usando la versi贸n 2.6 de Fivewin (si, es algo "viejita"), posiblemente esta versi贸n no soporta esta caracteristica, por cuestiones de "presupuesto" no he podido actualizar a la ultima versi贸n, asi que si este es el problema tendr茅 que seguir con 茅l y dejar a los usuarios sin esta caracteristica, a menos de que se pueda hacer de otra manera :-)

Disculpen mi novatez en este tema, pero no estoy seguro de si el"TXBROWSE" es generado en un dialogo independiente o puede ser asociado a un recurso dentro de un dialogo con otros elementos? (por ejemplo ID 100 of oDialogo)?

Muchas gracias nuevamente por el apoyo


Aqui les paso mi codigo a ver si alguien tiene una idea para mejorarlo
Code (fw): Select all Collapse
Function invgral
聽 聽local oDialig, oBtn1ig, oBtn2ig, oBtn3ig, oSay1ig, oLbx1ig
聽 聽close all
聽 聽use &dbmapt shared new alias parts
聽 聽index on part_no TAG iXpar
聽 聽index on descr TAG iXdes3
聽 聽index on descreal TAG iXdesc
聽 聽*index on part_no to &dbidx1
聽 聽copy to &dbtmp1
聽 聽close all
聽 聽use &dbmapt shared new alias parts
聽 聽define dialog oDialig resource "DLGVERDB4" of oVentprinc title "Inventario en almacen"
聽 聽redefine say oSay1ig prompt "Inventario general en almacen" id 1 of oDialig
聽 聽oBrw:=TXBrowse():New( oDialig )
聽 聽oBrw:nMarqueeStyle:=MARQSTYLE_HIGHLROW
聽 聽oBrw:nColDividerStyle:= LINESTYLE_LIGHTGRAY
聽 聽oBrw:nRowDividerStyle:= LINESTYLE_LIGHTGRAY

聽 聽oCol:=oBrw:AddCol()
聽 聽oCol:bStrData 聽:= { || parts->part_no}
聽 聽oCol:nHeadStrAlign := AL_CENTER
聽 聽oCol:cHeader:= "No. de parte"
聽 聽oCol:nWidth:=200
聽 聽*oCol:cSortOrder:="iXpar"
聽 聽oCol:bLClickHeader:= {|| oBrw:Gotop() } 聽//Por si queres que puntero se vaya al inicio

聽 聽oCol:=oBrw:AddCol()
聽 聽oCol:bStrData 聽:= { || parts->descr}
聽 聽oCol:nHeadStrAlign := AL_CENTER
聽 聽oCol:cHeader:= "Descripci贸n 3M"
聽 聽oCol:nWidth:=150
聽 聽*oCol:cSortOrder:="iXdes3"
聽 聽oCol:bLClickHeader:= {|| oBrw:Gotop() }

聽 聽oCol:=oBrw:AddCol()
聽 聽oCol:bStrData 聽:= { || parts->descreal}
聽 聽oCol:nHeadStrAlign := AL_CENTER
聽 聽oCol:cHeader:= "Descripci贸n CS"
聽 聽oCol:nWidth:=150
聽 聽*oCol:cSortOrder:="iXdesc"
聽 聽oCol:bLClickHeader:= {|| oBrw:Gotop() }

聽 聽oBrw:CreateFromCode()

/* 聽 redefine listbox oLbx1ig fields substr(parts->part_no,1,2)+"-"+substr(parts->part_no,3,4)+"-"+substr(parts->part_no,7,4)+"-"+substr(parts->part_no,11,1),;
聽 聽parts->descr, parts->descreal, str(parts->q_bal), parts->commodity, parts->location id 0 of oDialig alias "parts";
聽 聽headers "No. de parte","Descripci贸n 3M","Descripci贸n CS","Cantidad","Commodity","Ubicaci贸n"*/
聽 聽redefine button oBtn1ig ID 2 of oDialig prompt"&Imprimir" action(oDialig:end(),impres())
聽 聽redefine button oBtn2ig ID 3 of oDialig prompt"&Exportar" action (oDialig:end(),expres())
聽 聽redefine button oBtn3ig ID 4 of oDialig prompt"&Regresar" action (odialig:end())
聽 聽activate dialog oDialig center
return
Posts: 1076
Joined: Fri Oct 07, 2005 10:41 PM
Re: Indexar un listbox dando click en el encabezado
Posted: Tue Mar 09, 2010 04:19 PM
mariordz,

Efectivamente puede ser una limitaci贸n de la versi贸n que tienes.

Te comento que Antonio Linares ha liberado la versi贸n 6.2

aqui el link
http://forums.fivetechsupport.com/viewtopic.php?f=6&t=16842&hilit=libre

Espero te sirva
William, Morales

Saludos



m茅xico.sureste

Continue the discussion