Terminar escritura en un xbrowse(array) SOLUCIONADO

Terminar escritura en un xbrowse(array) SOLUCIONADO

Postby Pedro » Wed Mar 10, 2010 10:57 pm

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" }
 
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
Pedro
 
Posts: 464
Joined: Tue Mar 21, 2006 7:30 pm
Location: Córdoba (España)

Re: Terminar escritura en un xbrowse(array)

Postby jll-fwh » Thu Mar 11, 2010 12:41 pm

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

Re: Terminar escritura en un xbrowse(array)

Postby jll-fwh » Thu Mar 11, 2010 12:43 pm

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

Re: Terminar escritura en un xbrowse(array)

Postby Pedro » Thu Mar 11, 2010 8:24 pm

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
Pedro
 
Posts: 464
Joined: Tue Mar 21, 2006 7:30 pm
Location: Córdoba (España)

Re: Terminar escritura en un xbrowse(array)

Postby jll-fwh » Thu Mar 18, 2010 6:42 pm

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

Re: Terminar escritura en un xbrowse(array)

Postby gdeteran » Fri Mar 19, 2010 1:22 pm

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 22.12 - Harbour 3.2.0dev (r2008190002) - Borland/Embarcadero C++ 7.0(32-bit)
User avatar
gdeteran
 
Posts: 115
Joined: Fri Oct 14, 2005 7:10 pm
Location: Puerto Montt - CHILE

Re: Terminar escritura en un xbrowse(array)

Postby Daniel Garcia-Gil » Fri Mar 19, 2010 5:12 pm

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
User avatar
Daniel Garcia-Gil
 
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita

Re: Terminar escritura en un xbrowse(array)

Postby Pedro » Fri Mar 19, 2010 10:09 pm

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
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: 464
Joined: Tue Mar 21, 2006 7:30 pm
Location: Córdoba (España)

Re: Terminar escritura en un xbrowse(array)

Postby Daniel Garcia-Gil » Fri Mar 19, 2010 11:42 pm

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
User avatar
Daniel Garcia-Gil
 
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita

Re: Terminar escritura en un xbrowse(array)

Postby Pedro » Sat Mar 20, 2010 10:41 am

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: 464
Joined: Tue Mar 21, 2006 7:30 pm
Location: Córdoba (España)

Re: Terminar escritura en un xbrowse(array) SOLUCIONADO

Postby Pedro » Sat Mar 20, 2010 10:56 am

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
User avatar
Pedro
 
Posts: 464
Joined: Tue Mar 21, 2006 7:30 pm
Location: Córdoba (España)


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 86 guests