Page 1 of 1

Terminar escritura en un xbrowse(array) SOLUCIONADO

PostPosted: Wed Mar 10, 2010 10:57 pm
by Pedro
Hola a todos

Bueno no cabía el título entero, así que explico lo que me pasa.
Tengo un diálogo con un folder, en el folder 5 pestañas, cada pestaña es un xbrowse, todos los xbrowse son arrays, las dos primeras y la cuarta son arrays de diez registros y un solo campo de cien digitos cada uno, el tercero es un array de 3 registros y al igual que los otros de cien digitos cada registro.
El tema es que el cliente me pide que cuando se posicione en el campo pueda comenzar a escribir, y que cuando llegue a los cien digitos, pase al campo siguiente y siga escribiendo. Ya llevo dos días con el tema y, o estoy más despistado que un esquimal en el kalahari o no doy con la solución.
Los browses son sencillos y he mirado los ejemplos pero no doy pie con bola. Este es el código a ver si me tirais una ayudita.
Code: Select all  Expand view
REDEFINE FOLDER oFolder ;
            PROMPT "SINTOMAS","EXPLORACION","DIAGNOSTICO","TRATAMIENTO","FACTURAS";
            DIALOGS "SINTOMAS","EXPLORACION","DIAGNOSTICO","TRATAMIENTO","NOTAS";
            ID 2001 OF oDlgHis
*-------------------------------------------------------------------------------            
      REDEFINE XBROWSE oBrw[1] ID 3001 OF oFolder:aDialogs[ 1 ] ARRAY aSintoma AUTOCOLS
      REDEFINE XBROWSE oBrw[2] ID 3001 OF oFolder:aDialogs[ 2 ] ARRAY aExplora AUTOCOLS
      REDEFINE XBROWSE oBrw[3] ID 3001 OF oFolder:aDialogs[ 3 ] ARRAY aDiagnos AUTOCOLS
      REDEFINE XBROWSE oBrw[4] ID 3001 OF oFolder:aDialogs[ 4 ] ARRAY aTratmto AUTOCOLS
      REDEFINE XBROWSE oBrw[5] ID 3001 OF oFolder:aDialogs[ 5 ] ARRAY aNotas   AUTOCOLS LINES CELL              
*----------------------------------------------------------------------------      
      For n := 1 TO 5
          oBrw[n]:aCols[1]:nEditType  := EDIT_GET
          oBrw[n]:nMarqueeStyle       := 3
          oBrw[n]:nRowDividerStyle    := LINESTYLE_BLACK
          oBrw[n]:nColDividerStyle    := LINESTYLE_BLACK          
          oBrw[n]:lColDividerComplete := .t.
          oBrw[n]:lFastEdit := .T.
          oBrw[n]:lAutoAppend := .T.          
      EndFor
      FOR n := 1 TO 4
          oBrw[n]:aCols[1]:cEditPicture := "@!"
      EndFor
*-------------------------------------------------------------------------------
      oBrw[1]:aCols[1]:cHeader := "SINTOMAS"
      oBrw[2]:aCols[1]:cHeader := "EXPLORACION"
      oBrw[3]:aCols[1]:cHeader := "DIAGNOSTICO"
      oBrw[4]:aCols[1]:cHeader := "TRATAMIENTO"
*-------------------------------------------------------------------------------
      oBrw[5]:aCols[1]:cHeader := "FACTURA"
      oBrw[5]:aCols[2]:cHeader := "IMPORTE"
      oBrw[5]:aCols[3]:cHeader := "TIPODEPAGO"            
      oBrw[5]:aCols[1]:cEditPicture := "999999"
      oBrw[5]:aCols[2]:cEditPicture := "999999.99"
      oBrw[5]:aCols[2]:nEditType := 1      
      oBrw[5]:aCols[3]:cEditPicture := Space(10)
      oBrw[5]:aCols[3]:nEditType := EDIT_LISTBOX
      oBrw[5]:aCols[3]:aEditListTxt   := { "EFECTIVO", "TARJETA", "SEGURO" }
 

