Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 08-03-2005
alfredosg19 alfredosg19 is offline
Miembro
 
Registrado: ene 2005
Ubicación: Barcelona
Posts: 91
Poder: 20
alfredosg19 Va por buen camino
Problema con el TEdit y las comas

Hola, aunque el tema del TEdit ya se ha tratado (en relación de como cambiar las comas a puntos y viceversa) no he visto el de como hacer que solo se puedan introducir una coma, verán aunque les parezca una tonteria me he llevado podriamos decir toda la mañana y no he podido, he hecho funciones para contar las comas que hay en el TEdit pero al final solo me cuenta el ultimo carácter(NO VALE), he pasado el contenido de del TEdit caracter a caracter a un Array (y tampoco me ha servido porque a la hora de escribirlo tengo que poner Edit:=array[1]+array[2].... y si hay alguno vacio se vuelve loco), he analizado carácter por carácter pasando el contenido a una variable string pero el problema es que el Edit se actualiza a cada momento y el String va un paso por detrás. He probado con el modificando el formato con el format del Tedit pero después solo me deja modificar dentro un número. He probado con el EditMask pero no me hace la resta automática (solo el Tedit) y además no desaparece la coma cuando no le pongo decimales. No sé si esto es demasiado fácil y me complico demasiado la vida o que es realmente liado.
El caso compañeros es que hasta estoy mareado y cabreado porque era una cosa que yo suponia me llevaría un momento y me está resultando bastante difícil. ASí que si alguien sabe de alguna función, o algo para solucionar este problema. Muchas gracias.
__________________
"La perseverancia es el camino del éxito"
Responder Con Cita
  #2  
Antiguo 08-03-2005
Alfredo Alfredo is offline
Miembro
 
Registrado: nov 2003
Ubicación: Valencia, Venezuela
Posts: 234
Poder: 21
Alfredo Va por buen camino
Lo que quieres que se pueda ingresar una sola coma? Pero que vas a meter en edit? Explicame para ver si te puedo ayudar....
__________________
if Vivir = Vivir + Aprender then Aprender = ?
Alfredo Borges
Responder Con Cita
  #3  
Antiguo 08-03-2005
Avatar de Ohcan
[Ohcan] Ohcan is offline
Miembro Premium
 
Registrado: ago 2004
Ubicación: Madrid (España)
Posts: 119
Poder: 20
Ohcan Va por buen camino
Lightbulb

Hola alfredosg19
¿Lo que quieres es que el contenido del edit sea numérico (integer o float)?
Si es así, puedes definirte una función de este estilo:
Código Delphi [-]
function ComprobarNumerico(Texto: String; Key:Char): Char;
begin
  if Key <> Char(VK_BACK) then
    begin
      try
        if Key in[',','.'] then Key := DecimalSeparator;
        StrToFloat(Texto + Key + '0');
      except
        Result:=#0;
        Exit;
      end;
    end;
  Result := Key;
end;

Estoy escribiendo de memoria...
A esta funcion la llamas desde el evento onKeyPress del Edit de esta forma:
Código Delphi [-]
Key := ComprobarNumerico(MiEdit.Text; Key:Char);

Espero que te sirva...
__________________
La violencia es el último recurso del incompetente. (Salvor Hardin)
Responder Con Cita
  #4  
Antiguo 08-03-2005
alfredosg19 alfredosg19 is offline
Miembro
 
Registrado: ene 2005
Ubicación: Barcelona
Posts: 91
Poder: 20
alfredosg19 Va por buen camino
Me da error

Hola, he aplicado el ejemplo que me dejaste pero me sigue dando error, aprovecho para explicar el problema mejor. Tengo un Tedit en el que solo quiero permitir entrar numeros, hasta aquí todo está bien porque pongo este coódigo en el
procedure
Código:
   FrmCanvi.edPagatKeyPress(Sender: TObject; var Key: Char);
 begin
 
   If (contarcomes(edPagat.Text)=0) then
 	If Not (Key IN ['0'..'9',#8,',']) then
 	key := #0;
 
   if (contarcomes(edPagat.Text)>0) or (key=',')then
 	If Not (Key IN ['0'..'9',#8]) then
 	key := #0;
   end;
Donde contarcomes es una función que he hecho yo para contar las comas del Tedit pero que no funciona el código es:
Código:
 function TfrmCanvi.contarcomes(n:string): integer;
 var
 car: string;
 i,coma: Integer;
 begin
 coma:=0;
   For I:=0 to Length(n) do
   car:=copy(n,i,1);
   if car=',' then
   coma:=coma+1;
 
   result:=coma;
 end;
El problema es que quiero que me acepte una coma en el Tedit, en la posición que la ponga el usuario menos en el primer carácter (daria error por el Float) y en el último caràcter. Además quiero que en los carácteres del medio sólo pueda haber una coma. Todo esto se complica más porque tengo una función que hace una resta con este número con cada carácter que se introduce en el edit, quiero decir que si la coma está mal puesta o si hay más de una coma el programa da error y esto es lo que quiero evitar.
__________________
"La perseverancia es el camino del éxito"
Responder Con Cita
  #5  
Antiguo 08-03-2005
Avatar de Ohcan
[Ohcan] Ohcan is offline
Miembro Premium
 
Registrado: ago 2004
Ubicación: Madrid (España)
Posts: 119
Poder: 20
Ohcan Va por buen camino
Question

No estoy muy seguro de entenderte...

Con lo que te he pasado evitas:
- Que se introduzcan letras o espacios o cualquier cosa que no sea un número o el DecimalSeparator.
- No permite que la primera sea una coma (o el separador decimal que sea)
- No permite más de una coma (o el separador decimal que sea)
Puede que tú problema (si me he enterado) esté en esa cuenta que haces según se introducen los dígitos... y sobre todo en el momento en el que el usuario inserta la coma...
¿Y si, cuando haces esa cuenta, si la última es la coma no la "obvias"?
Me explico (estoy espeso): si cuando vas a hacer la cuenta, el número introducido es, por ejemplo, "12334,"...
Quítale la "," y usa "12334" para la operación

¿Es eso?
__________________
La violencia es el último recurso del incompetente. (Salvor Hardin)
Responder Con Cita
  #6  
Antiguo 08-03-2005
alfredosg19 alfredosg19 is offline
Miembro
 
Registrado: ene 2005
Ubicación: Barcelona
Posts: 91
Poder: 20
alfredosg19 Va por buen camino
Gracias Ohcan, pero...

Gracias Ohcan por tu ayuda, a ver el problema está en que me da error y no podido si quiera ver si lo que me dijiste funciona (que seguro que sí, quiero decir que no lo he podido probar), el fallo es que algo falta en la función y me dice esto:
[Error] UFRMCanvi.pas(111): Not enough actual parameters
__________________
"La perseverancia es el camino del éxito"
Responder Con Cita
  #7  
Antiguo 08-03-2005
Avatar de Ohcan
[Ohcan] Ohcan is offline
Miembro Premium
 
Registrado: ago 2004
Ubicación: Madrid (España)
Posts: 119
Poder: 20
Ohcan Va por buen camino
¡Ah!
Bueno... el error.. ¿en qué línea (dinos el código) te salta?
En esa línea debes estar haciendo una llamada a una función o un procedimiento,
pero te falta incluir algún/os parámetro/s...
O algo por el estilo...
__________________
La violencia es el último recurso del incompetente. (Salvor Hardin)
Responder Con Cita
  #8  
Antiguo 08-03-2005
alfredosg19 alfredosg19 is offline
Miembro
 
Registrado: ene 2005
Ubicación: Barcelona
Posts: 91
Poder: 20
alfredosg19 Va por buen camino
Aqui da el error.

El error me da aquí:

procedure TfrmCanvi.edPagatKeyPress(Sender: TObject; var Key: Char);
begin

Key := ComprobarNumerico(EdPagat.Text; Key:Char);

Ayyy....
__________________
"La perseverancia es el camino del éxito"
Responder Con Cita
  #9  
Antiguo 08-03-2005
Avatar de Ohcan
[Ohcan] Ohcan is offline
Miembro Premium
 
Registrado: ago 2004
Ubicación: Madrid (España)
Posts: 119
Poder: 20
Ohcan Va por buen camino
Talking

¡Ya lo tengo!
"Mea culpa" te puse en la primera respuesta:

A esta funcion la llamas desde el evento onKeyPress del Edit de esta forma:
Key := ComprobarNumerico(MiEdit.Text; Key:Char);

Y ese ";"... debería ser una coma ","...

Así que intenta simplemente

Key := ComprobarNumerico(EdPagat.Text, Key:Char);

Y me cuentas... yo me marcho hasta mañana ... que ya es hora
__________________
La violencia es el último recurso del incompetente. (Salvor Hardin)
Responder Con Cita
  #10  
Antiguo 08-03-2005
alfredosg19 alfredosg19 is offline
Miembro
 
Registrado: ene 2005
Ubicación: Barcelona
Posts: 91
Poder: 20
alfredosg19 Va por buen camino
Hola por fin lo solucioné, como puedes ver la solución no era nada complicada pero supongo que son esas cosas fáciles en la que cuesta caer, o mejor dicho a mí me cuesta caer. Primero hago una comprobació para ver si se ha puesto la coma en el TEDit, si ya está escrita quiere decir que no se puede volver a escribir por lo que le doy el valor de false a la función y si no está escrita true.

Cita:
function TfrmCanvi.Activacomes: Boolean;
var
I, cont: Integer;
car, copia: String;
begin
cont:=0;
copia:=edPagat.Text;
For i:=0 to Length(copia) do
Begin
car:=copy(copia,i,1);
if car=',' then
cont:=cont+1;
end;

if cont>0 then
result:=False
else
result:=True;
end;
El siguiente paso es decir que si las comas están activadas las dejamos que se escriban, pero si el valor de la función anterior es false no se podrán escribir. Tampoco se podrá escribir la coma como primer carácter del Tedit.

Cita:
procedure TfrmCanvi.edPagatKeyPress(Sender: TObject; var Key: Char);
Begin
Activacomes;
If Activacomes=False then
If Not (Key IN ['0'..'9',#8]) then
key :=#0 ;


If Activacomes=True then
Begin
If Not (Key IN ['0'..'9',#8,',']) then
key := #0;
If (Key=',') and (edPagat.Text='') then
If Not (Key IN ['0'..'9',#8]) then
key :=#0 ;
end;
end;
De esta manera consigo tener un TEdit que realizas operaciones matemáticas al mismo tiempo que le introducimos los datos y nunca da error el programa. Espero que sirva mi experiencia para ayudar a otros.
Ohran de todas formas muchas gracias por todo, seguramente si te hubiese explicado mejor mi problema me hubieras podido ayudar mejor. Hasta pronto.
__________________
"La perseverancia es el camino del éxito"
Responder Con Cita
  #11  
Antiguo 09-03-2005
rafita rafita is offline
Miembro
 
Registrado: ago 2003
Ubicación: Cuenca- España.
Posts: 309
Poder: 21
rafita Va por buen camino
hola a todos,
creo que el problema ya lo teneis solucionado, pero quería mostrar una forma corta de hacerlo
En el evento OnKeyPress del campo pongo este procedimiento:
Código:
procedure TFTrataResiduos.SoloNumerosYComa(Sender: TObject; var Key: Char);
begin
  if Key='.' then Key:=',';		    //admito el punto para introducir los decimales, pero lo cambio por la coma
  if Pos(',',LabeledEdit3.Text)=0 then
	 if not (Key in ['0'..'9',',',#8]) then Key:=#0  //si no hay una coma, la admito como carácter válido
	 else Exit
  else
	 if not (Key in ['0'..'9',#8]) then Key:=#0;	 //si hay alguna coma, ya no admito más
end;
hasta ahora me ha funcionado

Saludos,
__________________
Rafita.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 05:21:45.


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
Copyright 1996-2007 Club Delphi