Terminar escritura en un xbrowse(array) SOLUCIONADO

Post Reply
User avatar
Pedro
Posts: 457
Joined: Tue Mar 21, 2006 7:30 pm
Location: Córdoba (España)

Terminar escritura en un xbrowse(array) SOLUCIONADO

Post 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 _ uno, el tercero es un array de 3 registros y al igual que los otros de cien _ 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

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" }
 
Last edited by Pedro on Sat Mar 20, 2010 10:53 am, edited 1 time in total.
Un saludo
Pedro
gahetesoft@gmail.com
FWH12.06 BCC582, Xverce CW, Pelles C 6.00.4,PSPAD 4.54
y ahora con ADO
User avatar
jll-fwh
Posts: 385
Joined: Fri Jan 29, 2010 8:14 pm
Location: Meliana - Valencia
Contact:

Re: Terminar escritura en un xbrowse(array)

Post 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
Libreria: FWH/FWH1109 + Harbour 3.1.1 + Borland C++ 5.8.2
Editor de Recursos: PellecC
ADA + OURXDBU -
S.O: XP / Win 7
Blog: http://javierlloris.blogspot.com.es/
e-mail: jllorispersonal@gmail.com
User avatar
jll-fwh
Posts: 385
Joined: Fri Jan 29, 2010 8:14 pm
Location: Meliana - Valencia
Contact:

Re: Terminar escritura en un xbrowse(array)

Post 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
Libreria: FWH/FWH1109 + Harbour 3.1.1 + Borland C++ 5.8.2
Editor de Recursos: PellecC
ADA + OURXDBU -
S.O: XP / Win 7
Blog: http://javierlloris.blogspot.com.es/
e-mail: jllorispersonal@gmail.com
User avatar
Pedro
Posts: 457
Joined: Tue Mar 21, 2006 7:30 pm
Location: Córdoba (España)

Re: Terminar escritura en un xbrowse(array)

Post 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.
Un saludo
Pedro
gahetesoft@gmail.com
FWH12.06 BCC582, Xverce CW, Pelles C 6.00.4,PSPAD 4.54
y ahora con ADO
User avatar
jll-fwh
Posts: 385
Joined: Fri Jan 29, 2010 8:14 pm
Location: Meliana - Valencia
Contact:

Re: Terminar escritura en un xbrowse(array)

Post 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
Libreria: FWH/FWH1109 + Harbour 3.1.1 + Borland C++ 5.8.2
Editor de Recursos: PellecC
ADA + OURXDBU -
S.O: XP / Win 7
Blog: http://javierlloris.blogspot.com.es/
e-mail: jllorispersonal@gmail.com
User avatar
gdeteran
Posts: 110
Joined: Fri Oct 14, 2005 7:10 pm
Location: Puerto Montt - CHILE

Re: Terminar escritura en un xbrowse(array)

Post 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.
Saludos,
Gonzalo
Puerto Montt - CHILE
FWH 21.01 - Harbour 3.2.0dev (r2008190002) - Borland/Embarcadero C++ 7.0(32-bit)
User avatar
Daniel Garcia-Gil
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita
Contact:

Re: Terminar escritura en un xbrowse(array)

Post by Daniel Garcia-Gil »

Pedro...

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

Code: Select all

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
our best documentation is the source code
Isla de Margarita Venezuela.
danielgarciagil@gmail.com
http://tdolphin.blogspot.com/
https://www.dropbox.com/referrals/NTI5N ... rc=global9
User avatar
Pedro
Posts: 457
Joined: Tue Mar 21, 2006 7:30 pm
Location: Córdoba (España)

Re: Terminar escritura en un xbrowse(array)

Post 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

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
Un saludo
Pedro
gahetesoft@gmail.com
FWH12.06 BCC582, Xverce CW, Pelles C 6.00.4,PSPAD 4.54
y ahora con ADO
User avatar
Daniel Garcia-Gil
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita
Contact:

Re: Terminar escritura en un xbrowse(array)

Post by Daniel Garcia-Gil »

Saludos Pedro...


bueno implementar el cambio es muy facil

agrega una nueva data a la clase TXBrwColumn

Code: Select all

DATA bGetChange
en el metodo Edit de la misma clase

Code: Select all

METHOD Edit( nKey ) CLASS TXBrwColumn
cambia el bChange del oEditget por estas lineas

Code: Select all

   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
our best documentation is the source code
Isla de Margarita Venezuela.
danielgarciagil@gmail.com
http://tdolphin.blogspot.com/
https://www.dropbox.com/referrals/NTI5N ... rc=global9
User avatar
Pedro
Posts: 457
Joined: Tue Mar 21, 2006 7:30 pm
Location: Córdoba (España)

Re: Terminar escritura en un xbrowse(array)

Post 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.
Un saludo
Pedro
gahetesoft@gmail.com
FWH12.06 BCC582, Xverce CW, Pelles C 6.00.4,PSPAD 4.54
y ahora con ADO
User avatar
Pedro
Posts: 457
Joined: Tue Mar 21, 2006 7:30 pm
Location: Córdoba (España)

Re: Terminar escritura en un xbrowse(array) SOLUCIONADO

Post by Pedro »

Gracias Daniel se solucionó perfecto
Un saludo
Pedro
gahetesoft@gmail.com
FWH12.06 BCC582, Xverce CW, Pelles C 6.00.4,PSPAD 4.54
y ahora con ADO
Post Reply