Re: Terminar escritura en un xbrowse(array)

PostPosted: Thu Mar 11, 2010 12:41 pm
by jll-fwh
Hola Pedro:

Yo tengo una prueba de esta forma:

oGrid:lFastEdit := .T.
oGrid:bPastEof := {||NIL} // Para acciones de Final de fichero
oGrid:aCols[1]:bOnPostEdit := {| nCol, cVar, nKey | iif( nKey != VK_ESCAPE, LeeDetalle( 1, cVar ), BorraDetalle() )}

Luego usa para los colores de los GET's.

oGrid:bClrSel := {|| { nRGB( 0,0,0 ), nRGB( 237,244,253 ) } } // Color Barra con el Foco
oGrid:bClrSelFocus := {|| { nRGB( 0,0,0 ), nRGB( 203,225,252 ) } } // Color Barra sin el Foco

Y para la barra del browse, depende de como la quieras usa,

oGrid:nMarqueeStyle := MARQSTYLE_HIGHLROW

o:

*oGrid:nMarqueeStyle := MARQSTYLE_HIGHLCELL


Yo la tengo declarada como HIGHLROW, y cuando editan, la cambio a HIGHLCELL


/*------------------------------------------------------------------------------*/
STATIC Function NuevoDetalle()
/*------------------------------------------------------------------------------*/

AAdd( aDetalles, { Date(), Time(), 0.00, 0.00 } )
oGrid:GoBottom()
oGrid:Refresh()
oGrid:SetFocus()
oGrid:nColSel := 3
*oGrid:nMarqueeStyle := MARQSTYLE_HIGHLCELL
oGrid:aCols[3]:Edit()

Return NIL
/*------------------------------------------------------------------------------*/
STATIC Function ModificaDetalle()
/*------------------------------------------------------------------------------*/

*oGrid:nMarqueeStyle := MARQSTYLE_HIGHLCELL
oGrid:nColSel := 3
oGrid:aCols[3]:Edit()
oGrid:Refresh()

Return NIL


Espero que te sirve
Un saludo
JLL

Re: Terminar escritura en un xbrowse(array)

PostPosted: Thu Mar 11, 2010 12:43 pm
by jll-fwh
se me olvidaba estas funciones:

/*------------------------------------------------------------------------------*/
STATIC Function LeeDetalle( nCol, cVal )
/*------------------------------------------------------------------------------*/

DO CASE

CASE nCol == 1
oGrid:aRow[1] := cVal
oGrid:nColSel := 2
CASE nCol == 2
oGrid:aRow[2] := cVal
oGrid:nColSel := 3
CASE nCol == 3
oGrid:aRow[3] := cVal
oGrid:nColSel := 4
CASE nCol == 4
oGrid:aRow[4] := cVal
*oGrid:nMarqueeStyle := MARQSTYLE_HIGHLROW

ENDCASE


*If nCol == 3 .OR. nCol == 4
* ReLoadGRAF()
*End

oGrid:Refresh()

Return NIL


/*------------------------------------------------------------------------------*/
STATIC Function BorraDetalle()
/*------------------------------------------------------------------------------*/

If MsgYesNo( "Fecha........: " + dToC( aDetalles[ oGrid:nRowSel ][1] ) + CRLF+;
"Hora..........: " + aDetalles[ oGrid:nRowSel ][2] + CRLF+;
"Volumen...: " + TransForm( aDetalles[ oGrid:nRowSel ][3], "999.99 Ml" ) + CRLF+;
"Peso...........: " + TransForm( aDetalles[ oGrid:nRowSel ][4], "999.99 Gr" ) + CRLF+CRLF+;
"¿ Esta seguro de borrar esta Toma ?", "Seleccione..." )

