PDA

Ver la Versión Completa : Solo letras y numeros en edit


oesteve
07-07-2003, 09:05:57
Hola amigos, os escribo porque no se como hacer para que dentro de un edit solo pueda poner letras y numeros y en caso de que el caracter introducido no sea ni letra ni numero, sacar un mensaje informativo advirtiendolo.

Gracias.

andres1569
07-07-2003, 09:42:34
Hola:

Mírate este hilo, donde se dan diversas opciones para controlar la entrada de caracteres en un TEdit o en un TMaskEdit:

http://www.clubdelphi.com/foros/showthread.php?s=&threadid=1823

Posiblemente la parte que te interese sea la de interceptar el evento OnKeyPress y ahí controlas que los caracteres introducidos sean de tu gusto, si no lo son haces la asignación Key = #0, y anulas la pulsación. Revisa también los caracteres de las teclas Retroceso y Suprimir, que no debes anular normalmente.

migueweb
19-05-2010, 17:35:20
Hola amigos, estoy hace unos días tratando de lograr que en un edit, solo se puedan introducir texto o solo números y no lo he logrado, he probado las variantes aquí vistas y no me han funcionado, yo trabajo con delphi 7, necesito su ayuda pues es un proyecto de mi escuela.

fidel
19-05-2010, 17:54:28
Si buscas en el foro encontrarás algo como esto

En el evento OnKeyPress del edit pones:

para solo números

if ( StrScan('0123456789'+chr(7)+chr(8), Key) = nil ) then Key := #0;


sustituye 0123456789 por los caracteres que quieras que solo admita

migueweb
19-05-2010, 21:56:03
Perfecto, muchas gracias, ya esta haciendo lo que deseaba con el edit para solo admitir numeros, ahora como hago para que solo me admita letras, porque de usar este tendría que utilizar o mejor dicho poner todas las vocales del abecedario tanto las minusculas como las mayusculas y seria muy grande el codigo

fidel
20-05-2010, 00:06:34
Tampoco son tantas, alrededor de 50, pero si no hazlo así, con pitido incluido en caso de no pulsar letra.

if not (key in ['a'..'z','A'..'Z', #7, #8, #13]) then
begin
Key := #0;
Beep;
end;

migueweb
20-05-2010, 16:03:41
Gracias ya todo esta resuelto por esa parte ahora explicame algo si yo quiero sacar el promedio de números que se encuentran en tres edit distintos y que me muestre el resultado en un cuarto como seria

fidel
20-05-2010, 19:07:06
Deberías saber sacar la media de tres números: se suman los tres y se divide entre 3

Si son números enteros lo que entras en los edits, si no cambia StrToInt por StrToFloat

ShowMessage( FloatToStr ( StrToInt(Edit1.Text) + StrToInt(Edit2.Text) + StrToInt(Edit3.Text) ) / 3 ) );

Va de memoria y sin comprobar, revisa los paréntesis.

migueweb
20-05-2010, 22:08:56
Gracias colega me fue de mucha ayuda, ya resolvi la tarea completa aquí te dejo como resolvi lo del promedio o la forma en que lo hice

Edit10.Text := FloatToStr((StrToFloat(Edit2.text)+StrToFloat(Edit5.text)+StrToFloat(Edit8.text))/3)

Y este es el codigo completo de lo que hice:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, jpeg, Mask, ToolEdit, CurrEdit;

type
TForm1 = class(TForm)
Bevel1: TBevel;
Button1: TButton;
GroupBox1: TGroupBox;
Panel1: TPanel;
Label1: TLabel;
Edit1: TEdit;
Label2: TLabel;
Label3: TLabel;
Edit3: TEdit;
GroupBox3: TGroupBox;
Panel3: TPanel;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Edit4: TEdit;
Edit6: TEdit;
GroupBox2: TGroupBox;
Panel2: TPanel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Edit7: TEdit;
Edit9: TEdit;
Bevel2: TBevel;
Button3: TButton;
Button4: TButton;
Button5: TButton;
Edit10: TEdit;
Edit11: TEdit;
Edit12: TEdit;
Button2: TButton;
Image1: TImage;
Edit2: TEdit;
Edit5: TEdit;
Edit8: TEdit;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Edit5KeyPress(Sender: TObject; var Key: Char);
procedure Edit8KeyPress(Sender: TObject; var Key: Char);
procedure Edit3KeyPress(Sender: TObject; var Key: Char);
procedure Edit9KeyPress(Sender: TObject; var Key: Char);
procedure Edit6KeyPress(Sender: TObject; var Key: Char);
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
procedure Edit7KeyPress(Sender: TObject; var Key: Char);
procedure Edit4KeyPress(Sender: TObject; var Key: Char);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);


private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
close;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
I: Integer;
begin
for i := 0 to ComponentCount -1 do
if Components[i] is TEdit then
TEdit(Components[i]).Text := '';
end;

procedure TForm1.Edit5KeyPress(Sender: TObject; var Key: Char);
begin
if ( StrScan('0123456789,'+chr(7)+chr(8), Key) = nil ) then Key := #0;
end;

procedure TForm1.Edit8KeyPress(Sender: TObject; var Key: Char);
begin
if ( StrScan('0123456789,'+chr(7)+chr(8), Key) = nil ) then Key := #0;
end;

procedure TForm1.Edit3KeyPress(Sender: TObject; var Key: Char);
begin
if ( StrScan('0123456789'+chr(7)+chr(8), Key) = nil ) then Key := #0;
end;

procedure TForm1.Edit9KeyPress(Sender: TObject; var Key: Char);
begin
if ( StrScan('0123456789'+chr(7)+chr(8), Key) = nil ) then Key := #0;
end;

procedure TForm1.Edit6KeyPress(Sender: TObject; var Key: Char);
begin
if ( StrScan('0123456789'+chr(7)+chr(8), Key) = nil ) then Key := #0;
end;



procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if not (key in ['a'..'z','A'..'Z',' ','á','é','í','ó','ú','ü','Á','É','Í','Ó','Ú','Ü', #7, #8, #13]) then
begin
Key := #0;
Beep;
end;
end;

procedure TForm1.Edit7KeyPress(Sender: TObject; var Key: Char);
begin
if not (key in ['a'..'z','A'..'Z',' ','á','é','í','ó','ú','ü','Á','É','Í','Ó','Ú','Ü', #7, #8, #13]) then
begin
Key := #0;
Beep;
end;
end;

procedure TForm1.Edit4KeyPress(Sender: TObject; var Key: Char);
begin
if not (key in ['a'..'z','A'..'Z',' ','á','é','í','ó','ú','ü','Á','É','Í','Ó','Ú','Ü', #7, #8, #13]) then
begin
Key := #0;
Beep;
end;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
Edit10.Text := FloatToStr((StrToFloat(Edit2.text)+StrToFloat(Edit5.text)+StrToFloat(Edit8.text))/3)
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
Edit11.Text := FloatToStr((StrToFloat(Edit3.text)+StrToFloat(Edit9.text)+StrToFloat(Edit6.text))/3)
end;

procedure TForm1.Button5Click(Sender: TObject);
var
ma:real;
begin
ma:=StrToFloat(Edit2.text);
if ma<StrToFloat(Edit5.Text) then
ma:=StrToFloat(Edit5.Text);
if ma<StrToFloat(Edit8.Text) then
ma:=StrToFloat(Edit8.Text);
Edit12.Text:= FloatToStr(ma);
end;
end.

fidel
20-05-2010, 22:35:16
Si pones código delphi metelo entre las etiquetas, tienes aquí donde escribes las consultas un icono de delphi (el penúltimo), click sobre el y te salen dos etiquetas de principio y fin, pegas el código entre ellas, de esa forma se puede ver bien, si no es un lio.

El procedimiento de entrar solo números basta con que lo escribas una sola vez desde un edit, en el resto de los edits que lo utilizan vas a la ventanilla de su OnKeyPress y seleccionas el nombre del evento del primero y ya está.

Lo mismo para el procedimiento de entrar solo letras, con uno basta, el resto se pone el nombre del que ya está hecho.

migueweb
20-05-2010, 22:44:15
La primera partec de lo que me dijiste no lo entiendo la segunda si

fidel
21-05-2010, 00:56:49
Me refiero a cuando pongas código aquí en este foro, te quedaría así


procedure TForm1.Button1Click(Sender: TObject);
begin
close;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
I: Integer;
begin
for i := 0 to ComponentCount -1 do
if Components[i] is TEdit then
TEdit(Components[i]).Text := '';
end;

procedure TForm1.Edit5KeyPress(Sender: TObject; var Key: Char);
begin
if ( StrScan('0123456789,'+chr(7)+chr(8), Key) = nil ) then Key := #0;
end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if not (key in ['a'..'z','A'..'Z',' ','á','é','í','ó','ú','ü','Á','É','Í','Ó','Ú','Ü', #7, #8, #13]) then
begin
Key := #0;
Beep;
end;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
Edit10.Text := FloatToStr((StrToFloat(Edit2.text)+StrToFloat(Edit5.text)+StrToFloat(Edit8.text))/3)
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
Edit11.Text := FloatToStr((StrToFloat(Edit3.text)+StrToFloat(Edit9.text)+StrToFloat(Edit6.text))/3)
end;

procedure TForm1.Button5Click(Sender: TObject);
var
ma:real;
begin
ma:=StrToFloat(Edit2.text);
if ma<StrToFloat(Edit5.Text) then
ma:=StrToFloat(Edit5.Text);
if ma<StrToFloat(Edit8.Text) then
ma:=StrToFloat(Edit8.Text);
Edit12.Text:= FloatToStr(ma);
end;

end.

migueweb
21-05-2010, 05:29:45
Solo me falta arreglar algo en el programita que hice, necesito saber como yo puedo quitar en el promedio de edad todo lo que hay después de la coma es decir en ocaciones me queda el promedio de edad 35,66667, yo quiero que solo me quede 35 o que me redondee a 36, es esto posible

fidel
21-05-2010, 17:19:56
Mira en la ayuda
Fix
Round
FormatFloat
y utiliza la que te interese

ecfisa
21-05-2010, 20:58:36
Hola migueweb.

Esta función que utiliza Round,

function Redondea(Num: Double; NDec:Byte): Double;
begin
Result:= Round(Num * Exp(ln(10)*NDec)) / Exp(ln(10)*NDec);
end;

te devuelve el número real con la cantidad de cifras decimales que le indiques en el parámetro NDec.

Saludos.

ecfisa
21-05-2010, 21:37:55
Hola de nuevo.

Me acordé que si no sos partidario del fundamentalismo, podes usar la función SimpleRoundTo, pero debes incluir la unit Math.

Saludos.

migueweb
24-05-2010, 19:16:49
Después de mucho trabajo, pude ver la ayuda de delphi 7 porque tengo Seven instalado y no me abria la ayuda y no logro saber como funciona todo lo que me han dicho que pruebe, ahora les voy a explicar detalladamente que deseo

yo tengo este procedimiento

procedure TForm1.Button4Click(Sender: TObject);
begin
Edit11.Text := FloatToStr((StrToFloat(Edit3.text)+StrToFloat(Edit9.text)+StrToFloat(Edit6.text))/3)
end;

y deseo que el resultado me lo de como un número entero sin decimales, es decir 35, 34, 32 como podría hacerlo.

ecfisa
24-05-2010, 22:55:59
Hola de nuevo.

En tu caso, basta con agregar lo que te pongo en negrita:

Edit11.Text := FloatToStr(Round((StrToFloat(Edit3.text)+StrToFloat(Edit9.text)+
StrToFloat(Edit6.text))/3));


Saludos.

migueweb
25-05-2010, 18:42:34
Gracias a los que me han ayudado en la realización de este pequeño proyecto que me ayudaron a hacer

Ahora tengo otra pregunta quiero que este procedimiento

procedure TForm1.Button3Click(Sender: TObject);
begin
Edit10.Text := FloatToStr((StrToFloat(Edit6.Text)+StrToFloat(Edit8.Text)+StrToFloat(Edit9.Text))/3)
end;

Me muestre solo 2 lugares después de la coma(,) es decir 456,25

fidel
25-05-2010, 19:34:28
Con Round poniendo los decimales que quieres.
Con FormatFloat te formatea también los miles si quieres
FormatFloat('##,####,##0.00', valor);
puedes añadir un literal de lo que es
FormatFloat('##,####,##0.00 metros', valor);

ecfisa
25-05-2010, 20:37:29
Hola migueweb.

Dos cosas:

1) Indentá tu código con etiquetas, nos és más fácil de leer.

2) Cinco posts atrás te puse una función que redondea con las cifras decimales que quieras.

Se usa así:

Edit1.Text:= FloatToStr(Redondea(StrToFloat(Edit6.Text)+
StrToFloat(Edit8.Text)+StrToFloat(Edit9.Text)/3, 2));


Donde Redondea es la función, el primer parámetro es el número a redondear
y el segundo parámetro es el número de cifras decimales que queres obtener.

Saludos.

pnsd_89
28-06-2013, 17:47:52
perdón por la ignorancia pero el Key = #7 a que tecla se refiere?:confused:

Casimiro Notevi
28-06-2013, 18:25:29
El código 7 emite un "beep" por el altavoz interno :)

pnsd_89
28-06-2013, 20:21:33
Gracias Señor.
Lo que, no me queda claro es que el #13 = enter
el #27 = escape
el #8 = backspace todos se refieren a una tecla o siempre las tome como tal. O realmente a lo que se refieren a una "acción"?
y el #7 = pitido?
entonces es necesario en la condición preguntar si key = #7 ? si al final de las sentencias se le coloca el "Beep;" para que emita el sonido?

Casimiro Notevi
28-06-2013, 20:56:35
Se supone que la pregunta original del hilo es que sólo quería admitir letras y números en un edit, por lo tanto todo lo demás sobra, por eso el código pone que si es cualquier otra cosa (incluido caracteres de control) se eliminan. Tabla ASCII (http://es.wikipedia.org/wiki/ASCII)
Aunque hay otras formas más fácil de hacerlo, obviamente.

pnsd_89
28-06-2013, 21:03:33
Tampoco son tantas, alrededor de 50, pero si no hazlo así, con pitido incluido en caso de no pulsar letra.

if not (key in ['a'..'z','A'..'Z', #7, #8, #13]) then
begin
Key := #0;
Beep;
end;


Claro la pregunta original es la que mencionas pero la 4ta respuesta era esta que realmente lo resuelve pero no entiendo la función del #7 en la condición.

Casimiro Notevi
28-06-2013, 21:22:55
¡Ah, eso!, seguramente es para que cuando sustituya un carácter "no válido" emita un pitido que llame la atención del usuario que teclea.

Emite el pitido con el chr(7))y que retrocede un carácter atrás con el chr(8), según creo recordar.

Casimiro Notevi
28-06-2013, 21:24:01
De todas formas, creo que no tiene mucho sentido.

pnsd_89
28-06-2013, 21:28:12
ahh ok el #7 no es una tecla sino es un pitido.
ahora sigo creyendo que el #7 esta mal en la condición if ya que no es necesario(creo) ya que al final emite igual el sonido con la linea

Beep;

(gracias Casimiro! muchisimas de las cosas que se de Delphi es gracias a tus respuestas y la de Neftali, Jhonny, y otros que solo me recuerdo de su imajen de perfil jeje aqui en el foro. INMENSAMENTE AGRADECIDO SIEMPRE! :) )

Casimiro Notevi
28-06-2013, 21:29:34
Ahora que lo miro con más detalle, no es lo que he dicho, simplemente controla que se teclee el chr(7) y el chr(8), no recuerdo si son generados por las teclas de flechas del cursor, la verdad, pero en principio simplemente sobran.

Casimiro Notevi
28-06-2013, 21:30:43
a ya que no es necesario
Eso, no parece necesario.