Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Problema con excepción (https://www.clubdelphi.com/foros/showthread.php?t=81370)

franroju 08-11-2012 15:01:59

Problema con excepción
 
Buenas gente. Pequeño problemilla.

Tengo un edit, cuyo texto debo pasarlo a nro. decimal para guardarlo en una tabla. Para chequear que el usuario escriba un nro. decimal y no cualquier cosa, hice lo siguiente:

Código Delphi [-]
try
      subtotal := StrToFloat(Edit6.Text);
      except
        on E: Exception do
        begin
          Edit6.Text := '';
          Edit6.SetFocus;
        end;
 end;

La cuestión es que no me lo toma, arroja error igual cuando no puede castearlo. Me pareció más fácil realizar esto que ponerme a chequear los caracteres que ingresa, que si son nros, que si es una coma, etc, etc. O capaz hay alguna solución mejor???

Toda ayuda es aceptable, ja. Uso delphi 7

Muchas gracias

Ñuño Martínez 08-11-2012 15:47:04

Ahora mismo no lo encuentro (uso Lazarus), pero si no recuerdo mal TMaskEdit tienen la capacidad de seleccionar qué tipo de entrada se permiten. También puedes intentar con un TSpinEdit o un TFloatSpinEdit. No sé si estarán disponibles para Delphi 7, pero al menos el TSpinEdit sí estaba disponible para Delphi 6, si no recuerdo mal.

roman 08-11-2012 18:11:30

Cita:

Empezado por franroju (Mensaje 448930)
La cuestión es que no me lo toma, arroja error igual cuando no puede castearlo.

No necesariamente esto es cierto :D

Si ejecutas la aplicación desde el IDE de Delphi y tienes activada la opción Debugger|Stop on Delphi Exceptions, de tods forms te saltará la excepción. Prueba desactivando la opción o ejecutando desde fuera del IDE.

Por otro lado, siempre es mejor manejar la excepción que más se ajuste en lugar de una genérica:

Código Delphi [-]
try
      subtotal := StrToFloat(Edit6.Text);
      except
        on E: EConvertError do
        begin
          Edit6.Text := '';
          Edit6.SetFocus;
        end;
 end;

De esta manera, si el código falla por otra razón, sabrás cuál es y no pensarás que fue un error de conversión.

// Saludos

ecfisa 08-11-2012 21:59:15

Hola.

Otra opción puede ser:
Código Delphi [-]
var
  Value: Double;
begin
  with Edit6 do
  begin
    if not TryStrToFloat(Text, Value) then
    begin
      Text := '';
      SetFocus;
    end;
  end;
  ...

Saludos.

nlsgarcia 08-11-2012 22:59:12

franroju,

Puedes asignar este código al evento OnKeyPress del Control TEdit:
Código Delphi [-]
procedure TForm1.CheckNumberKey(Sender: TObject; var Key: Char);
begin
   If not (Key in ['0'..'9']) then Key := Chr(0);
end;
El código anterior solo permitirá ingresar números en el Control TEdit, otra opción interesante es el Control TMaskEdit con la mascara de edición 0 para permitir solo números.

Espero sea útil :)

Nelson.

franroju 10-11-2012 01:04:57

Perdón por la demora. Román, lo que me dijiste vos lo descubrí en uno de los posts que aparecen abajo. Y lo de EConvertError, es verdad, lo tenía así. Pero cuando pasé el código había realizado 2348320974289347239 pruebas con tal de que me funcione, ja.

Eficsa, esa no la sabía, así que es un buen aporte.

nlsgarcia, eso no me sirve ya que quiero evaluar nros decimales, y tu código no me permitiría ingresar comas.

Gracias a todos

nlsgarcia 10-11-2012 01:18:45

franroju,

El código se puede ampliar para aceptar cualquier carácter válido:
Código Delphi [-]
procedure TForm1.CheckNumberKey(Sender: TObject; var Key: Char);
begin
   If not (Key in ['0'..'9',',']) then Key := Chr(0);
end;
Debes validar que la coma sea colocada en el lugar que requiere tu aplicación.

Espero sea útil :)

Nelson.

nlsgarcia 10-11-2012 02:19:24

franroju,

Esta es una variante que permite al Control TEdit ingresar números, validar que la coma no sea colocada en la posición 1 o más de una vez y usar la tecla de retroceso (#8):
Código Delphi [-]
procedure TForm1.CheckNumberKey(Sender: TObject; var Key: Char);
begin

   If (Length(Edit1.Text) = 0) and (Key = ',') then
   begin
      Key := Chr(0);
      exit;
   end;

   if (Pos(',',Edit1.Text) <> 0) and (Key = ',') then
   begin
      Key := Chr(0);
      exit;
   end;

   // Solo permite ingresar caracteres númericos, coma y tecla de retroceso.
   If not (Key in ['0'..'9',',',#8]) then Key := Chr(0);

end;
Espero sea útil :)

Nelson.


La franja horaria es GMT +2. Ahora son las 22:44:47.

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