Page 1 of 2
GRID + ON HEADCLICK
Posted: Thu Sep 24, 2020 9:52 am
by SALINETAS24
Hola a todos,
En los programas que hago, el GRID lo puede definir el usuario, por lo tanto el nº de columnas lo desconozco.
Ahora quiero implementar la ordenación por columnas usando ON HEADCLICK
Hay alguna forma de concatenar el bloque y pasarlo a modo de variable.
Code: Select all
DEFINE GRID BrowseDbf
PARENT &GestDbf1
ROW nCol
COL 5
WIDTH nAncho/2-10
HEIGHT nLargoGrid
HEADERS _aBrowNomb
WIDTHS _aBrowLong
ITEMS _aItem
VALUE 1
JUSTIFY _aBrowJust
DYNAMICBACKCOLOR _aColor
ON HEADCLICK aBlock /// --> esto tiene que ser un array
END GRID
A modo de ejemplo, cuando defino el Grid, tanto HEIGHT, HEAERS WIDTHS, ITEMS...., son arrays que contienen los valores
Lo que necesitaria es algo así....., pero no me funciona
Code: Select all
FOR nFor=1 to LEN(_aBrowNomb)
aBlock:=aBlock+"{ || ordenar_columna(nFor) }"
NEXT
Para que el define del GRID fuese algo así
Muchas gracias por anticipado y vamos con una cervecita bien fresquita....

