In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.

Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.

Edición en línea de un TBrowseMod

Foro de Xailer profesional en español
Responder
Avatar de Usuario
bingen
Mensajes: 581
Registrado: Lun Jul 07, 2014 8:17 pm
Ubicación: Bilbao
Contactar:

Edición en línea de un TBrowseMod

Mensaje por bingen »

Buenas XTeam. Estoy intentando hacer una edición en línea con el browse moderno y me encuentro algunos problemas.

Adjunto ejemplo sencillo modificado sobre los samples de Xailer 9.1
MemBrowse.zip
(3.09 KiB) Descargado 90 veces
1.- He tomado el ejemplo DBFBrowse y nada mas empezar al anchar el browse en edición, me quedan las cabeceras pintadas fuera de sus columnas.... lo cual me pasa algunas veces también en ejecución.
Form1.jpg
Form1.jpg (169.08 KiB) Visto 2379 veces
2.- Después he tomado como base el ejemplo MemBrowse y he permitido edición en línea. Como puede verse las columnas 2 y 3 son nEditType = beNone , pero al entrar en edición las edita todas incluidas estas beNone :shock: .
Form1_2.jpg
Form1_2.jpg (14.86 KiB) Visto 2379 veces
3.- He añadido una columna booleana con un aEditListBound .T./.F. y aEditLIstText Sí/No con nEditType = beLISTBOX y para mi sorpresa necesito hacer uso del evento OnDrawCell para que me muestre los valores de aEditLIstText Sí/No
IF Lower(oCol:oDataField:cName)="directory"
cValue:=IF(xValue,"Sí","No")
Endif

4.- Aún así cuando entro en edición de una línea, el valor mostrado en esa columna por OnDrawCell se vuelve .T./.F. y al abrir la lista de edición entonces es mostrada la lista Sí/No, selecciono una opción, se cierra la lista y vuelve a mostrar .T./.F.
Si encima es una columna con nEditType = beGET_LISTBOX donde puedo teclear para buscar con una S o una N, buscar lo busca bien pero el valor devuelto ya no es de tipo lógico sino de tipo carácter y al ir a grabarlo en una BBDD da error.


5.- Si los valores a mostrar en una columna beLISTBOX son caracteres que tienen un aEditListBound numérico 1,2,3,4,5.... y el primer elemento de aEditLIstText está vacio "" o solo tiene espacios " ", para poder elegir una opción que no indique nada por ejemplo, no hay manera de coger otro valor siempre coge el primero, por eso he puesto un punto en la primera opción de la columna 7 y así funciona.

Muchas gracias por vuestro tiempo y atención.
BiSoft Desarrollo de software profesional
http://www.bisoft.es
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9320
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Re: Edición en línea de un TBrowseMod

Mensaje por ignacio »

1) No consigo reproducirlo.

2) Con este código debería corregirse:

Código: Seleccionar todo

METHOD Edit() CLASS XDbBrwColMod
   ::Super:Edit()
   IF ::oDataset == NIL .OR. !::IsDataField()
      ::oGridEdit:lReadOnly := .T.
   ENDIF
RETURN NIL
3) aEDIT... Nada tiene que ver con la visualización. OnDrawCell es necesario.

4) la edición se basa en el tipo de dato, en este caso lógico y se comporta exactamente igual que un TMaskEdit de tipo lógico. Recomiendo pasar la columna a texto.

5) Lo miro con más detenimiento

Saludos
Ignacio Ortiz de Zúñiga
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9320
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Re: Edición en línea de un TBrowseMod

Mensaje por ignacio »

Buenas tardes,

Me ha parecido una buena idea de la que se tengan en cuenta los valores de aEditList???? para la visualización y ya está hecho. Hay que cambiar el siguiente código a partir de la línea 3847 de BrowseMod.prg:

Código: Seleccionar todo

IF ValType( xValue ) $ "NL" .AND.  !Empty( :aEditListBound ) .AND. ( nIdx := AScan( :aEditListBound, xValue ) ) > 0   // Nueva línea
   cValue := :aEditListText[ nIdx ]  // Nueva línea
ELSEIF xValue != NIL .AND. !Empty( :cPicture ) // Convertido de IF a ELSEIF
  cValue := Transform( xValue, :cPicture )
