Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Como validad 324 TEdit's, no null? (https://www.clubdelphi.com/foros/showthread.php?t=56329)

axlrafael 14-05-2008 18:45:03

Como validad 324 TEdit's, no null?
 
Hola amigos miren en mi aplicación me interesa validar todos mis TEdit's, lo que quiero es que no queden vacios sino me marca error porque en el evento OnChange puse un código que me vaya sumando todos los valores de los TEdit's y se refleje en un TLabel, el problema es que son 324¡¡, pongo este código en el evento OnKeyPress (seleccione todos los TEdit's y di doble click en el evento):

Código:

procedure TGerencia_Reg.Edit1KeyPress(Sender: TObject; var Key: Char);
var
cero, i: integer;
begin
  if not (key in ['0'..'9',#8,#13]) then
key:=#0;
for i:=1 to 324 do
begin
If ((Findcomponent('Edit'+IntToStr(i)) as TEdit).Text=null) then //si oporimes el enter y el edit2 tiene algo escrito entonces
  Begin
  cero:=0;
  (Findcomponent('Edit'+IntToStr(i)) as TEdit).Text:=inttostr(cero);
  end;
  end;
end;

Ademas me interesa saber si el código ASCII de la tecla "Sup" es el mismo que la tecla "Delete"?

Saludos y suerte en sus proyectos;)

BlueSteel 14-05-2008 19:03:59

Cita:

Empezado por axlrafael (Mensaje 286634)
Hola amigos miren en mi aplicación me interesa validar todos mis TEdit's, lo que quiero es que no queden vacios sino me marca error porque en el evento OnChange puse un código que me vaya sumando todos los valores de los TEdit's y se refleje en un TLabel, el problema es que son 324¡¡, pongo este código en el evento OnKeyPress (seleccione todos los TEdit's y di doble click en el evento):

Código:

procedure TGerencia_Reg.Edit1KeyPress(Sender: TObject; var Key: Char);
var
cero, i: integer;
begin
  if not (key in ['0'..'9',#8,#13]) then
key:=#0;
for i:=1 to 324 do
begin
If ((Findcomponent('Edit'+IntToStr(i)) as TEdit).Text=null) then //si oporimes el enter y el edit2 tiene algo escrito entonces
  Begin
  cero:=0;
  (Findcomponent('Edit'+IntToStr(i)) as TEdit).Text:=inttostr(cero);
  end;
  end;
end;

Ademas me interesa saber si el código ASCII de la tecla "Sup" es el mismo que la tecla "Delete"?

Saludos y suerte en sus proyectos;)


Hola axlrafael

utiliza el componente JvValidateEdit de la JVC (jedi)... ese te permite un mejor control.. además que te permite validar la entrada de solo numeros... tipo de dato moneda, con decimales, etc.

creo que debes asignarle a cada Edit el valor 0, como valor por defecto... en el caso de que no se ingrese nada... así evitaras que de error en la aplicación...

Salu2:p:D

axlrafael 14-05-2008 19:17:27

Hola BlueSteel gracias por responder.

Efectivamente a cada TEdit le puse de valor por default "0" para evitar eso, pero como el usuario puede llegar a equivocarse y dejar un campo nulo la aplicación le marcará error y es lo que quiero evitar.

Sobre los componentes jedi ya descarge los componentes pero no se como instalarlos :rolleyes: es por eso que no los ocupo.

Saludos

Caro 14-05-2008 19:18:19

Hola axlrafael, primero inicializa todos tus edit con un valor 0, y pon el codigo que tienes paar que reciba solo numeros en uno de tus edit y despues ese evento de ese edit lo asocias a los demas edit, para que no repitas codigo.

Código Delphi [-]
procedure TGerencia_Reg.Edit1KeyPress(Sender: TObject; var Key: Char);
 begin
  if not (key in ['0'..'9',#8,#32,#13]) then
   key:=#0;
end;

y en el evento OnExit de tu edit, puedes verificar que no se salga de dicho edit si esta vacío y este evento también lo asocias a todos tus edits.

Código Delphi [-]
procedure TGerencia_Reg.Edit1Exit(Sender: TObject);
begin
 if TEdit(Sender).Text='' then
  begin
   showmessage('Debe introducir un número');
   TEdit(Sender).SetFocus;
  end;
end;

Saluditos

enecumene 14-05-2008 19:27:59

Cita:

Empezado por axlrafael (Mensaje 286643)
Sobre los componentes jedi ya descarge los componentes pero no se como instalarlos :rolleyes: es por eso que no los ocupo.

Vale, hubieses preguntado aquí y te habriamos ayudado acto seguido.

Saludos ;).

coso 14-05-2008 19:28:26

Deberias comprobarlo en el momento en que necesitas un numero. La manera correcta de comprobarlo es usando excepciones (el usuario tb puede que haya puesto una letra, una O por un 0, cosas asi...)
La manera correcta para coger estos errores es usando :

Código Delphi [-]
try
     a_sumar := strtofloat(Edit1.Text);
  // Lo que se va a probar si provoca error o no
except
  // Lo que quieras que pase si da un error...un mensaje, un valor por   
  //defecto...si no pasa ningun error, el trozo este no se ejecutara.
end;

aqui un ejemplo: lo puedes colocar en un boton 'Suma'

Código Delphi [-]
var
  i : integer;
  a_sumar : double;
  resultado : double;
begin
  resultado := 0;
  for i := 0 to 324 do 
  begin
    try
     a_sumar := strtofloat((FindComponent('Edit'+inttostr(i)) as TEdit).Text);
     except  // Si hay error....
         a_sumar := 0;
         ShowMessage('Error en el Editbox nº' + inttostr(i));
     end;
     resultado := resultado + a_sumar;
  end;
  ShowMessage(FormatFloat('0.00',Resultado));
end;

venga, a ver si te sirve

coso 14-05-2008 19:34:49

Para saber el codigo ascii de cualquier tecla, prueba de poner ShowMessage(inttostr(Key)) en el evento OnKeyDown (no el OnKeyPress) de un editbox, p.e.

axlrafael 14-05-2008 19:46:04

Hola Caro, de nueva cuenta gracias por responder a mi ayuda.

Solo que esta vez no me sirvio tu truco :(, ya que al dejar el campo vacio automaticamente me aparece el error de que no son compactibles los datos enteros a los tipos string de los TLabel's.

Ya he probado con varios códigos y no me sirven.

Saludos

axlrafael 14-05-2008 19:54:45

Cita:

Empezado por coso (Mensaje 286652)
Deberias comprobarlo en el momento en que necesitas un numero. La manera correcta de comprobarlo es usando excepciones (el usuario tb puede que haya puesto una letra, una O por un 0, cosas asi...)
La manera correcta para coger estos errores es usando :


Código Delphi [-]
try
a_sumar := strtofloat(Edit1.Text);
// Lo que se va a probar si provoca error o no
except
// Lo que quieras que pase si da un error...un mensaje, un valor por
//defecto...si no pasa ningun error, el trozo este no se ejecutara.
end;






aqui un ejemplo: lo puedes colocar en un boton 'Suma'


Código Delphi [-]
var
i : integer;
a_sumar : double;
resultado : double;
begin
resultado := 0;
for i := 0 to 324 do
begin
try
a_sumar := strtofloat((FindComponent('Edit'+inttostr(i)) as TEdit).Text);
except // Si hay error....
a_sumar := 0;
ShowMessage('Error en el Editbox nº' + inttostr(i));
end;
resultado := resultado + a_sumar;
end;
ShowMessage(FormatFloat('0.00',Resultado));
end;






venga, a ver si te sirve


Hola gracias coso, voy a adaptar mi código a este que me acabas de escribir haber si puedo, cualquier cosa yo les aviso va.

Saludos

axlrafael 14-05-2008 20:01:15

Lo que intento hacer es como en la calculadora de Windows, que cuando uno borra algun dato automaticamente me aparece "0" para no hechar a perder la operación, asi es conmigo, no puedo dejar algun campo vacio por que me hecha a perder el código OnChange al sumar todos los campos.:o

ContraVeneno 14-05-2008 22:49:31

el TjvValidateEdit de las Jedi, como ya mencionaron, te permite manejar solo números, así no tendrías que validad nada. Además, este componente cuenta con la propiedad "HasMinValue" y "MinValue", lo que te permite asignar un valor mínimo válido, que sería cero en tu caso. En pocas palabras, solo con asignar dos propiedades te quitas de problemas.

Para instaslar las jedi, al descomprimir el archivo Zip, este incluye dos carpetas, JCL y JVCL, en cada una de ellas, existe una carpeta Install, con un archivo "Install" que debes ejecutar, el truco está en que primero hay que instalar las JCL y luego instalar las JVCL. En pocas palabras, ejecutas el archivo "Install" de las JCL y luego el archivo "Install" de las JVCL.

enecumene 15-05-2008 15:22:43

Agregando lo dicho por nuestro amigo Contra, antes de instalar las bibliotecas Jedi, debes tener cerrado el delphi, de lo contraio no te va a instalar. ah y otra cosa, ves lo que te comenté anteriormente, ya Contra te explicó como instalar las JEDI. :p.

Saludos. ;)

axlrafael 15-05-2008 19:10:32

Gracias amigos voy a instalar los complementos de una vez para ver si puedo hacerlos asi;).

Saludos :D

egostar 15-05-2008 20:14:57

Hola

No dudo que los componentes JEDI sean muy buenos, pero esto se puede hacer con los Edit normales de Delphi, digo yo "pa" que entonces es la POO :D.

Coincido con [Caro] al decir que se inicialicen todos los Edit a cero y se genere el evento OnKeyPress con lo siguiente:

Código Delphi [-]
procedure TGerencia_Reg.Edit1KeyPress(Sender: TObject; var Key: Char);
 begin
  if not (key in ['0'..'9',#8]) then key:=#0;
end;

Depués generar el evento OnChange en cualquier Edit de este forma:

Código Delphi [-]
procedure TGerencia_Reg.Edit1Change(Sender: TObject);
begin
   if ( (Sender as TEdit).text = '') or (Sender as TEdit).text = ' ') ) then
        (Sender as TEdit).text := '0';
end;

Finalmente seleccionas los 323 Edit's restantes y le asignas los mismos eventos a todos.

Así de fácil te la pone nuestra herramienta Delphi :)

Intentalo y veras lo bonito que queda :D

Salud OS

ContraVeneno 15-05-2008 22:48:26

Cita:

Empezado por egostar (Mensaje 286964)
Hola

No dudo que los componentes JEDI sean muy buenos, pero esto se puede hacer con los Edit normales de Delphi, digo yo "pa" que entonces es la POO :D

Solo que con el Edit, luego tendrías que validar que sean puros números, que no tengan caracteres extraños, que no se pueda copiar y pegar cosas raras en ellos, que mantengan el formato numérico adecuado, que si la coma es un separador de miles, que lo puedan escribir más de una vez, pero si es separador de decimales, se pueda poner solo una vez, o en su caso el punto. Tendrías que hacer conversiones en caso de querer realizar operaciones y / o asignaciones, en fin, que habría que codificar una infinidad de cosas.

Si me preguntas que opción escogería:

1. Asignar dos o tres propiedades
2. Codificar y preparar un Edit para validar infinidad de situaciones.

Escogería la primera. Y seguiría una de mis principales guías de programación:
Controla todo lo que puedas controlar con los controles.


De cualquier manera, si estas utilizando 324 controles (el que sea) en un mismo proceso o procedimiento, seguro tienes un problema de diseño bastante gordo.

egostar 15-05-2008 23:04:17

Cita:

Empezado por ContraVeneno (Mensaje 287015)
Solo que con el Edit, luego tendrías que validar que sean puros números, que no tengan caracteres extraños, que no se pueda copiar y pegar cosas raras en ellos, que mantengan el formato numérico adecuado, que si la coma es un separador de miles, que lo puedan escribir más de una vez, pero si es separador de decimales, se pueda poner solo una vez, o en su caso el punto. Tendrías que hacer conversiones en caso de querer realizar operaciones y / o asignaciones, en fin, que habría que codificar una infinidad de cosas.

A ver amigo ContraVeneno, te invito a que pongas 3 Edit's normalitos y hagas lo que he propuesto, comentame que es lo que pasa si copias y pegas cosas raras, caracteres especiales. :)

Lo del formato de números no le veo problema, por ahi ronda un código de nuestro amigo [cHackAll] que hace precisamente eso y es solo de incluirlo en un solo evento.

Cita:

Empezado por ContraVeneno (Mensaje 287015)
Si me preguntas que opción escogería:

1. Asignar dos o tres propiedades
2. Codificar y preparar un Edit para validar infinidad de situaciones.

Escogería la primera. Y seguiría una de mis principales guías de programación:
Controla todo lo que puedas controlar con los controles.

Pues es cuestión de gustos amigo Contra, nada personal, digo, no se vaya a generar un debate a muerte por esto :D

Cita:

Empezado por ContraVeneno (Mensaje 287015)
De cualquier manera, si estas utilizando 324 controles (el que sea) en un mismo proceso o procedimiento, seguro tienes un problema de diseño bastante gordo.

Bueno, habría que ver que es lo que está haciendo, cosa que no nos ha comentado, de entrada coincido contigo hasta que se nos comente la funcionalidad y el porqué de todos esos Edit's.

Salud OS

axlrafael 19-05-2008 19:15:59

Hola amigos y perdon por generar toda discusión, miren utilizo esta cantidad de TEdit's por que en mi aplicación asi lo requiere, el usuario captura cada dato correspondiente a un grupo determinado de grupo de articulos, esto con el fin de llevar un control de inventario anual estimado, y puse 324 porque son 29 grupos de articulos por 12 meses que representa todo el año, y no puedo dejar edit's en blanco porque me saldria error porque puse en el evento OnChange que me reflejara la sumatoria de cada grupo de articulos, y pues como los TLabels son de tipo String al igual que los edit's tengo que hacer la conversion de tipo String a Integer y un valor nulo no es un valor entero.

Saludos y muchas gracias por sus comentarios

axlrafael 19-05-2008 19:28:38

Por cierto amigo egostar tengo que agradecerte por tu comentario, la verdad tu código me sirvio a la perfección, te debo una :D

Gracias

ContraVeneno 19-05-2008 19:46:12

Yo hubiera utilizado un TjvDBGrid enlazado a un TjvMemoryData... pero en fin.


La franja horaria es GMT +2. Ahora son las 21:15:40.

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