Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Validar tipo de datos en un Tedit.. (https://www.clubdelphi.com/foros/showthread.php?t=25716)

Epunamun 01-10-2005 01:36:44

Validar tipo de datos en un Tedit..
 
Hola nuevamente..... tengo un problemita... mi idea es validar los datos ke insertan los usuarios de mi aplicacion a travez de un Tedit. Por ejemplo para ke un Tedit no se kede vacio es simple..

Código Delphi [-]
    
if edit1.text = '' then
   MessageDlg('Ingrese un Telefono', mtInformation, [mbOK], 0);
 end;
 edit1.setfocus;
Pero como lo hago para tambien validar ke en el Tedit se puedan ingresar solamente numeros, como en el caso del Tedit anterior ke se tienen que ingresar solamente numeros telefonicos.

Bueno mi idea es no usar maskedit . ..

Pa variar gracias ..... :rolleyes:

roman 01-10-2005 01:40:48

Cita:

Empezado por Epunamun
Por ejemplo para ke un Tedit no se kede vacio es simple..

Código:

   
  if edit1.text='' then


Pues ni tanto. Más correcto sería:

Código Delphi [-]
if Trim(edit1.text) = '' then

a menos que consideres puros espacios en blanco como un dato no vacío ;)

Para lo de los números telefónicos te convendría más usar un TMaskEdit.

// Saludos

dec 01-10-2005 10:21:30

Hola,

¿Dónde demonios habré leído yo que algo como lo siguiente era más efectivo? ¿Acaso fue en relación al lenguaje C#? ¿Valdrá para Delphi también, quiero decir, será más efectivo que otra cosa? No recuerdo dónde me enteré de esto, y, sin embargo es obsesión lo mío... ahora siempre lo tengo que hacer así porque me acuerdo de aquello que leí no sé dónde...

Código Delphi [-]
   if Length(Edit1.Text) = 0 then
   begin
     ShowMessage('¡Escribe algo hombre!');
   end;
Esto es, comparar la longitud de la cadena, para saber, si esta es "cero", que no se escribió nada en un "TEdit", en este caso, vamos... Para mí tengo que lo leí en algún artículo, curso, manual o libro sobre C#, que, puesto que se puede hacer algo así:


Código:

if (textBox1.Text == string.Empty)
 {
  // Aviso a navegantes
 }

Leí, como he dicho ya, que era mejor, más efectivo, hacer algo así:


Código:

if (textBox1.Text.Length == 0)
 {
  // Aviso a navegantes
 }

Bueno. En cualquier caso disculpad la digresión, si esta es muy evidente ;)

vtdeleon 01-10-2005 16:33:47

Saludos

Pienso que la solucion de roman es mas efectiva, ya que con el trim eliminas los espacios en blanco. Pero midiendo la longitud podria ser validado si se deja un espacio, ya que seria diferente de 0.

Haciendo una combinacion de ambo, ;)fenomenal
Código Delphi [-]
if Length(trim(Edit1.Text)) = 0 then
   begin
     ShowMessage('¡Escribe algo hombre!');
   end;

roman 01-10-2005 23:37:09

Como bien dice vtdeleon, la razón del Trim es para eliminar los espacios en blanco ya que ' ' no tiene longitud cero.

Lo que dices de la mayor efectividad de Length, en efecto, no sé dónde lo habrás leído :D; la llamada a una función siempre será un poco más lenta (unos cuantos nano segundos) por el paso de parámetros al stack y la devolución del valor. Compara el código ensamblado que genera Delphi:

Código:

if Length(S) = 0 then

mov eax, [ebp-$04]
call @LStrLen
    ; código de LStrLen
    test eax, eax
    jz +$03
    mov eax, [eax-$04]
    ret

test eax, eax
jnz +$0a


if S = '' then

cmp dword ptr [ebp-$04]
jnz +$0a

Aún descontando el código de LStrLen, está el paso del parámetro para llamar a la función y luego de cualquier manera requires una comparación.

// Saludos

dec 01-10-2005 23:41:40

Hola,

Pues muchas gracias, roman, por la información. Lamento no recordar dónde leí lo que digo, pero, si se mira el código fuente de XEditor podrá verse cómo hize caso de la lectura aquella... pero pronto dejará de verse así, puesto que corregiré donde sea menester el código que hasta ahora existe por algo parecido a lo que tú has propuesto y demostrado como más efectivo. Gracias de nuevo. ;)

dec 01-10-2005 23:53:46

Hola,

roman, ya revisé y cambié el código en donde corresponde de modo que se ajuste a lo que parece más razonable según tu explicación. Y además procuraré anotarme el dato para sucesivas ocasiones. Sin embargo, me queda una duda, puesto que leí lo que leí, como he dicho. Me explico. Arriba se ve que la comparación "a lo bruto" del código "ensamblador" resultante de hacerlo de una manera o de otra refleja que una de ellas "ocupa" más que otra, esto es, aparentemente (insisto) hay una diferencia clara.

Sin embargo, roman, puesto que dices que "de todos modos hay que hacer una comparación" y en mi ignorancia veo que, en todo caso, la comparación no se hace de la misma forma de una manera que de otra, me pregunto, ¿no puede ser que el hacer la comparación de la forma en que leí como la mejor de hacerlo sea más efectiva? Esto es, que, aunque a todas luces de una manera se ocupe "menos código ensamblador" que de la otra, ¿no puede ser que la que ocupa más, en este caso, sea más efectiva, más rápida, eficaz, preferible, qué se yo...?

vtdeleon 02-10-2005 01:12:36

Saludos

Cita:

Lo que dices de la mayor efectividad de Length, en efecto, no sé dónde lo habrás leído ; la llamada a una función siempre será un poco más lenta (unos cuantos nano segundos) por el paso de parámetros al stack y la devolución del valor.
Sabía que dirían eso. Algo irónico:P

Lepe 02-10-2005 08:14:08

Yo tambien leí (en el mismo sitio que dec :D algo pareceido). Creo recordar que el tamaño del string se guardaba en la posición cero de la misma variable, por tanto, la función Length unicamente leía el primer byte del String (de ahí la "eficiencia" de esa función).

Ahora mismo y teniendo en cuenta el tamaño que puede tener un String en delphi 6/7, dudo que en el primer byte se puedea guardar el tamaño. Supongo que alguna vez en delphi fue tal y como dice dec

Un saludo

dec 02-10-2005 09:51:51

Hola,

Veo que Lepe y yo tenemos lecturas muy parecidas. ;)

En todo caso me veo en la obligación de añadir que lo que leí creo recordar que tenía relación con C#, y, por ende, con .NET. Yo lo apliqué a Delphi porque pensé que al cabo era muy parecido: de hecho la comparación se lleva a cabo de la misma forma tanto en C# como en Delphi, esto es, a nivel de la sintaxis utilizada, porque, ciertamente, más allá no sabría ir... sin lazarillo y por lo pronto. ;)


La franja horaria es GMT +2. Ahora son las 01:02:29.

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