ELSE
  cValue := ToString( xValue )
ENDIF
De esta forma ya no es necesario sobrecargar OnDrawCell.

El error de no poder usar espacios en aEditListText se soluciona con el siguiente código (se ha cambiado un '=' por un '=='):

Código: Seleccionar todo

METHOD SaveValue() CLASS TEditForGrid

   LOCAL xValue, nIndex

   xValue := ::Value()

   IF ::lTypeChanged .AND. ValType( xValue ) == "C"
      xValue := Trim( Upper( XA_NoAccents( xValue ) ) )
      nIndex := AScan( ::oCol:aEditListText, {|v,e| xValue == Trim( Upper( XA_NoAccents(v) ) ) } )

      IF nIndex > 0 .AND. nIndex <= Len( ::oCol:aEditListBound )
         xValue := ::oCol:aEditListBound[ nIndex ]
      ELSE
         xValue := 0
      ENDIF
   ENDIF

RETURN xValue
Este arreglo, también evita que se muestre .T. o .F. en la edición. No obstante, hay que hacer un arreglo adicional para cuando se introducen a mano valores en el campo que no coinciden con ninguno de la lista, que es:

Código: Seleccionar todo

METHOD SetValue( xValue ) CLASS XDbBrwColMod

   IF ::IsDataField()
      IF ValType( xValue ) == ::oDataField:cType
         ::oDataField:Value := xValue
      ENDIF
   ENDIF

RETURN xValue
Todos estas correcciones se incluirán en la próxima revisión de Xailer, que será en breve.

Un saludo
Ignacio Ortiz de Zúñiga
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9320
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Re: Edición en línea de un TBrowseMod

Mensaje por ignacio »

¿Has podido probar algo? Gracias

Un saludo
Ignacio Ortiz de Zúñiga
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Avatar de Usuario
bingen
Mensajes: 581
Registrado: Lun Jul 07, 2014 8:17 pm
Ubicación: Bilbao
Contactar:

Re: Edición en línea de un TBrowseMod

Mensaje por bingen »

Perdona el retraso Ignacio, andamos como locos.

Probé las modificaciones propuestas en mi aplicación y me funcionó a medias.

Implemento las correcciones en vuestro samples y lo veré mejor para explicártelo, me voy a poner ahora mismo con ello que parece una tarde tranquila.

ADJUNTO el ejemplo MemBrowse con todas las modificaciones sugeridas para que puedas probarlo.
MemBrowse.zip
(32.57 KiB) Descargado 72 veces
Muchas gracias.
Última edición por bingen el Jue Oct 31, 2024 6:25 pm, editado 1 vez en total.
BiSoft Desarrollo de software profesional
http://www.bisoft.es
Avatar de Usuario
bingen
Mensajes: 581
Registrado: Lun Jul 07, 2014 8:17 pm
Ubicación: Bilbao
Contactar:

Re: Edición en línea de un TBrowseMod

Mensaje por bingen »

Sobre las columnas 2 y 3 con :nEditType := beNONE la solución que propones

IF ::oDataset == NIL .OR. !::IsDataField()
::oGridEdit:lReadOnly := .T.
ENDIF

no resuelve mi problema ya que en mi caso es un dataset y es un campo del dataset lo que se muestra, como en vuestro sample MemBrowse que adjunto, pero si añado lo siguiente si que funciona mucho mejor

IF ::oDataset == NIL .OR. !::IsDataField() .Or. ::nEditType = beNONE
::oGridEdit:lReadOnly := .T.
ENDIF
Form1_2.jpg
Form1_2.jpg (24.79 KiB) Visto 2055 veces
Pero entra en cada celda de cada columna 2 y 3 aunque no deja editarla.

Si añado

IF ::oDataset == NIL .OR. !::IsDataField() .Or. ::nEditType = beNONE
::oGridEdit:lReadOnly := .T.
::oGridEdit:lTabStop:=.F.
ENDIF
Form1.jpg
Form1.jpg (29.85 KiB) Visto 2055 veces
Las columnas 2 y 3 quedan en gris y no se pueden editar pero... al pulsar el tabulador pasa por todas las columnas con lTabStop:=.F. o sea no pasa de la primera a la cuarta como sería lógico.
BiSoft Desarrollo de software profesional
http://www.bisoft.es
Avatar de Usuario
bingen
Mensajes: 581
Registrado: Lun Jul 07, 2014 8:17 pm
Ubicación: Bilbao
Contactar:

