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



Responder a