Page 1 of 2

GRID - HEADER / CABECERA

Posted: Mon Dec 19, 2022 1:49 pm
by SALINETAS24
Hola a todos.

El la definición del GRID puedo usar [ ON HEADCLICK <abBlock> ] para cuando pulso la cabecera del GRID.
Cuando tengo varias columnas, (por ejemplo 6), creo aBlock de esta forma y me funciona sin problemas

FOR nFor=1 to 6
B:=STR(nFor)
A:={ { || ordena(&B)} }
aadd(aBlock,a[1] )
NEXT

El parametro "&B" me indica la cabecera que ha pulsado el usuario.

Mi pregunta, ¿hay alguna función que me devuelva el nº cabecera/columna que he pulsado en la cabecera del GRID..? Algo como ( This.CellColIndex ) pero para la cabecera y evitar asi pasar el parametro &B

Gracias a todos por vuestra colaboración y vamos con una cervecita fresquita!!!

Re: GRID - HEADER / CABECERA

Posted: Mon Dec 19, 2022 4:48 pm
by ASESORMIX
Hola.
Puedes usar esto

ON HEADCLICK { {||MsgInfo('Click 1')} , {||MsgInfo('Click 2')} , {||MsgInfo('Click 3')} }

Re: GRID - HEADER / CABECERA

Posted: Mon Dec 19, 2022 7:07 pm
by SALINETAS24
ASESORMIX wrote: Mon Dec 19, 2022 4:48 pm Hola.
Puedes usar esto

ON HEADCLICK { {||MsgInfo('Click 1')} , {||MsgInfo('Click 2')} , {||MsgInfo('Click 3')} }
Hola ASESORMIX, gracias por contestar.
Eso lo conozco, es parecido a usar el bucle FOR que yo he puesto en el primer comentario.

Pero no me sirve, Lo que busco (que no se si existe), si hay alguna forma de conocer que columna de la Cabecera del Grid ha pulsado el usuario..

Gracias

Re: GRID - HEADER / CABECERA

Posted: Mon Dec 19, 2022 8:03 pm
by Red2
Thank you for your question SALINETAS24.
I also want to know how to determine the column number when a Grid Header is pressed.

Red2

Re: GRID - HEADER / CABECERA

Posted: Mon Dec 19, 2022 9:08 pm
by SALINETAS24
Hola a todos.
El los fuentes, en el programa h_windows.prg y en partir de línea 2680 he encontrado el siguiente código

Code: Select all

				* Browse Header Click .........................

				If GetNotifyCode ( lParam ) =  LVN_COLUMNCLICK
					if ValType ( _HMG_SYSDATA [ 17 ] [i] ) == 'A'
						lvc := GetGridColumn(lParam) + 1
						if HMG_LEN (_HMG_SYSDATA [ 17 ] [i]) >= lvc
							_DoControlEventProcedure ( _HMG_SYSDATA [ 17 ] [i] [lvc] , i )
						EndIf					
					EndIf
					Return 0
				EndIf
Por lo que yo creo entender la variable LVC que genera la función GetGridColumn(lParam) contiene el numero de columna de cabecera que ha sido pulsado ya que posteriormente envia a _DoControlEventProcedure() la funcion correspondiente, que se encuentra archivada en _HMG_SYSDATA[17]

He intentado ejecutar este trozo de programa, copiandolo en el mio pero me da error.

Si alguien conoce mejor los fuentes y me puede orientar, agradecido.

Cerveza fresca para todos el mundo.

Re: GRID - HEADER / CABECERA

Posted: Tue Dec 20, 2022 9:25 pm
by franco
Could you not send a parameter to your own function.
Private myheadclick := 0
ON HEADCLICK { {|| mycheckclick(1))} , {|| mycheckclick(2)} , {||mycheckclick(3)} }
Function mycheckclick
parameter H
myheadckick := H
return

Franco

Re: GRID - HEADER / CABECERA

Posted: Tue Dec 20, 2022 10:27 pm
by Red2
Hi SALINETAS24,