aDEL( oGrid:aArrayData, oGrid:nRowSel )
aSIZE( oGrid:aArrayData, Len( oGrid:aArrayData ) - 1 )
oGrid:Refresh()
/* Reasignamos los valores para el grafico TGraf */
*ReLoadGRAF()
*oGrid:Refresh()

End

Return NIL

Re: Terminar escritura en un xbrowse(array)

PostPosted: Thu Mar 11, 2010 8:24 pm
by Pedro
Hola JL

Creo que no me has entendido, o no me he explicado yo. La toma de datos como la tengo es correcta, pero el usuario cuando llega al final debe dar un ENTER para aceptar lo escrito y bajar a la línea siguiente, dar un ENTER y seguir escribiendo.
La idea es que el usuario no presione ENTER al finalizar la línea, sino que siga escribiendo en la siguiente, sin los dos ENTER.
Como ejemplo lo siguiente, imagina que tienes que escribir 250 caracteres, eso significa dos líneas y media, tu llegas a los cien caracteres y sigues escribiendo en la segunda línea, vuelves a llegar a los cien y sigues en la tercera, todo ello sin dar ENTER, de forma automática.
Espero que ahora me comprendas lo que quiero.

Re: Terminar escritura en un xbrowse(array)

PostPosted: Thu Mar 18, 2010 6:42 pm
by jll-fwh
Ok Pedro:

Pues voy a verlo yo tambien porque ahora tambien necesito hacer algo asi. Pero por lo que vi, hay que modificar la clase creo, a ver si entre los dos damos con la solucion.

Un saludo
JLL

Re: Terminar escritura en un xbrowse(array)

PostPosted: Fri Mar 19, 2010 1:22 pm
by gdeteran
Pedro:
Me parece que es mas fácil y flexible aceptar el texto en un campo tipo MEMO y luego lo puedes pasar a un array o bien guardarlo como tal.
De este modo, no tendrás el problema de presionar Enter al terminar la linea de 100 caracteres.

Re: Terminar escritura en un xbrowse(array)

PostPosted: Fri Mar 19, 2010 5:12 pm
by Daniel Garcia-Gil
Pedro...

a las columnas que quieras usar con esa funcionalidad puedes hacer lo siguiente:

Code: Select all  Expand view
oCol:bGetChange = {| k, f, o, oCol | If( Len( RTrim( o:oGet:Buffer ) ) == Len( o:oGet:Buffer ),;
                                        ( o:SendMsg( WM_KEYDOWN, VK_RETURN ) ), ) }


nota: debes tener el lFastEdit activado

Re: Terminar escritura en un xbrowse(array)

PostPosted: Fri Mar 19, 2010 10:09 pm
by Pedro
Hola Daniel,
Veamos como hacerlo de la forma que tengo diseñado la columna del browse.
Como decía anteriormente, son cuatro browses con una sola columna, a la cual le quiero aplicar lo que tu acabas de exponer.
Los browses son arrays de una sola columna y diez registros, excepto uno que son tres registros, por lo que no tengo definido el objeto oCol, ya que construyo el browse de la siguiente manera : REDEFINE XBROWSE oBrw[1] ID 3001 OF oFolder:aDialogs[ 1 ] ARRAY aSintoma AUTOCOLS el resto de los browses son iguales a excepción del array, así que no sé como extraer el oCol. Para darle el resto de atributos a los browses lo hago desde un bucle for de esta manera .
Code: Select all  Expand view
For n := 1 TO 5
          oBrw[n]:aCols[1]:nEditType  := EDIT_GET
          oBrw[n]:nMarqueeStyle       := 3
          oBrw[n]:nRowDividerStyle    := LINESTYLE_BLACK
          oBrw[n]:nColDividerStyle    := LINESTYLE_BLACK          
          oBrw[n]:lColDividerComplete := .t.
          oBrw[n]:lFastEdit := .T.
          oBrw[n]:lAutoAppend := .T.          
      EndFor
      FOR n := 1 TO 4
          oBrw[n]:aCols[1]:cEditPicture := "@!"
          oBrw[n]:bPastEof := {|| oBrw[n]:GoLeftMost(), oBrw[n]:GoDown(), oBrw[n]:aCols[ 1 ]:edit(),;
                                  oBrw[n]:Refresh() }
      EndFor
     
