Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Formato de separador decimal (https://www.clubdelphi.com/foros/showthread.php?t=45272)

MaMu 27-06-2007 20:43:30

Formato de separador decimal
 
Resulta que yo tengo un formulario en donde cargo el importe y cargo la cantidad, y multiplicando ambos obtengo el Subtotal de dicho concepto. Pero me pasa, que limite el TEdit a que solo puedan ingresar numeros reales, para evitar todo margen de error por parte del usuario. Pero tengo un problema, yo cargo este resultado en el campo de una tabla cuyo formato es Currency, y dependiendo el tipo de configuración de cada computadora en donde ejecute el programa, me toma como separador de decimales de la moneda, un punto "." o una coma ",". Lo cual, yo por medio de este procedimiento, restrinjo el TEdit de la siguiente manera:

Código Delphi [-]
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
 var sNumAnterior:string;
 begin
   sNumAnterior := (sender as TEdit).Text;
   if (key <> #3) and (key <> #22) then  // #3 = Copiar (Ctrl + C)
   begin                                 // #22 = Pegar (Ctrl + V)
     if key in ['-','.'] then
     begin
       if (pos(key,(sender as TEdit).Text) > 0) and
          (pos(key,(sender as TEdit).SelText) = 0)
          then key:=#0;
       case key of
         '-': if ((sender as TEdit).SelStart > 0) then key:=#0;
         '.': if ((sender as TEdit).SelStart = 0) or
                 (((sender as TEdit).SelStart = 1) and
                 ((sender as TEdit).Text[1] = '-'))
              then key:=#0;
       end;
     end
     else if not (key in ['0'..'9',#8]) then key:=#0;
   end;
   if key = #22 then
   try
     key := #0;
     (sender as TEdit).PasteFromClipBoard;
     StrToFloat((sender as TEdit).Text);
   except
     (sender as TEdit).Text := sNumAnterior;
     (sender as TEdit).SelStart := Length((sender as TEdit).Text);
   end;
 end;

Pero me pasa que, en una computadora, si utilizo el punto "." me anda bien, pero en otra, tengo que usar la coma ",", ya que sino, no me permite agregar el registro, dependiendo de si en Edit2.Text utilice punto "." o coma "," como separador decimal:

Código Delphi [-]
QCaja.Insert;
  try
    if ComboBox1.Text='EGRESO'
      then QCaja.FieldByName('conceptoDEBE').AsString:=ComboBox2.Text
        else QCaja.FieldByName('conceptoHABER').AsString:=ComboBox2.Text;
    QCaja.FieldByName('movimiento').AsString:=ComboBox1.Text;
    QCaja.FieldByName('cantidad').AsInteger:=StrToInt(SpinEdit2.Text);
    QCaja.FieldByName('importe').AsCurrency:=StrToCurr(Edit2.Text)*StrToInt(SpinEdit2.Text);
    QCaja.FieldByName('fecha').AsDateTime:=DateTimePicker1.DateTime;
    QCaja.Post;
  except
    QCaja.Cancel;
  end;

Tengo alguna forma de detectar que separador decimal tengo que usar segun la configuración actual de la computadora en que ejecute la aplicación??

Saludos

jhonny 27-06-2007 23:14:42

Mira, haz la siguiente prueba...

Código Delphi [-]
ShowMessage(DecimalSeparator);

Eso te mostrara el separador decimal de dicha aplicación.

Y si quieres ver el separador de miles, es...
Código Delphi [-]
ShowMessage(ThousandSeparator);

Esas dos variables puedes cambiarlas para que trabajen en tu aplicación como tu quieras, asi por ejemplo:

Código Delphi [-]
 
DecimalSeparator := '.';
ThousandSeparator := ',';
Espero te sirva.

jhonny 27-06-2007 23:26:11

Si me permites "pachotear" en cierta forma tu codigo, al final esta sería una versión funcional, que solo adapta lo anteriormente dicho por mi, pero a tu propio codigo ;):
Código Delphi [-]
 
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var sNumAnterior:string;
begin
   sNumAnterior := (sender as TEdit).Text;
   if (key <> #3) and (key <> #22) then  // #3 = Copiar (Ctrl + C)
   begin                                 // #22 = Pegar (Ctrl + V)
     if key in ['-',DecimalSeparator] then
     begin
       if (pos(key,(sender as TEdit).Text) > 0) and
          (pos(key,(sender as TEdit).SelText) = 0)
          then key:=#0;
       if key ='-' then
       begin
         if ((sender as TEdit).SelStart > 0) then key:=#0;
       end
       else
       begin
         if key = DecimalSeparator then
         begin
           if ((sender as TEdit).SelStart = 0) or
                 (((sender as TEdit).SelStart = 1) and
                 ((sender as TEdit).Text[1] = '-'))
              then key:=#0;
         end;
       end;
     end
     else if not (key in ['0'..'9',#8]) then key:=#0;
   end;
   if key = #22 then
   try
     key := #0;
     (sender as TEdit).PasteFromClipBoard;
     StrToFloat((sender as TEdit).Text);
   except
     (sender as TEdit).Text := sNumAnterior;
     (sender as TEdit).SelStart := Length((sender as TEdit).Text);
   end;
end;

Espero que esto te ayude.

MaMu 28-06-2007 03:51:40

SOLUCIONADO

Un fenómeno jhonny y gracias por el "pachoteo", ya adapté todo y funciona de mil maravillas. AHora tengo una pregunta que no tiene nada que ver, pero que componente visual me recomendas para hacer una grafica estadistica de entradas y salidas de una caja (mensual y anual).

Saludos

jhonny 28-06-2007 14:47:14

Cita:

Empezado por mamu
SOLUCIONADO

Un fenómeno jhonny y gracias por el "pachoteo", ya adapté todo y funciona de mil maravillas. AHora tengo una pregunta que no tiene nada que ver, pero que componente visual me recomendas para hacer una grafica estadistica de entradas y salidas de una caja (mensual y anual).

Saludos

Seguramente estaremos hablando del TChart o el TDBChart (Según tu necesidad) ;)


La franja horaria es GMT +2. Ahora son las 04:10:08.

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