Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Controlar edición de DBEdit (https://www.clubdelphi.com/foros/showthread.php?t=95251)

isracdc 21-06-2021 22:10:39

Controlar edición de DBEdit
 
Hola a todos, estoy creando una app con C++ Builder y tengo un formulario que obtiene información de una BD de MySql mediante algunos DBEdit, muestra un campo de tipo flotante con 2 decimales, mi duda es........cómo controlo de manera manual que el usuario ingrese un flotante válido en ese DBEdit? Me explico, ya restringí mediante evento OnKeyPress, que el usuario sólo ingrese números y el punto decimal, pero al ingresa por ejemplo: 4.50.2 es el sistema que me arroja el mensaje de error (en inglés), lo que quiero es manejar de manera manual ese mensaje de error para mostrar un texto que yo desee, si no me equivoco, el término correcto sería "validar" manualmente ese dato editado. Gracias

Neftali [Germán.Estévez] 22-06-2021 08:45:35

Yo creo que lo más sencillo es que no intentes controlar los errores en la entrada del usurio, sino que esperes a que la Base de Datos te devuelva el error, lo captures y lo muestres.

isracdc 22-06-2021 16:46:44

1 Archivos Adjunto(s)
Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 541421)
Yo creo que lo más sencillo es que no intentes controlar los errores en la entrada del usurio, sino que esperes a que la Base de Datos te devuelva el error, lo captures y lo muestres.

Gracias por tu respuesta, sería una opción, pero el problema es q al momento de que el DBEdit en cuestion pierde el foco y pasar a otro componente, ya me marca el error, traté de utilizar el evento OnExit del DBEdit y tampoco resulta, al parecer se verifica el dato antes de dispararse OnExit, así que no me dejaría probar lo que tu mencionas.
Adjunto una captura, al momento de editar el Precio de compra y querer pasar al sgte, me salta ese error, q claro, es lo correcto, pero un usuario q no sepa inglés no va a entender el mensaje de error.

movorack 22-06-2021 17:21:48

Al ser un DBEdit, estará asociado a un dataset y en este se puede realizar la validación que buscas en el evento OnValidate del campo "precioc_prod".

Si no tienes persistentes los campos en el dataset, sería agregarlos en tiempo de diseño. Y esto te daría la opción de establecer el código de ese evento.

ecfisa 22-06-2021 18:20:19

Hola.

Una opción es interceptar el evento OnSetText del campo asociado que se dispara cada vez que se recibe un nuevo valor pero antes de ser asignado.

Por ejemplo, si el campo asociado al DBEdit se llamase "Numero":
Código Delphi [-]
procedure TuForm.TuDataSetNumeroSetText( Sender: TField; const Text: string );
var
  e: Extended;
begin
  if not TryStrToFloat( Text, e ) then
    raise Exception.Create( 'No es un número decimal válido' );
end;

Saludos :)

isracdc 22-06-2021 20:46:44

Traté con tu código, en lo que equivaldría a c++ builder, pero me arroja error en la línea donde creas la excepción, que creo q eso es lo que necesito, de casualidad no sabes el código para el C builder? O qué es lo que estaría haciendo mal yo?

Código:

void __fastcall Tdmquerys::qdetdetallespreciov_prodSetText(TField *Sender, const UnicodeString Text)

{
        Extended e;
        if(!(TryStrToFloat(fdetprod->dbedetpc->Text, e))){
                //La excepción    raise Exception.Create( 'No es un número decimal válido' );
        }
}

Aclaro, el DBEdit lo tengo en un Form(fdetprod), y la información se llena desde un DataSet conectado a un ADOQuery (qdetdetalles).
Gracias por responder

isracdc 22-06-2021 20:48:13

Cita:

Empezado por movorack (Mensaje 541435)
Al ser un DBEdit, estará asociado a un dataset y en este se puede realizar la validación que buscas en el evento OnValidate del campo "precioc_prod".