Re: GRID + ON HEADCLICK
Posted: Thu Sep 24, 2020 11:19 am
by dragancesu
Code: Select all
#include "hmg.ch"
Function Main
Local aRows [20] [3]
DEFINE WINDOW Form_1 ;
AT 0,0 ;
WIDTH 800 ;
HEIGHT 550 ;
TITLE 'Hello World!' ;
MAIN
aRows [1] := {'Simpson','Homer','555-5555'}
aRows [2] := {'Mulder','Fox','324-6432'}
aRows [3] := {'Smart','Max','432-5892'}
aRows [4] := {'Grillo','Pepe','894-2332'}
aRows [5] := {'Kirk','James','346-9873'}
aRows [6] := {'Barriga','Carlos','394-9654'}
aRows [7] := {'Flanders','Ned','435-3211'}
aRows [8] := {'Smith','John','123-1234'}
aRows [9] := {'Pedemonti','Flavio','000-0000'}
aRows [10] := {'Gomez','Juan','583-4832'}
aRows [11] := {'Fernandez','Raul','321-4332'}
aRows [12] := {'Borges','Javier','326-9430'}
aRows [13] := {'Alvarez','Alberto','543-7898'}
aRows [14] := {'Gonzalez','Ambo','437-8473'}
aRows [15] := {'Batistuta','Gol','485-2843'}
aRows [16] := {'Vinazzi','Amigo','394-5983'}
aRows [17] := {'Pedemonti','Flavio','534-7984'}
aRows [18] := {'Samarbide','Armando','854-7873'}
aRows [19] := {'Pradon','Alejandra','???-????'}
aRows [20] := {'Reyes','Monica','432-5836'}
@ 50,10 GRID Grid_Master ;
WIDTH 760 ;
HEIGHT 180 ;
HEADERS {'Last Name','First Name','Phone'} ;
WIDTHS {140,140,140};
ITEMS aRows ;
VALUE {1,1} ;
TOOLTIP 'Editable Grid Control' ;
EDIT ;
JUSTIFY { GRID_JTFY_CENTER,GRID_JTFY_RIGHT, GRID_JTFY_RIGHT } ;
CELLNAVIGATION ;
ON INPLACEEDITEVENT ProcGridInplaceEditEvent()
@ 240,10 GRID Grid_Detail ;
WIDTH 760 ;
HEIGHT 180 ;
HEADERS {'Last Name','First Name','Phone'} ;
WIDTHS {140,140,140};
ITEMS aRows ;
VALUE 1 ;
EDIT ;
TOOLTIP 'Editable Grid Control' ;
ON HEADCLICK { {||MsgInfo('Click 1')} , {||MsgInfo('Click 2')} , {||MsgInfo('Click 3')} } ;
JUSTIFY { GRID_JTFY_LEFT,GRID_JTFY_CENTER, GRID_JTFY_CENTER };
ON INPLACEEDITEVENT ProcGridInplaceEditEvent()
END WINDOW
CENTER WINDOW Form_1
ACTIVATE WINDOW Form_1
Return
***********************************
FUNCTION ProcGridInplaceEditEvent()
Local lCellNavigation := _HMG_SYSDATA [ 32 ] [_HMG_SYSDATA [ 203 ]]
Static lInitByDblClick := .F.
DO CASE
CASE This.IsInplaceEditEventInit == .T.
lInitByDblClick := _HMG_GridEx_InplaceEdit_nMsg == WM_LBUTTONDBLCLK
CASE This.IsInplaceEditEventRun == .T.
CASE This.IsInplaceEditEventFinish == .T.
IF lCellNavigation
IF _HMG_SYSDATA [ 15 ] [_HMG_SYSDATA [ 203 ]] = 1 //first column
_HMG_SYSDATA [ 15 ] [_HMG_SYSDATA [ 203 ]] := _HMG_SYSDATA [ 15 ] [_HMG_SYSDATA [ 203 ]] + IF (lInitByDblClick, 2, 1) //skip one column
ENDIF
ELSE
IF _HMG_SYSDATA [ 340 ] = 1 //first column
_HMG_SYSDATA [ 340 ] := _HMG_SYSDATA [ 340 ] + IF (lInitByDblClick, 2, 1) //skip one column
ENDIF
ENDIF
ENDCASE
RETURN NIL
**********************************
look
http://hmgforum.com/viewtopic.php?f=5&t ... ick#p58885
Re: GRID + ON HEADCLICK
Posted: Thu Sep 24, 2020 11:28 am
by mol
Code: Select all
FOR nFor=1 to LEN(_aBrowNomb)
aBlock:=aBlock+"{ || ordenar_columna(" + hb_ntos(nFor) + ") }"
NEXT
Re: GRID + ON HEADCLICK
Posted: Thu Sep 24, 2020 11:33 am
by mustafa
Hola amic , como estas ?
No se si te puede servir este Sample que adjunto es para calcular
el número de columnas para que se organice el color automático
en el Grid
Code: Select all
*---------------------------------------------------------*
FUNCTION CreateArray_1Q()
*---------------------------------------------------------*
dbCloseAll()
SELECT 2
USE STOCK EXCLUSIVE NEW
INDEX ON REF TO Stock
CLOSE DATABASE
SELECT 2
USE STOCK INDEX STOCK
DbGOTOP()
* COUNT TO nBra1 FOR STOCK->REF >= 0
* DBEVAL( {|| AADD( arows32,{ STOCK->REF,STOCK->PRODUCTO,STOCK->TIPO,TRAN(STOCK->PRECIO, "@E 999,999.99"),STOCK->CBARRAS ,STOCK->VECTOR } )})
nCount := STOCK->( FCOUNT() ) // <---- Saber Número Columnas del Grid para el Color Automático
aGrid := {}
DO WHILE ! STOCK->( Eof())
AADD( aGrid , { STOCK->REF,STOCK->PRODUCTO,STOCK->TIPO,TRAN(STOCK->PRECIO,"@E 999,999.99"),STOCK->CBARRAS ,STOCK->VECTOR } )
STOCK->(DbSkip())
ENDDO
Return Nil
*---------------------------------------------------------*
Procedure SearchChange_3()
*---------------------------------------------------------*
Local cTxt, nLen, i
cTxt := GetProperty( 'Form_50','Text_002X','Value' )
nLen := Len( cTxt )
// Nesse ponto preciso saber qual o número da coluna da Grid
nCol:= Form_50.Grid_6.Col
Form_50.Grid_6.DeleteAllItems
// Procura o texto
For i := 1 To Len( aGrid )
If Upper( cTxt ) = Upper( Left( aGrid [ i ] [ 2] , nLen ) ) // [ 2] <------- PRODUCTO
Form_50.Grid_6.AddItem ( aGrid [ i ] )
Endif
Next
Return
Cuidarse del maldito "bixu"
Salud
Mustafa
Re: GRID + ON HEADCLICK
Posted: Thu Sep 24, 2020 2:24 pm
by srvet_claudio
See:
<GridControlName>.ColumnONHEADCLICK ( nColIndex ) := bColumnOnHeadClick
Re: GRID + ON HEADCLICK
Posted: Thu Sep 24, 2020 4:30 pm
by SALINETAS24
Muchas gracias a todos por la rápida respuesta.
Lo mejor que tiene HMG es sin duda la ayuda desinteresada que prestáis en el foro..., sois todos una gente magnifica!!!!.
Y después de esto vamos al grano.
Lo que andaba buscando fue lo que indicó srvt_claudio, pero al trabajar con los nombre de las pantallas en variables lo cambie por esto.. y funciona
Code: Select all
FOR nFor=1 to LEN(_aBrowNomb)
SetProperty (GestDbf1, "BrowseDbf", "ColumnOnHeadClick ", nFor,;
{|| ordena(nFor) } )
next
Muchas gracias y vamos con esa cervecita, bien fresquita....... !!!