Re: Edición en línea de un TBrowseMod

Mensaje por bingen »

En cuanto a usar los valores de aEditListtext directamente sin tener que emplear OnDrawCell perfecto. Pero a pesar de que comentas que esto también evita que se muestre .T. o .F. en la edición, es lo que se sigue viendo
Form1_3.jpg
Form1_3.jpg (26.22 KiB) Visto 2054 veces
en edición:
Form1_4.jpg
Form1_4.jpg (28.3 KiB) Visto 2054 veces
BiSoft Desarrollo de software profesional
http://www.bisoft.es
Avatar de Usuario
bingen
Mensajes: 581
Registrado: Lun Jul 07, 2014 8:17 pm
Ubicación: Bilbao
Contactar:

Re: Edición en línea de un TBrowseMod

Mensaje por bingen »

El arreglo adicional para cuando se introducen los valores a mano en el campo funciona perfecto.
BiSoft Desarrollo de software profesional
http://www.bisoft.es
Avatar de Usuario
bingen
Mensajes: 581
Registrado: Lun Jul 07, 2014 8:17 pm
Ubicación: Bilbao
Contactar:

Re: Edición en línea de un TBrowseMod

Mensaje por bingen »

He pulsado la tecla insert sobre el browse y me da este error
Error.jpg
Error.jpg (111.25 KiB) Visto 2051 veces
Curiosamente no veo la propiedad lAllowInsert en el inspector de objetos para activarlo/desactivarlo al contrario que lAllowAppend que si está. En el manual salen ambas y parecen lo mismo salvo que el caso de lAllowInsert advierte que es para Arrays y en mi caso no lo es pero aunque active lAllowAppend := .t. sigue dando el mismo error.

Muchas gracias.
BiSoft Desarrollo de software profesional
http://www.bisoft.es
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9320
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Re: Edición en línea de un TBrowseMod

Mensaje por ignacio »

Buenos días,

Me temo que no consigo reproducir tus errores. Adjunto vídeo con tu ejemplo:



No sé si el el caso, pero es importante que las pruebas las hagas SIN NINGUNA MODIFICACION en las clases involucradas.

Saludos
Ignacio Ortiz de Zúñiga
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9320
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Re: Edición en línea de un TBrowseMod

Mensaje por ignacio »

bingen escribió: Jue Oct 31, 2024 6:21 pm He pulsado la tecla insert sobre el browse y me da este error

Error.jpg

Curiosamente no veo la propiedad lAllowInsert en el inspector de objetos para activarlo/desactivarlo al contrario que lAllowAppend que si está. En el manual salen ambas y parecen lo mismo salvo que el caso de lAllowInsert advierte que es para Arrays y en mi caso no lo es pero aunque active lAllowAppend := .t. sigue dando el mismo error.

Muchas gracias.
Este error ya está corregido. Simplemente hay que pasar la DATA a RESERVED

Código: Seleccionar todo

CLASS XDbBrowseMod FROM TBrowseMod

RESERVED:
   PROPERTY lAllowInsert      INIT .F.

Ignacio Ortiz de Zúñiga
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Avatar de Usuario
bingen
Mensajes: 581
Registrado: Lun Jul 07, 2014 8:17 pm
Ubicación: Bilbao
Contactar:

Re: Edición en línea de un TBrowseMod

Mensaje por bingen »

Pues el comportamiento es realmente diferente al de tu video :roll:

Como ves he metido en el ZIP las clases modificadas con tus sugerencias, cuando dices las clases sin ninguna modificación no entiendo, sin modificaciones no hay cambios y de hecho alguna de las cosas ha corregido algún comportamiento.

Pero sigo perplejo a mi no me funciona como a ti.... tendrás mas cambios que yo en las clases.

No se si me puedes pasar las clases modificadas para que las pruebe.

Gracias.
BiSoft Desarrollo de software profesional
http://www.bisoft.es
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9320
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Re: Edición en línea de un TBrowseMod

Mensaje por ignacio »

Buenas tardes,

Contacta por privado por favor.

Un saludo
Ignacio Ortiz de Zúñiga
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Responder