Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Dos decimales en un Edit (https://www.clubdelphi.com/foros/showthread.php?t=52866)

RoyTan 02-02-2008 03:05:17

Dos decimales en un Edit
 
Saludos.

Creo sinceramente que pregunto demasiado, pero no tengo más remedio.
O no me entero de cómo se busca en los foros mensajes ya escritos, o sencillamente no están las consultas que yo hago, bueno creo que soy yo el que busca mal, en fin si alguien considera que soy un poco pesado ruego me lo haga saber y pediré mil disculpas.

Gracias.

Mi problema es el siguiente:

Necesito introducir en un Edit solo números una coma y solo dos decimales no mas.

Ejemplo 12345,00

El código para introducir números y cambiar el punto por la coma lo he encontrado y funciona perfecto, es este.

Código Delphi [-]
procedure TF_Cuentas.Edit1KeyPress(Sender: TObject; var Key: Char);
 Var i: Integer;
begin
   i:=0;

  if ( StrScan('0123456789.'+chr(7)+chr(8), Key) = nil ) then  Key := #0;
 // cambia el punto decimal por coma
  if key = '.' then key := ',';
  //controlar entrada una sola coma
  for i := 1 to length(Edit1.Text) do
    if ( copy(Edit1.Text,i,1) = ',' ) and not ( StrScan(',', Key) = nil ) then  Key := #0;

end;

Solo falta que después de la coma solo se introduzca dos decimales.

¿Es esto que pido posible?

Gracias.

dec 02-02-2008 03:07:47

Hola,

A lo mejor te interesaría utilizar el componente "TMaskEdit", que parece más indicado que el "TEdit" para lo que necesitas.

RoyTan 02-02-2008 03:14:17

Hola Dec.

Seguramente tienes razón, pero lo he utilizado en algunas ocasiones y me da muchos problemas, es un componente que no entiendo muy bien, quizas sea por eso.

Gracias pero prefiero no utilizarlo, no me ha ido muy bien con el.

Gracias de todas formas.

cHackAll 02-02-2008 03:33:51

Código Delphi [-]
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var pos: Cardinal;
begin
 with Sender as TEdit do
  begin
   pos := System.Pos(',', Text);
   if not LongBool(Pos) then Dec(Pos);
   ReadOnly := not (Key in ['0'..'9', ',', #8]) or
               (Pos <> $FFFFFFFF) and (Key = ',') or
               ((Key <> #8) and (Pos < (SelStart - 1)));
  end;
end;

RoyTan 02-02-2008 03:42:52

Muchas Gracias chackAll.

Un codigo perfecto.

Funciona a las mil maravillas.

Gracias.:D

egostar 02-02-2008 21:43:16

Cita:

Empezado por cHackAll (Mensaje 262945)
Código Delphi [-]
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var pos: Cardinal;
begin
 with Sender as TEdit do
  begin
   pos := System.Pos(',', Text);
   if not LongBool(Pos) then Dec(Pos);
   ReadOnly := not (Key in ['0'..'9', ',', #8]) or
               (Pos <> $FFFFFFFF) and (Key = ',') or
               ((Key <> #8) and (Pos < (SelStart - 1)));
  end;
end;

Epale amigo cHackAll, probé el código y funciona muy bien, pero le he dado mas de dos repasadas y NPI que estas haciendo, :D:D:D, bueno algún día lo entenderé....:rolleyes::D

Salud OS

MAXIUM 03-02-2008 04:30:45

Muchisimas gracias por vuestro código, dime como puedo modificarlo para además solo permita valores negativos es decir solo un singno '-'

Yo usaba este código:
Código Delphi [-]
If key in ['-',','] then
     case key of
          '-': if (length((sender as TEdit).Text)>0) then
               if ((pos('-',(sender as TEdit).Text)<>0) or
                  ((sender as TEdit).SelStart >0))
               and
                  ((sender as TEdit).SelLength <> length((sender as TEdit).Text))
               then key:=#0;
          ',': if ((pos(',',(sender as TEdit).Text)<>0) and
                  (pos(',',(sender as TEdit).SelText)<>0))
               xor
                  (pos(',',(sender as TEdit).Text)<>0) or
                  ((length((sender as TEdit).Text)>0) and
                  ((sender as TEdit).Text[length((sender as TEdit).Text)] = '-')) or
                  ((sender as TEdit).SelLength = length((sender as TEdit).Text)) or
                  ((sender as TEdit).SelStart = 0)
               then key:=#0;
     end
     else if not (key in ['0'..'9',#8]) then key:=#0;

keyboy 03-02-2008 08:32:51

Cita:

Empezado por cHackAll (Mensaje 262945)
Código Delphi [-]
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var pos: Cardinal;
begin
 with Sender as TEdit do
  begin
   pos := System.Pos(',', Text);
   if not LongBool(Pos) then Dec(Pos);
   ReadOnly := not (Key in ['0'..'9', ',', #8]) or
               (Pos <> $FFFFFFFF) and (Key = ',') or
               ((Key <> #8) and (Pos < (SelStart - 1)));
  end;
end;

Curioso código. Creo que podríamos agregar esta condición:

Código Delphi [-]
((Key = ',') and (Length(Text) - SelStart > 2)

Para evitar que alguien escriba 1234, mueva el cursor tres lugares hacia atrás y escriba una coma.

Bye

Lepe 03-02-2008 16:38:44

Hay muchos componentes numéricos, creo debería usarse alguno, de la JVCL, RxLib, torry.net, etc.

Si usas el botón derecho y pegar, verás que no se produce el evento OnkeyPress/down, así que tendrás que validar ese texto de nuevo, o añadir un popup al edit sin elementos (para eliminar el popup de windows).

De todas formas, siempre tendrás que convertir ese texto a número; usando un componente especializado, tendrás:
edit1.AsFloat;
edit1.AsInteger;
etc.

Saludos


La franja horaria es GMT +2. Ahora son las 05:07: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