Gracias Pablo y Pancho
Lo resolví de esta manera:
1) generé una clase textbox, que contiene código en el método gotfocus,
para cambiar el color de fondo y de las letras cuando se entra en la
celda respectiva
2) agrego a cada columna de la grid este textbox con el nombre de text2
y lo hago currentcontrol
3) en la clase, el método keypress y el método dblclick pasan lo que
reciben a los métodos keypress y dblclick del text1, que sigue en la grid
Todo funciona a la perfección
Esta es la llamada a la clase desde el programa principal:
Set Procedure to coltext.prg additive ( en este prg está la clase)
Aquí va el código de la clase:
** COLTEXT.PRG
DEFINE CLASS MYTEXT AS TEXTBOX
PROCEDURE GOTFOCUS
this.BackColor = Rgb(255,0,0) && rojo
this.ForeColor = Rgb(255,255,255) && blanco
ENDPROC
PROCEDURE KEYPRESS
LPARAMETERS nKeyCode, nShiftAltCtrl
this.Parent.text1.keypress(nKeyCode, nShiftAltCtrl)
ENDPROC
PROCEDURE DBLCLICK
this.Parent.text1.dblclick()
ENDPROC
ENDDEFINE
Y aquí lo que pongo en un método set_grid del formulario
with thisform.grid1
For i = 1 to .columncount
If not PemStatus( .columns(i),'text2',5) && si el
text2 no existe, lo agrego a la columna
.columns(i).addobject('text2','mytext')
.columns(i).currentcontrol = 'text2'
.columns(i).text2.visible = .t.
endif
endfor
endwith
El form tiene 4 grids y en cada una de ellas va el código anterior
En estas grids no se ingresan datos en forma directa, sino que todos los
cambios se hacen con llamadas a distintos forms desde el método keypress
de la columna 1 de cada grid. Por lo tanto, poniendo el código de cambio
de colores en el método gotfocus del text2 no afecta para nada el
funcionamiento de las grids
Todo el código del keypress y del dblclick va en el text1
Rafael Copquin
El 12/09/2013 16:17, francisco prieto escribió:
Rafael,
Fijate si esto te sirve...
http://computer-programming-forum.com/2-vfp/a8eae128e73646d4.htm
Saludos,
Pancho
Córdoba
El 12 de septiembre de 2013 14:59, Rafael Copquin
<[email protected] <mailto:[email protected]>> escribió:
Puse el siguiente código en una grilla:
** init event
Local oColumn As Column, oControl
For Each oColumn In This.Columns
For Each oControl In oColumn.Controls
If Pemstatus(oControl,'MouseDown',5)
Bindevent(oControl,'MouseDown',This,'MouseDown')
EndIf
endfor
EndFor
** mousedown event
LPARAMETERS nButton, nShift, nXCoord, nYCoord
Local nWhere, nRelRow, nRelCol,cBackColor,cForeColor,nCol
This.GridHitTest(nXCoord,nYCoord,@nWhere,@nRelRow,@nRelCol)
Do case
Case nWhere = 3 && celda
nCol = this.columncount - Abs(m.nRelCol)
nCol = Iif(nCol=0,1,nCol) && nCol sería 0
si hubiera solamente una columna en la grid
cBackColor =
'this.column'+Alltrim(Str(nCol))+'.text1.backcolor = '
+Transform(Rgb(255,0,0)) && rojo
cForeColor =
'this.column'+Alltrim(Str(nCol))+'.text1.forecolor = '
+Transform(Rgb(255,255,255)) && blanco
&cBackColor
&cForeColor
Otherwise
endcase
Este código hace que cada vez que se da click en cualquier celda,
ésta se torna roja con letras blancas. Sin el código de arriba, al
dar click, la celda queda "transparente" y no cambia de color.
Sin embargo, si tengo algún código en el evento dblclick del
textbox de la columna, ese código no se dispara.
Es como si el mousedown matara al doubleclick
¿Cómo puedo hacer para que funcionen los dos?
Rafael Copquin