*-------------------------------------------------------------------------------
      oBrw[1]:aCols[1]:cHeader := "SINTOMAS"
      oBrw[2]:aCols[1]:cHeader := "EXPLORACION"
      oBrw[3]:aCols[1]:cHeader := "DIAGNOSTICO"
      oBrw[4]:aCols[1]:cHeader := "TRATAMIENTO"
*-------------------------------------------------------------------------------
      oBrw[5]:aCols[1]:cHeader := "FACTURA"
      oBrw[5]:aCols[2]:cHeader := "IMPORTE"
      oBrw[5]:aCols[3]:cHeader := "TIPODEPAGO"            
      oBrw[5]:aCols[1]:cEditPicture := "999999"
      oBrw[5]:aCols[2]:cEditPicture := "999999.99"
      oBrw[5]:aCols[2]:nEditType := 1      
      oBrw[5]:aCols[3]:cEditPicture := Space(10)
      oBrw[5]:aCols[3]:nEditType := EDIT_LISTBOX
      oBrw[5]:aCols[3]:aEditListTxt   := { "EFECTIVO", "TARJETA", "SEGURO" }


eso por un lado.
Por otro lado me da un error de que no existe el mensaje TXBRWCOLUMN:_BGETCHANGE en las siguientes llamadas :
source\rtl\tobject.prg => TXBRWCOLUMN:ERROR(172)
source\rtl\tobject.prg => TXBRWCOLUMN:MSGNOTFOUND(205)
source\rtl\tobject.prg => TXBRWCOLUMN:_BGETCHANGE(0)

Esto último puede ser por mi versión de FWH ? Trabajo con FWh 9.04
Muchas gracias Daniel y a ver si es posible el tema

Re: Terminar escritura en un xbrowse(array)

PostPosted: Fri Mar 19, 2010 11:42 pm
by Daniel Garcia-Gil
Saludos Pedro...


bueno implementar el cambio es muy facil

agrega una nueva data a la clase TXBrwColumn
Code: Select all  Expand view
DATA bGetChange

en el metodo Edit de la misma clase
Code: Select all  Expand view
METHOD Edit( nKey ) CLASS TXBrwColumn


cambia el bChange del oEditget por estas lineas
Code: Select all  Expand view

   if ::bGetChange != nil
      ::oEditGet:bChange   := { | k, f, o | ::oBrw:nLastKey := k, Eval( ::bGetChange, k, f, o, Self ) }
   else
      ::oEditGet:bChange    := { | k, f, o | ::oBrw:nLastKey := k, .t. }
   endif
 


despues enlazas el xBrwose.prg como un programa mas de tu proyecto y listo

Re: Terminar escritura en un xbrowse(array)

PostPosted: Sat Mar 20, 2010 10:41 am
by Pedro
Hola Gonzalo
De la forma que tu me dices ya lo he intentado, he conseguido que escriba sin tener que dar enter con un get multiline, el problema viene después, cuando quieres salvarlo respetando los enter cono nuevas líneas, es un engorro. Has de recorrer todo el texto escrito para averiguar cuantos enter ha dado, averiguar cuan largo es el párrafo para saber cuantas veces pasa de cien para hacer líneas, controlar que no se pase de diez líneas en total. En fin desistí ya que es un sencillo programa para una clínica que me pide no más de mil caracteres para la sintomatología, otros tantos para exploración e igual para el tratamiento en el informe del paciente.
Voy a intentarlo como propone Daniel, añadiendo la DATA y el METODO a la clase TxBrwColumn, aunque sólo sea para este programa.

Re: Terminar escritura en un xbrowse(array) SOLUCIONADO

PostPosted: Sat Mar 20, 2010 10:56 am
by Pedro
Gracias Daniel se solucionó perfecto