Re: GRID + ON HEADCLICK
Posted: Thu Sep 24, 2020 9:22 pm
by SALINETAS24
Hola de nuevo.
He tenido un problema, cada vez que ejecutaba la función "ordena(nFor)" la variable "nFor" siempre tenia el mismo valor, (lo podeis comprobar), con lo cual resulta imposible saber en que columna de la cabecera se hizo CLICK. Así que he tenido que cambiar y reajustar y ahora ya funciona correctamente.
Code: Select all
// nueva carga del bloque
FOR nFor=1 to LEN(_aBrowNomb)
B:=STR(nFor)
A:={ { || ordena(&B)} }
aadd(aBlock,a[1] )
NEXT
DEFINE GRID BrowseDbf
PARENT &GestDbf1
ROW nCol
COL 5
WIDTH nAncho/2-10
HEIGHT nLargoGrid
HEADERS _aBrowNomb
WIDTHS _aBrowLong
ITEMS _aItem
VALUE 1
JUSTIFY _aBrowJust
DYNAMICBACKCOLOR _aColor
ON HEADCLICK aBlock /// --> esto tiene que ser un array
END GRID
Después he creado una función que ordena el GRID por cualquier columna (sin indices), rápido y veloz...,
Code: Select all
FUNCTION ORDENA(nOrden)
LOCAL nFor,nFor1,xVar,xVar1
LOCAL nFin:= GetProperty (GestDbf1,"BrowseDbf","ItemCount") // Nº DE ELEMENTOS
LOCAL aTemp:=aTemp1:={}
LOCAL aFalsa:={}
FOR nFor=1 TO nFin
AADD(aTemp,GetProperty (GestDbf1,"BrowseDbf","Item",nFor) )
NEXT
FOR nFor:=1 TO nFin
FOR nFor1:= 1 to nFin
IF nFor != nFor1
IF aTemp[nFor][nOrden] < aTemp[nFor1][nOrden]
aFalsa := aTemp[nFor1]
aTemp1[nFor1]:= aTemp[nFor]
aTemp[nFor] := aFalsa
ENDIF
ENDIF
NEXT
NEXT
DoMethod( GestDbf1,"BrowseDbf","DeleteAllItems")
FOR nFor:=1 TO nFin
DoMethod( GestDbf1,"BrowseDbf","AddItem",aTemp[nFor] )
NEXT
/*
// Código desechado.....
// Esta parte de aquí es lenta.., lenta..., lenta... muy lenta.
FOR nFor:= 1 to nFin
FOR nFor1:= 1 to nFin
aTemp:=GetProperty (GestDbf1,"BrowseDbf","Item",nFor) // SACO VALORES
xVar:=aTemp[nOrden] // Cargo la columna que compara
IF nFor != nFor1 // Estoy comprando distintos registros
aTemp1:=GetProperty (GestDbf1,"BrowseDbf","Item",nFor1)
xVar1:=aTemp1[nOrden] // Cargo la 2ªcolumna que compara
IF xVar < xVar1
// Intercambio posicoines
SetProperty (GestDbf1,"BrowseDbf","Item",nFor,aTemp1)
SetProperty (GestDbf1,"BrowseDbf","Item",nFor1,aTemp)
xVar:=xVar1
ENDIF
ENDIF
NEXT
NEXT
*/
RETURN
Lo dicho anteriormente, muchas gracias por vuestros consejos y esta ronda la pago yo....
vamos con una cervecita frequita....

Re: GRID + ON HEADCLICK
Posted: Fri Sep 25, 2020 5:09 am
by mol
Code: Select all
FOR nFor=1 to LEN(_aBrowNomb)
B:=STR(nFor)
A:="{ || ordena(" + B + ") }"
aadd(aBlock, & A )
NEXT
You have to build array of blocks.
You can't use your local variable in block because it's unknown in time of block execution
Re: GRID + ON HEADCLICK
Posted: Fri Sep 25, 2020 6:41 am
by SALINETAS24
Hola a todos...
mustafa wrote: ↑Thu Sep 24, 2020 11:33 am
Hola amic , como estas ?
No se si te puede servir este Sample que adjunto es para calcular
el número de columnas para que se organice el color automático
en el Grid
Con el permiso del "amic" Mustafa he modificado su código y le he incorporado mi rutina para poder ordenar por cualquier columna.
mol wrote: ↑Fri Sep 25, 2020 5:09 am
Code: Select all
FOR nFor=1 to LEN(_aBrowNomb)
B:=STR(nFor)
A:="{ || ordena(" + B + ") }"
aadd(aBlock, & A )
NEXT
You have to build array of blocks.
You can't use your local variable in block because it's unknown in time of block execution
Hola Mol, como puedes comprobar el código que yo pongo funciona, (el tuyo no lo he probado

), lo único que hay que tener en cuenta es definir las variables como PRIVATE.
Un saludo a todos y vamos con la cervecita....!!
Re: GRID + ON HEADCLICK
Posted: Fri Sep 25, 2020 7:01 am
by SALINETAS24
Perdon..,
mustafa wrote: ↑Thu Sep 24, 2020 11:33 am
Hola amic , como estas ?
.......
Salud
Mustafa
Todo bien y bajo control (de momento).
Me he vuelto a tomar la libertad y te he modificado el código.
He visto que realizas una busca alfabetica, ahora te he cambiado el patrón y con esta modificación te busca por aproximación, no hace falta que la cadena empiece igual, puedes buscar una palabra.... pruebalo y me dices.
Ahora si que me tomo la cervecita..., una caña como un cañon !!