Si no tienes persistentes los campos en el dataset, sería agregarlos en tiempo de diseño. Y esto te daría la opción de establecer el código de ese evento.


A qué te refieres con campos "persistentes"? Investigando me topé con ese término, pero no encontré info.....entendible jeje

ecfisa 22-06-2021 21:18:16

Hola.
Cita:

Empezado por isracdc (Mensaje 541439)
...de casualidad no sabes el código para el C builder? ...

No tengo C++ Builder en este momento pero intenta de este modo:
Código PHP:

...
   throw 
Exception"No es un número decimal válido" ); 

Saludos :)

ecfisa 22-06-2021 21:25:41

Hola de nuevo.

Y en tu código podes usar el parámetro Text directamente:
Código PHP:

void __fastcall Tdmquerys::qdetdetallespreciov_prodSetText(TField *Sender
  const 
UnicodeString Text)
{
  
Extended e;
  if ( !( 
TryStrToFloatText) ) )
  ... 

Saludos :)

isracdc 22-06-2021 21:28:36

Cita:

Empezado por ecfisa (Mensaje 541441)
Hola.


No tengo C++ Builder en este momento pero intenta de este modo:
Código PHP:

...
   throw 
Exception"No es un número decimal válido" ); 

Saludos :)


Genio!!!! Si, me ha resultado, eso era lo que estaba necesitando, muchas gracias

void __fastcall Tdmquerys::qdetdetallesprecioc_prodSetText(TField *Sender, const UnicodeString Text)

Código:

{
        Extended e;
        if(!(TryStrToFloat(fdetprod->dbedetpc->Text, e))){
                throw Exception( "No es un número decimal válido" );

}

Dejo el pequeño código por si a alguien le sirve.
Gracias y saludos :D

isracdc 22-06-2021 21:38:33

Cita:

Empezado por ecfisa (Mensaje 541442)
Hola de nuevo.

Y en tu código podes usar el parámetro Text directamente:
Código PHP:

void __fastcall Tdmquerys::qdetdetallespreciov_prodSetText(TField *Sender
  const 
UnicodeString Text)
{
  
Extended e;
  if ( !( 
TryStrToFloatText) ) )
  ... 

Saludos :)

Una duda más, que pasaría en el else? O cúal sería la sentencia que controla lo que pasa si es q la condición if ( !( TryStrToFloat( Text, e ) ) ) de resultado Falso? Es decir, cuál sería el código q indique que....."El dbeedit se llena normalmente"?

ecfisa 22-06-2021 21:43:49

Hola.

Si TryStrToFloat devuelve verdadero ( el numero es correcto ) continúa con el flujo del programa, en caso contrario lanza la excepción.

Saludos :)

isracdc 22-06-2021 22:05:37

Eso creí, pero, mi pregunta iba porque lanza la excepción correctamente, pero ahora, al colocar un valor correcto, el DBEdit vuelve al valor que tenía de inicio, es como si se refrescara y no queda el valor q edité (ReadOnly está en False, por si acaso :D)

ecfisa 22-06-2021 22:20:39

Hola.

Ahora te entiendo, no tengo como probarlo pero creo que sería:
Código PHP:

...
  if ( !( 
TryStrToFloatText) ) )
    throw 
Exception"No es un número decimal válido" );
  else
     
Sender->AsString Text

Saludos :)

isracdc 22-06-2021 22:58:37

Cita:

Empezado por ecfisa (Mensaje 541447)
Hola.

Ahora te entiendo, no tengo como probarlo pero creo que sería:
Código PHP:

...
  if ( !( 
TryStrToFloatText) ) )
    throw 
Exception"No es un número decimal válido" );
  else
     
Sender->AsString Text

Saludos :)


Exacto! Eso era lo q faltaba, ahora si funciona todo correctamente, mil gracias!


La franja horaria es GMT +2. Ahora son las 14:58:12.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi