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.
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.
oBrowse:Edit() lanza OnGetData()
oBrowse:Edit() lanza OnGetData()
Desde que me he actualizado a Xailer503, me he dado cuenta de una cosa.
Resulta que tengo un Browse con 4 columnas, en dos de ellas (la 3 y la 4) tengo el OnGetData que realice una muestra en la celda/columna, segun el valor que hay en un campo de la DBF...
Bien, hasta ahí todo bien.
PERO... siempre encuentro PEROs, que le voy a hacer, serà que pruebo demasiadas cosas!!!
Cuando edito un registro, con Edit() (solo tengo editable la columna 2), entra en edición, PERO... la primera vez SOLO LA PRIMERA VEZ que cambio el contenido del edit, o pulso la tecla Shift, también ocurre... automáticamente cambia el contenido que se muestra en las columnas 3 y 4 de TODOS los registros visibles en el Browse, que son las que tengo codigo en el OnGetData.
Salgo de la edición, se refresca el Browse, y luego ya muestra los valores correctos otra vez, y por mas que vuelva a editar, no se vuelve a repetir ese "mal comportamiento" al entrar en edición.
Si cierro el Form, lo vuelvo a abrir y vuelvo a editar, la primera vez SIEMPRE ocurre.
Ah... por cierto, un TDBBrowse()
El mismo código, compilado con Xailer 3.3.1 funciona correctamente, no lanza el OnGetData() al entrar la primera vez en edición.
Resulta que tengo un Browse con 4 columnas, en dos de ellas (la 3 y la 4) tengo el OnGetData que realice una muestra en la celda/columna, segun el valor que hay en un campo de la DBF...
Bien, hasta ahí todo bien.
PERO... siempre encuentro PEROs, que le voy a hacer, serà que pruebo demasiadas cosas!!!
Cuando edito un registro, con Edit() (solo tengo editable la columna 2), entra en edición, PERO... la primera vez SOLO LA PRIMERA VEZ que cambio el contenido del edit, o pulso la tecla Shift, también ocurre... automáticamente cambia el contenido que se muestra en las columnas 3 y 4 de TODOS los registros visibles en el Browse, que son las que tengo codigo en el OnGetData.
Salgo de la edición, se refresca el Browse, y luego ya muestra los valores correctos otra vez, y por mas que vuelva a editar, no se vuelve a repetir ese "mal comportamiento" al entrar en edición.
Si cierro el Form, lo vuelvo a abrir y vuelvo a editar, la primera vez SIEMPRE ocurre.
Ah... por cierto, un TDBBrowse()
El mismo código, compilado con Xailer 3.3.1 funciona correctamente, no lanza el OnGetData() al entrar la primera vez en edición.
Un Saludo,
Xevi.
Xevi.
Re: oBrowse:Edit() lanza OnGetData()
Bien, nada mejor que con un ejemplo!!!
Al tratar de editar un registro (columna 2) cuando se pulsa una tecla al entrar en edición, cambia el contenido de todas las celdas de las columnas 3 y 4 por el mismo valor de las celdas 3 y 4 del registro a editar.
SOLO OCURRE LA PRIMERA VEZ QUE SE INTENTA EDITAR.
Si entramos en edición y no modificamos, sinó que salimos del modo edición y volvemos a entrar en edición ya siempre funciona.
Cerramos y volvemos a abrir la aplicación... SIEMPRE, la primera vez que editemos, el mismo problema!!!
Al tratar de editar un registro (columna 2) cuando se pulsa una tecla al entrar en edición, cambia el contenido de todas las celdas de las columnas 3 y 4 por el mismo valor de las celdas 3 y 4 del registro a editar.
SOLO OCURRE LA PRIMERA VEZ QUE SE INTENTA EDITAR.
Si entramos en edición y no modificamos, sinó que salimos del modo edición y volvemos a entrar en edición ya siempre funciona.
Cerramos y volvemos a abrir la aplicación... SIEMPRE, la primera vez que editemos, el mismo problema!!!
- Adjuntos
-
- Prueba.zip
- (47.43 KiB) Descargado 142 veces
Un Saludo,
Xevi.
Xevi.
- ignacio
- Site Admin
- Mensajes: 9250
- Registrado: Lun Abr 06, 2015 8:00 pm
- Ubicación: Madrid, Spain
- Contactar:
Re: oBrowse:Edit() lanza OnGetData()
OnGetData sólo debe utilizarse para devolver el valor a visualizar. Nada más: Ya que se llama constantemente cada vez que se necesita el pintado.XeviCOMAS escribió:Bien, nada mejor que con un ejemplo!!!
Al tratar de editar un registro (columna 2) cuando se pulsa una tecla al entrar en edición, cambia el contenido de todas las celdas de las columnas 3 y 4 por el mismo valor de las celdas 3 y 4 del registro a editar.
SOLO OCURRE LA PRIMERA VEZ QUE SE INTENTA EDITAR.
Si entramos en edición y no modificamos, sinó que salimos del modo edición y volvemos a entrar en edición ya siempre funciona.
Cerramos y volvemos a abrir la aplicación... SIEMPRE, la primera vez que editemos, el mismo problema!!!
El evento a utilizar para edición es OnGetValue. Saludos
Re: oBrowse:Edit() lanza OnGetData()
Ignacio,
pues más razón me das!!!
Para el ejemplo que he adjuntado, esas columnas 3 y 4 SON SOLO PARA VISUALIZACIÓN, NO PARA EDICIÓN.
De ahí que esté utilizando el evento OnGetData... para mostrar un valor, nada más.!!!
El caso es que SOLO FALLA la primera vez que se edita la columna 2... ni la 3 ni la 4, que no son editables.
Gracias por tu tiempo.
pues más razón me das!!!
Para el ejemplo que he adjuntado, esas columnas 3 y 4 SON SOLO PARA VISUALIZACIÓN, NO PARA EDICIÓN.
De ahí que esté utilizando el evento OnGetData... para mostrar un valor, nada más.!!!
El caso es que SOLO FALLA la primera vez que se edita la columna 2... ni la 3 ni la 4, que no son editables.
Gracias por tu tiempo.
Un Saludo,
Xevi.
Xevi.
Re: oBrowse:Edit() lanza OnGetData()
Bien, no es una forma "elegante" de arreglar el error de la clase TDBBrowse, pero de momento "salvo" el percance...
Lo que hago es entrar y salir de edicion con ESCAPE, al inicializar el Form... de esta manera, la primera entrada en edición la he hecho sin que se de cuenta "nadie" y ya las próximas ediciones funciona normalmente y se visualizan los datos correctos en el Browse.
Código: Seleccionar todo
#include "Xailer.ch"
CLASS TForm1 FROM TForm
COMPONENT oBrowse1
COMPONENT oCdxDataSource1
COMPONENT oDbfDataSet1
METHOD CreateForm()
METHOD Browse1Column4GetData( oSender, @Value, @nImage )
METHOD Browse1Column3GetData( oSender, @Value, @nImage )
METHOD FormInitialize( oSender )
ENDCLASS
#include "Form1.xfm"
//------------------------------------------------------------------------------
METHOD Browse1Column4GetData( oSender, Value, nImage ) CLASS TForm1
Value := ::oDbfDataSet1:SALDO1 * ::oDbfDataSet1:XYCC
RETURN Nil
//------------------------------------------------------------------------------
METHOD Browse1Column3GetData( oSender, Value, nImage ) CLASS TForm1
Value := IF( Value = 1, "Rep", IF( Value = 2, "Sup", "" ) )
RETURN Nil
//------------------------------------------------------------------------------
METHOD FormInitialize( oSender ) CLASS TForm1
//Apaño por el fallo al entrar la primera vez en edición... se repite en las columnas 3 y 4 valores del registro a editar
::oBrowse1:Edit()
::oBrowse1:aCols[2]:oGridEdit:PostMsg( WM_KEYDOWN, VK_ESCAPE )
RETURN Nil
//------------------------------------------------------------------------------
- Adjuntos
-
- Prueba (2).zip
- (47.71 KiB) Descargado 136 veces
Un Saludo,
Xevi.
Xevi.
- ignacio
- Site Admin
- Mensajes: 9250
- Registrado: Lun Abr 06, 2015 8:00 pm
- Ubicación: Madrid, Spain
- Contactar:
Re: oBrowse:Edit() lanza OnGetData()
Un saludoXeviCOMAS escribió:Ignacio,
pues más razón me das!!!
Para el ejemplo que he adjuntado, esas columnas 3 y 4 SON SOLO PARA VISUALIZACIÓN, NO PARA EDICIÓN.
De ahí que esté utilizando el evento OnGetData... para mostrar un valor, nada más.!!!
El caso es que SOLO FALLA la primera vez que se edita la columna 2... ni la 3 ni la 4, que no son editables.
Gracias por tu tiempo.
Re: oBrowse:Edit() lanza OnGetData()
Bien, entiendo, pero continuo diciendo que el comportamiento es anómalo, es en el pintado de las celdas de las columnas, no en la edición.
Y por contra, compilado con Xailer331, este comportamiento es de lo mas correctísimo, no como en Xailer5.
Pero si por vuestra parte es correcto, alguien más se quejará en uno u otro dia.
En fin... Ahí lo dejo.
Y por contra, compilado con Xailer331, este comportamiento es de lo mas correctísimo, no como en Xailer5.
Pero si por vuestra parte es correcto, alguien más se quejará en uno u otro dia.
En fin... Ahí lo dejo.
Un Saludo,
Xevi.
Xevi.
Re: oBrowse:Edit() lanza OnGetData()
Pido Disculpas.
Hay que hacerlo distinto...
Tampoco cuesta nada explicarlo con ejemplo!!!
Hay que hacerlo distinto...
Código: Seleccionar todo
METHOD Browse1Column4GetData( oSender, Value, nImage ) CLASS TForm1
* Value := ::oDbfDataSet1:SALDO1 * ::oDbfDataSet1:XYCC //al primer edición repinta valores columna del registro a editar.
Value := ::oDbfDataSet1:SALDO1( dsFIELD ) * ::oDbfDataSet1:XYCC( dsFIELD ) //de esta forma SI funciona
RETURN Nil
Un Saludo,
Xevi.
Xevi.
- ignacio
- Site Admin
- Mensajes: 9250
- Registrado: Lun Abr 06, 2015 8:00 pm
- Ubicación: Madrid, Spain
- Contactar:
Re: oBrowse:Edit() lanza OnGetData()
Quizás, sólo quizás, deberías de releer la documentación unas cuentas vece más. Si hace falta que te haga un croquis me lo dices. Siento ser tan rudo.XeviCOMAS escribió:Bien, entiendo, pero continuo diciendo que el comportamiento es anómalo, es en el pintado de las celdas de las columnas, no en la edición.
Y por contra, compilado con Xailer331, este comportamiento es de lo mas correctísimo, no como en Xailer5.
Pero si por vuestra parte es correcto, alguien más se quejará en uno u otro dia.
En fin... Ahí lo dejo.
Un saludo
-
- Mensajes: 123
- Registrado: Mié Jun 16, 2010 2:33 pm
Re: oBrowse:Edit() lanza OnGetData()
Ignacio,
Yo estoy teniendo el mismo comportamiento con evento TBrwColumn:OnGetData desde la versión 5 de Xailer y he tenido que volver a compilar con la versión anterior para poderlo solucionar provisionalmente ya que los clientes me estan llamando.
Hay alguna posibilidad de mantener la compatibilidad con la versión 4.
Muchas gracias Igacion.
Saludos.
Pepe.
Nota: Como utilizo TArrayBrowse en las pruebas que estoy haciendo. Si cambio en el OnGetData esto: nServir := oSender:oParent:GetValue("SERVIR")
Por esto: nServir := oSender:oParent:aArrayData[nPosBrowse,5]
If nServir > 0
oSender:nClrPane := clLime
Else
oSender:nClrPane := clRed
EndIf
Va ok
El problema que detecto con el debugger, es que la primera vez que edito un registro me cambia toda la columna teniendo en cuenta el valor que introduzo en oCol:Edit(nKey)
y no el valor de cada registro.
Yo estoy teniendo el mismo comportamiento con evento TBrwColumn:OnGetData desde la versión 5 de Xailer y he tenido que volver a compilar con la versión anterior para poderlo solucionar provisionalmente ya que los clientes me estan llamando.
Hay alguna posibilidad de mantener la compatibilidad con la versión 4.
Muchas gracias Igacion.
Saludos.
Pepe.
Nota: Como utilizo TArrayBrowse en las pruebas que estoy haciendo. Si cambio en el OnGetData esto: nServir := oSender:oParent:GetValue("SERVIR")
Por esto: nServir := oSender:oParent:aArrayData[nPosBrowse,5]
If nServir > 0
oSender:nClrPane := clLime
Else
oSender:nClrPane := clRed
EndIf
Va ok
El problema que detecto con el debugger, es que la primera vez que edito un registro me cambia toda la columna teniendo en cuenta el valor que introduzo en oCol:Edit(nKey)
y no el valor de cada registro.
Re: oBrowse:Edit() lanza OnGetData()
Pepe,
como he escrito en un post anterior... puedes "arreglarlo" en el FormInitialize.
Haces un Edit() y sales de él sin modificar nada.
No es "elegante" pero funciona!!!
Otra cosa es con TDBBrowses, que se hace referencia al campo, añadiendo (dsFIELD), me quedó arreglado, como me comentó Ignacio.
como he escrito en un post anterior... puedes "arreglarlo" en el FormInitialize.
Haces un Edit() y sales de él sin modificar nada.
Código: Seleccionar todo
METHOD FormInitialize( oSender ) CLASS TForm1
//Apaño por el fallo al entrar la primera vez en edición... se repite en las columnas 3 y 4 valores del registro a editar
::oBrowse1:Edit()
::oBrowse1:aCols[2]:oGridEdit:PostMsg( WM_KEYDOWN, VK_ESCAPE )
RETURN Nil
Otra cosa es con TDBBrowses, que se hace referencia al campo, añadiendo (dsFIELD), me quedó arreglado, como me comentó Ignacio.
Un Saludo,
Xevi.
Xevi.
- ignacio
- Site Admin
- Mensajes: 9250
- Registrado: Lun Abr 06, 2015 8:00 pm
- Ubicación: Madrid, Spain
- Contactar:
Re: oBrowse:Edit() lanza OnGetData()
Buenas tardes,
Esto no es una novedad de Xailer 5 y está así desde Xailer 2. Voy a intentar explicarlo otra vez:
Cualquier miembro del dataset que apunta a un campo de una tabla o recordset siempre muestra el valor de dicho campo en la tabla o recordset, SALVO QUE SE ENCUENTRE EN MODO EDICION por haber utilizado los métodos AddNew() o Update() del dataset, ya que en dicho caso EL VALOR QUE DEVUELVEN ES EL VALOR DEL BUFFER INTERNO QUE TIENE EL DATASET PARA EDICION.
Para permitir que incluso en modo edición el recordset devuelva el valor del campo y no el valor del buffer existe el parámetro NombreDeCampo(dsField)
Por lo tanto, el comportamiento actual no es ningún error, sino todo lo contrario. Y además lleva funcionando así desde hace muchos, muchos, años.
Saludos
Esto no es una novedad de Xailer 5 y está así desde Xailer 2. Voy a intentar explicarlo otra vez:
Cualquier miembro del dataset que apunta a un campo de una tabla o recordset siempre muestra el valor de dicho campo en la tabla o recordset, SALVO QUE SE ENCUENTRE EN MODO EDICION por haber utilizado los métodos AddNew() o Update() del dataset, ya que en dicho caso EL VALOR QUE DEVUELVEN ES EL VALOR DEL BUFFER INTERNO QUE TIENE EL DATASET PARA EDICION.
Para permitir que incluso en modo edición el recordset devuelva el valor del campo y no el valor del buffer existe el parámetro NombreDeCampo(dsField)
Por lo tanto, el comportamiento actual no es ningún error, sino todo lo contrario. Y además lleva funcionando así desde hace muchos, muchos, años.
Saludos
- ignacio
- Site Admin
- Mensajes: 9250
- Registrado: Lun Abr 06, 2015 8:00 pm
- Ubicación: Madrid, Spain
- Contactar:
Re: oBrowse:Edit() lanza OnGetData()
En OnGetData no deberías actualizar nada. Es un evento que se puede disparar cientos de veces ya que se dispara cada vez que el browse necesita pintarse. Limítate a devolver el valor que quieras pintar. Nada más. Hay otros eventos que puedes usar, como OnChange.Jose Lopez escribió:Ignacio,
Nota: Como utilizo TArrayBrowse en las pruebas que estoy haciendo. Si cambio en el OnGetData esto: nServir := oSender:oParent:GetValue("SERVIR")
En el caso del TArrayBrowse, su comportamiento es exactamente igual que el TDBBrowse y es así desde hace un PORRÓN de años. Puedes verlo en los fuentes:
Código: Seleccionar todo
METHOD GetValue( Col, nAt ) CLASS XArrayBrowse
....
....
IF ! Empty( nIndex )
WITH OBJECT ::aCols[ nIndex ]
IF :oGridEdit:lVisible .AND. ( nAt == ::nArrayAt .OR. ::nEditMode == beAPPEND )
RETURN :oGridEdit:Value
ENDIF
END WITH
IF nAt > 0 .AND. nAt <= Len( ::FaArrayData )
RETURN ::FaArrayData[ nAt ][ nIndex ]
ENDIF
ENDIF
RETURN Nil
Saludos
-
- Mensajes: 123
- Registrado: Mié Jun 16, 2010 2:33 pm
Re: oBrowse:Edit() lanza OnGetData()
Ignacio,
En qué evento debería poner el pintado de la fila.
El color del panel de la fila depende del contenido de un campo.
Gracias por tu ayuda.
Pepe
En qué evento debería poner el pintado de la fila.
El color del panel de la fila depende del contenido de un campo.
Gracias por tu ayuda.
Pepe
Re: oBrowse:Edit() lanza OnGetData()
Jose,
Para el pintado de la celda... OnDrawCell() de la columna
Tambien estoy cambiando el color en función del valor del campo de la DB
Por ejemplo, si es menor de 0, el txto en rojo, sinó, el texto en azul
Para el pintado de la celda... OnDrawCell() de la columna
Código: Seleccionar todo
METHOD Browse1Column4DrawCell( oSender, cText, nClrText, nClrPane, lHighLite, hDC, aRect ) CLASS TFrmComptes
If !lHighLite
nClrText := If( ::oDSTable:INICIA1(dsFIELD) - ::oDSTable:INICIA2(dsFIELD) > 0, clBlue, clRed )
EndIf
RETURN Nil
Por ejemplo, si es menor de 0, el txto en rojo, sinó, el texto en azul
Un Saludo,
Xevi.
Xevi.
-
- Mensajes: 123
- Registrado: Mié Jun 16, 2010 2:33 pm
Re: oBrowse:Edit() lanza OnGetData()
Xevi,
En mi caso se produce el mismo comportamiento en OnDrawCell() que en OnGetData().
La primera vez que edito todo se pone en rojo. Ya que siempre devuelve :GetValue("SERVIR") el mismo valor y no el de la celda que esta pintando
#56: aArrayData[oSender:oParent:nArrayAt,5]= 1, GetValue("SERVIR")= 0
#57: aArrayData[oSender:oParent:nArrayAt,5]= 2, GetValue("SERVIR")= 0
#58: aArrayData[oSender:oParent:nArrayAt,5]= 3, GetValue("SERVIR")= 0
#59: aArrayData[oSender:oParent:nArrayAt,5]= 4, GetValue("SERVIR")= 0
Gracias.
Saludos.
Pepe.
En mi caso se produce el mismo comportamiento en OnDrawCell() que en OnGetData().
La primera vez que edito todo se pone en rojo. Ya que siempre devuelve :GetValue("SERVIR") el mismo valor y no el de la celda que esta pintando
#56: aArrayData[oSender:oParent:nArrayAt,5]= 1, GetValue("SERVIR")= 0
#57: aArrayData[oSender:oParent:nArrayAt,5]= 2, GetValue("SERVIR")= 0
#58: aArrayData[oSender:oParent:nArrayAt,5]= 3, GetValue("SERVIR")= 0
#59: aArrayData[oSender:oParent:nArrayAt,5]= 4, GetValue("SERVIR")= 0
Gracias.
Saludos.
Pepe.
Re: oBrowse:Edit() lanza OnGetData()
Has probado de entrar en edición al iniciar el Form???
Y salir sin hacer nada...
En FormInitialize...
::oBrowse1:Edit()
::oBrowse1:aCols[n]:oGridEdit:PostMsg( WM_KEYDOWN, VK_ESCAPE )
Es una forma "bruta" pero a mi también me funciona.
Y salir sin hacer nada...
En FormInitialize...
::oBrowse1:Edit()
::oBrowse1:aCols[n]:oGridEdit:PostMsg( WM_KEYDOWN, VK_ESCAPE )
Es una forma "bruta" pero a mi también me funciona.
Un Saludo,
Xevi.
Xevi.