En parte de mi código, tengo un comentario de que GetGridColumn() es una función solo de MiniGUI.
Me pregunto si esto es parte del error que tuviste.

In some of my code I have a comment that GetGridColumn() is an MiniGUI only function.
I wonder if this is part of the error you had.

Red2

Re: GRID - HEADER / CABECERA

Posted: Wed Dec 21, 2022 7:59 am
by SALINETAS24
Muchas gracias a todos por contestar. :D
Ya lo tengo resuelto!!! 8-)

Lo que persigo es hacer una "FUNCION" generica que se pueda llamar usando solo variables definidas como locales. Si pasamos una variable usando "&" tienen que ser definidas como privadas y eso no lo quiero.
Aquí os paso la solución.

Se define el grid

Code: Select all

LOCAL cWinSplitGrid:="WINMAIN"
LOCAL cGridNombre:="GRID"


	FOR nFor=1 TO LEN(_aGridLongitud)
		aCadena:={}
		aCadena:={ { || _ORDENARGRID(cWinSplitGrid,cGridNombre)} }	
		nAnchoGrid+=_aGridLongitud[nFor]
		AADD(_aBlock,aCadena[1])
	NEXT


	DEFINE GRID &cGridNombre
		PARENT	&cWinSplitGrid 
		ROW 	110
		COL		5
		...../...
		ON HEADCLICK _aBlock			
	END GRID
Y esta sería la funcion

Code: Select all


PROC _ORDENARGRID(cWinSplitGrid,cGridNombre) 
LOCAL nPos := ASCAN ( _HMG_SYSDATA [3] ,  EventHWND() )
LOCAL nFor, nColIni, nColFin,nColum, nPulsa1
LOCAL aCell:={}  
	// Obtengo posicion donde hice CLICK
	aCell:=_GetGridCellData(nPos)
	nColIni:= GETPROPERTY (cWinSplitGrid,cGridNombre,"COL")
	nColum:=  GETPROPERTY (cWinSplitGrid,cGridNombre,"ColumnCOUNT")
	nPos:=0
	FOR nFor:=1 TO nColum-1
		IF nPos=0
			nPulsa1:= GETPROPERTY (cWinSplitGrid,cGridNombre,"ColumnWIDTH",nFor)
			nColFin:=nColIni+nPulsa1
			IF aCell[1]>=nColIni .AND. aCell[1]<=nColFin	
				nPos:=nFor
			ENDIF
			nColIni+=nPulsa1
		ENDIF
	NEXT
	IF nPos=0
		nPos:=nColum
	ENDIF
	MSGBOX("COLUMNA "+STR(nPos))
RETURN

Espero que os guste y que lo podáis aprovechar.
Vamos con una cervecita fresquita para todos, que esta ronda la pago yo!!!! :lol:

Re: GRID - HEADER / CABECERA

Posted: Sun Jan 26, 2025 2:19 pm
by tonton2
Bonjour a toute l'équipe .
"voilla un programme d'entrée de produits dans une base de donnée ENSTOCKDBF.DBF en choisissant le produit dans une base CONSTART.DBF .je voudrais remplacer la recherche effectuée par COMBOBX dans la grille GRDSTOCK par une recherche dynamique par lettre"
translation google :
Hi!
"Here is a program for entering products into a database ENSTOCKDBF.DBF by selecting the product from a CONSTART.DBF database. I would like to replace the search done by COMBOBOX in the GRDSTOCK grid with a dynamic letter-based search."
Thank's

Re: GRID - HEADER / CABECERA

Posted: Sun Jan 26, 2025 6:25 pm
by franco
SALINETAS24, I like simple. This is how I would handle this. Not sure if it would work for you.

Code: Select all

program
private g2h := 0                     
Define win
Define Grid Grid_2
ONHEADCLICK { {|| g2h:=1,msgbox(g2h),g2h:=0 }, {|| g2h:=2,something(),g2h:=0 }}