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.
lChecked en TDBSwitch
lChecked en TDBSwitch
Al utilizar TDbSwitch el estado de oSender:lChecked y lo guardado en la tabla MySQL es inverso al estado visual
Por ejemplo:
Si está hacia la derecha e iluminado y con el texto mostrado en :cTextChecked lo que se guarda es .F.
Y a la inversa, si el control está cargado hacia la izquierda y el texto mostrado es el de cTextUnChecked lo que se guarda en la tabla es .T.
Yo esperaría el mismo comportamiento de un tCheckBox.
Por ejemplo:
Si está hacia la derecha e iluminado y con el texto mostrado en :cTextChecked lo que se guarda es .F.
Y a la inversa, si el control está cargado hacia la izquierda y el texto mostrado es el de cTextUnChecked lo que se guarda en la tabla es .T.
Yo esperaría el mismo comportamiento de un tCheckBox.
- ignacio
- Site Admin
- Mensajes: 9253
- Registrado: Lun Abr 06, 2015 8:00 pm
- Ubicación: Madrid, Spain
- Contactar:
Re: lChecked en TDBSwitch
Buenos días,
Le ruego nos mande un pequeño ejemplo usando una BD local como SQLite. Nadie nos ha reportado ese error. Gracias.
Un saludo
Le ruego nos mande un pequeño ejemplo usando una BD local como SQLite. Nadie nos ha reportado ese error. Gracias.
Un saludo
Re: lChecked en TDBSwitch
Ignacio:
Ya probé y encontré que el problema es que el OnChange trabaja de manera diferente con el CheckBox
El Update se ejecuta realmente antes de que el control tenga el verdadero valor.
Y con el CheckBox el OnChange se ejecuta correctamente.
Ya probé y encontré que el problema es que el OnChange trabaja de manera diferente con el CheckBox
Código: Seleccionar todo
METHOD DBSwitch1Change( oSender ) CLASS TForm1
::oSQLTable1:Update()
::oSQLTable1:Edit()
RETURN Nil
Y con el CheckBox el OnChange se ejecuta correctamente.
Re: lChecked en TDBSwitch
Similar comportamiento reporte para el TSwitch en http://www.xailer.com/forum/viewtopic.p ... 192#p53192
Al ejecutarse onchange se encuentra el estado 'previo' al cambio en lchecked.
Al ejecutarse onchange se encuentra el estado 'previo' al cambio en lchecked.
avitalini escribió:Al utilizar TDbSwitch el estado de oSender:lChecked y lo guardado en la tabla MySQL es inverso al estado visual
Por ejemplo:
Si está hacia la derecha e iluminado y con el texto mostrado en :cTextChecked lo que se guarda es .F.
Y a la inversa, si el control está cargado hacia la izquierda y el texto mostrado es el de cTextUnChecked lo que se guarda en la tabla es .T.
Yo esperaría el mismo comportamiento de un tCheckBox.
Re: lChecked en TDBSwitch
La funcionalidad la puedo cambiar con una negación, cómo lo dice Ignacio, pero el problema es con lo que se guarda en la tabla.
Menciona Ignacio que se mandará un segundo parámetro con el verdadero valor, pero creo que el problema seguiría ya que en mi caso la tabla se guardaría con el valor anterior, creo que si tendría que haber un evento OnChanged para que funcione de forma similar a DBCheckBox y podría ser que el OnChange sea para aceptar o no el cambio.
O que el evento OnChange se dispare después de asignar el valor al campo de la tabla, para poder guardar correctamente.
Saludos, a ver qué nos dice Ignacio.
Menciona Ignacio que se mandará un segundo parámetro con el verdadero valor, pero creo que el problema seguiría ya que en mi caso la tabla se guardaría con el valor anterior, creo que si tendría que haber un evento OnChanged para que funcione de forma similar a DBCheckBox y podría ser que el OnChange sea para aceptar o no el cambio.
O que el evento OnChange se dispare después de asignar el valor al campo de la tabla, para poder guardar correctamente.
Saludos, a ver qué nos dice Ignacio.
Claudio C escribió:Similar comportamiento reporte para el TSwitch en http://www.xailer.com/forum/viewtopic.p ... 192#p53192
Al ejecutarse onchange se encuentra el estado 'previo' al cambio en lchecked.
avitalini escribió:Al utilizar TDbSwitch el estado de oSender:lChecked y lo guardado en la tabla MySQL es inverso al estado visual
Por ejemplo:
Si está hacia la derecha e iluminado y con el texto mostrado en :cTextChecked lo que se guarda es .F.
Y a la inversa, si el control está cargado hacia la izquierda y el texto mostrado es el de cTextUnChecked lo que se guarda en la tabla es .T.
Yo esperaría el mismo comportamiento de un tCheckBox.
- ignacio
- Site Admin
- Mensajes: 9253
- Registrado: Lun Abr 06, 2015 8:00 pm
- Ubicación: Madrid, Spain
- Contactar:
Re: lChecked en TDBSwitch
avitalini escribió:Al utilizar TDbSwitch el estado de oSender:lChecked y lo guardado en la tabla MySQL es inverso al estado visual
Por ejemplo:
Si está hacia la derecha e iluminado y con el texto mostrado en :cTextChecked lo que se guarda es .F.
Y a la inversa, si el control está cargado hacia la izquierda y el texto mostrado es el de cTextUnChecked lo que se guarda en la tabla es .T.
Yo esperaría el mismo comportamiento de un tCheckBox.
Re: lChecked en TDBSwitch
Ignacio:
Sí, el contro TSwitch hasta donde lo he probado funciona muy bien, pero insisto el problema es que el OnChange se dispara antes de guardar el valor en el campo.
En mi caso, es una pequeño motor de Facturación Electrónica, que está esperando una instrucción por SendWMCopyData de la aplicación principal para que arranque con su trabajo, pero hay varios CheckBox y uno de ellos indica si el proceso es automático o manual para lo cual el DBSwitch quedaría excelente en vista y función.
El registro siempre está en edición y al cambiar el estado de algún CheckBox actualizo el registro en la tabla de MariaDB correspondiente, para que en el inicio arranque igual.
(Después de guardar, vuelvo a poner en edición)
El problema es que el OnChange se ejecuta antes de que el campo tenga el verdadero valor por lo tanto mi :Update() actualiza la tabla con el valor anterior.
Esperaría el mismo funcionamiento de su antecesor el CheckBox que el OnChange se dispara después de guardar el valor en el campo.
Agrego ejemplo con SQLite
Sí, el contro TSwitch hasta donde lo he probado funciona muy bien, pero insisto el problema es que el OnChange se dispara antes de guardar el valor en el campo.
En mi caso, es una pequeño motor de Facturación Electrónica, que está esperando una instrucción por SendWMCopyData de la aplicación principal para que arranque con su trabajo, pero hay varios CheckBox y uno de ellos indica si el proceso es automático o manual para lo cual el DBSwitch quedaría excelente en vista y función.
El registro siempre está en edición y al cambiar el estado de algún CheckBox actualizo el registro en la tabla de MariaDB correspondiente, para que en el inicio arranque igual.
Código: Seleccionar todo
METHOD DBSwitch1Change( oSender ) CLASS TForm1
::oSQLTable1:Update()
::oSQLTable1:Edit()
RETURN Nil
El problema es que el OnChange se ejecuta antes de que el campo tenga el verdadero valor por lo tanto mi :Update() actualiza la tabla con el valor anterior.
Esperaría el mismo funcionamiento de su antecesor el CheckBox que el OnChange se dispara después de guardar el valor en el campo.
Agrego ejemplo con SQLite
- Adjuntos
-
- PruebaSwitchSQLite.zip
- (2.94 KiB) Descargado 185 veces
- ignacio
- Site Admin
- Mensajes: 9253
- Registrado: Lun Abr 06, 2015 8:00 pm
- Ubicación: Madrid, Spain
- Contactar:
Re: lChecked en TDBSwitch
Buenos días,
Simplemente hay que cambiar una línea de posición:
Si lo puede probar usted mismo se lo agradezco. Si no tiene los fuentes de dicha clase o prefiere que le mande el archivo OBJ me lo dice.
Un saludo
Simplemente hay que cambiar una línea de posición:
Código: Seleccionar todo
METHOD SetChecked( lValue, lSmooth ) CLASS XSwitch
LOCAL lOk
IF Valtype( lValue ) == "N"
lValue := ( lValue != 0 )
ENDIF
IF ::FlChecked != lValue
::FlChecked := lValue
::OnChange( lValue ) // <<<<<<<<<<<<<<<<<<<<<<<<<<< Linea bajada una posición después de la asignación de la propiedad
IF lSmooth != NIL
::lIsSmooth := lSmooth
::nDotPos := 0
ENDIF
IF ! Empty( ::Handle )
InvalidateRect( ::Handle )
ENDIF
ENDIF
RETURN ::FlChecked
Un saludo
Re: lChecked en TDBSwitch
Excelente Ignacio:
Ya concuerda lo que se guarda en la tabla con la parte visual del control, no así el valor del campo llamado desde ::oSQLTable1:estado.
Por otro lado me sale la siguiente pantalla de error que dice que ya está en modo edición pero sólo cuando el DBSwitch queda en .T. al guardar la última vez.
Ya concuerda lo que se guarda en la tabla con la parte visual del control, no así el valor del campo llamado desde ::oSQLTable1:estado.
Por otro lado me sale la siguiente pantalla de error que dice que ya está en modo edición pero sólo cuando el DBSwitch queda en .T. al guardar la última vez.