PDA

Ver la Versión Completa : Consulta sobre contraseña


DOS
30-07-2011, 17:58:25
Hola a todos, Se muy bien que en este foro hay ejemplos de contraseñas o logins, pero son un poquito mas avanzadas, yo estoy realizando uno con mis conocimientos basicos y solucionarlo de manera simple.
Les paso mi codigo
procedure TForm1.Button1Click(Sender: TObject);
var
a,b: string;
c:integer;
begin
a:=edit1.text;
b:=edit2.Text;
table1.First;
edit1.SetFocus;
c:=1;
while table1.Eof = false do
begin
while c < 4 do
begin //va a comparar en una tabla el apellido y la clave
edit1.Clear;
edit2.Clear;
edit1.SetFocus;
table1.Next;
if (table1.FieldByName('Apellido').AsString = a) and (table1.fieldbyname('Clave').Asstring = b)
then
begin //si la clave es correcta va al formulario 2
form1.Hide;
form2.show;
table1.Next;
c:=4;
end
else
begin //si es incorrecta muestra un mensaje de error
showmessage('Clave incorrecta');
end;
c:=c+1; //incrementa en 1 al contador
end;

end;
showmessage('adios'); // a los tres intentos fallidos muestra un mensaje y sale
end;

Pero resulta que si pongo mal la clave, me muestra el cartel y le tengo que dar tres veces ok para que vuelva al menu y volver a intentar.
si le agrego close despues del cartel de "adios" sale del programa al primer mal intento.
Agradesco cualquier correccion, dentro de los comandos utilizados.

Caral
30-07-2011, 18:45:27
Hola
Veamos algunas cosas:

procedure TForm1.Button1Click(Sender: TObject);
var
a,b: string;
c:integer;
begin
a:=edit1.text;
b:=edit2.Text;
// table1.First; (para que?
// edit1.SetFocus; (para que ?
c:=1;
// while table1.Eof = false do (para que ?
//begin
while c < 4 do
begin //va a comparar en una tabla el apellido y la clave
edit1.Clear;
edit2.Clear;
edit1.SetFocus;
// table1.Next;
if (table1.FieldByName('Apellido').AsString = a) and (table1.fieldbyname('Clave').Asstring = b)
then
begin //si la clave es correcta va al formulario 2
form1.Hide; // no lo creo ?
form2.show;
// table1.Next; (para que?
c:=4;
end
else
begin //si es incorrecta muestra un mensaje de error
showmessage('Clave incorrecta');
end;
c:=c+1; //incrementa en 1 al contador
end;

end;
showmessage('adios'); // a los tres intentos fallidos muestra un mensaje y sale
end;
Que BD usas ?.
Saludos

DOS
30-07-2011, 19:06:55
Las tablas las creo con el database desktop que trae Delphi
Ahi ve que pusistes algunos para que, seguramente en un Delphi mas avanzado esto sea una tonteria, pero hasta ahora es lo que me enseñaron.
Por ejemplo cuando pongo
table1.First; (para que? / Para que se situe en la primera posicion de la tabla edit1.SetFocus; (para que ? /Para que se posisione en el primer Edit
while table1.Eof = false do (para que ? / Creo que era para que recorra toda la tabla
form1.Hide; // no lo creo ?/ Es lo que me enseñaron para cerrar el formulario, al menos se que funciona.
Es lo que te se explicar con lo que me enseñaron hasta el momento, voy a probar realizandoles esas modificaciones.
form2.show;// con esto voy al formulario 2
Gracias.

Caral
30-07-2011, 19:12:30
Hola
Empecemos desde el principio.
1-Usas un Componente Table, eso quiere decir que seguramente lo abres al inicial el form.
Lo mejor, cuando se usa ese componente es hacer un filtro, no recorrer la tabla completa.
2-Haces que el form 1 se esconda y se muestre el form 2.
Lo mejor es que el form 1 llame al dos que es que que deberia ser el login.

Saludos

Caral
30-07-2011, 19:18:14
Hola
Pregunto:
Tienes que trabajar obligatoriamente con Paradox? o lo puedes hacer con otra BD ?.
Saludos

DOS
30-07-2011, 19:51:52
Gracias Caral
Si tengo que usar Paradox y es correcto lo que decis. Se que algo esta mal, pero supuestamente con esas herramientas basicas lo deberia poder hacer, tiene que ser algo muy simple; crear una tabla con nombre y usuario, en Paradox y en Delphi un formulario en el cual ingresamos los datos y comparamos, si es correcto vamos al formulario2 y cerramos el primero.
Si esta mal, lo indicamos con un mensaje y a los 3 intentos erroneos, se cierra el programa.
Pense que iba a ser mas facil, pero hace una semana que ando dando vueltas con lo mismo :(

Caral
30-07-2011, 20:12:40
Hola
Quieres que hagamos el procedimiento como creo que deberia de ser ?.
Saludos

Chris
30-07-2011, 20:21:26
Hola Compañero DOS!

Lo primero que debes hacer es declarar una variable en tu formulario. En esta variables almacenaras el número de intentos que ha hecho el usuario para iniciar sesión. Cuando esta variable llegue a 4, procedes a cerrar la aplicación. Puedes declarar la variable así:

type
TForm1 = class(TForm)
...
private
Intentos: Integer; // la variable "Intentos" será para uso exclusivo del formulario
// por eso está en la sección "Private"
...
end;


Luego, en el botón para iniciar sesión, utiliza un código similar a este:

procedure TForm1.Button1Click(Sender: TObject);
var
apellido, contrasena: String; // utiliza variables más descriptivas.
// Es una buena practica de programación.
ClaveCorrecta: Boolean; // utilizada para indicar si el usuario
// utilizó un usuario y contraseña correctos.
begin
apellido := Edit1.Text;
contrasena := Edit2.Text;

edit1.Clear;
edit2.Clear;
edit1.SetFocus;

while not Table1.Eof do // es lo mismo que "while table1.eof = false do"
begin
// comparar el usuario y contrasena
if (Table1.FieldByName('apellido').AsString = apellido) and
(Table1.FieldByName('clave').AsString = contrasena) then
begin
ClaveCorrecta := True;
Form1.Hide;
Form2.Show;
end;

// compararemos con el siguiente registro en la DB
Next;
end;

// no se utilizó un usuario y contraseña correcta?
if not ClaveCorrecta then
begin
ShowMessage('Clave Incorrecta');
// aumentamos el número de intentos
Inc(Intentos) // Inc(Intentos) = Intentos := Intentos + 1;

// ya hizo los 4 intentos?
if Intentos >= 4 then
begin
ShowMessage('Adios!');
Application.Terminate; // cierra la aplicación
end;
end;
end;

Notarás que el código se hace un poco largo, pero es porque lleva notas explicativas. Además no es un código optimizado. Está basado en lo que tú ya has escrito. Aún así, espero que el código te sirva.

Saludos,
Chris

Caral
30-07-2011, 20:42:41
Hola
Bien, para empezar:
1- recorrer la tabla no es correcto, imaginate que tengas muchos datos, esto hace que el programa sea lento.
2- hacer o crear variables donde no se necesitas es gastar recursos, el programa crece innecesariamente.
3- Leer tanto el nombre como la clave en un solo IF es un error, ya que no necesariamente el usuario estara mal o la clave.
Bueno, para mi algo sencillo es esto:

procedure TForm1.Button1Click(Sender: TObject);
var
Filtro: String;
Cuenta: integer;
begin
Table1.Filtered:= False;
Filtro := 'Nombre = '+Edit1.Text;
Table1.Filter := Filtro;
if table1.FieldByName('Nombre').AsString = Edit1.Text then
begin
Cuenta := Cuenta + 1;
Table1.Filtered:= False;
Filtro := 'Clave = '+Edit2.Text;
Table1.Filter := Filtro;
if table1.fieldbyname('Clave').Asstring = Edit2.Text then
begin
Form2:=TForm2.Create(self);
try
Form1.Visible:= False;
Form2.ShowModal;
finally
Form2.Free;
end;
end
else
Begin
Cuenta := Cuenta + 1;
MessageDlg('Clave Inválida',mtError, [mbOK], 0);
Edit1.Text := '';
Edit1,SetFocus;
If Cuenta = 3 then Close;
end;
end;

Como ves, se filtra solo el nombre, si es el correcto entonces se filtra la clave, no se pierde tiempo ni recursos.
Se inicia la cuenta desde la búsqueda del nombre.
Se crea el form 2, no se hace desde el principio, es una mala practica.
Simplemente se esconde el form 1, no hace falta nada mas.
Se elimina el form 2 cuando el programa termina.
Saludos

DOS
30-07-2011, 21:11:22
Gracias Chris
hice un copy paste en el programa y no corria, le hice unos pequeños cambios, segun la version anterior y asi corria, si pongo la clave bien, va al sig. form pero si es incorrecta sigue constantemente dando la opcion de cargar el U y la C pero nunca muestra el cartel ni termina la aplicacion.
Disculpen muchachos si soy molesto y les agradesco nuevamente por su prontas respuestas y ayuda. /aprendi a recuadrar la sintaxis :D

var
apellido, contrasena: String; // utiliza variables más descriptivas.
// Es una buena practica de programación.
ClaveCorrecta: Boolean; // utilizada para indicar si el usuario
Intentos: Integer; // utilizó un usuario y contraseña correctos.
begin
apellido := Edit1.Text;
contrasena := Edit2.Text;

edit1.Clear;
edit2.Clear;
table1.First;
edit1.SetFocus;

while table1.eof = false do
begin
// comparar el usuario y contrasena
if (Table1.FieldByName('Apellido').AsString = apellido) and
(Table1.FieldByName('Clave').AsString = contrasena) then
begin
ClaveCorrecta := True;
Form1.Hide;
Form2.Show;
end;

// compararemos con el siguiente registro en la DB
table1.Next;
end;

// no se utilizó un usuario y contraseña correcta?
if not ClaveCorrecta then
begin
ShowMessage('Clave Incorrecta');
// aumentamos el número de intentos
Inc(Intentos); // Inc(Intentos) = Intentos := Intentos + 1;

// ya hizo los 4 intentos?
if Intentos >= 4 then
begin
ShowMessage('Adios!');
Application.Terminate; // cierra la aplicación
end;
end;
end;

.

Caral
30-07-2011, 22:24:13
Hola
Haciendo algunos cambios.
Copia y pega este codigo:

procedure TForm1.Button1Click(Sender: TObject);
var
Filtro: String; // filtra
OK : Boolean; // define
begin
Table1.Filtered:= False; // no filtra la tabla
Filtro := 'Apellido = '+Edit1.Text; //define el filtro del nombre
Table1.Filter := Filtro; // le da el filtro a la tabla
if Table1.FieldByName('Apellido').AsString = Edit1.Text then // si el nombre es igual
begin
Table1.Filtered:= False; // cancela el filtro
Filtro := 'Clave = '+Edit2.Text; // define el filtro para la clave
Table1.Filter := Filtro; // le da el filtro a la tabla
end
else // si nombre no es correcto
Begin
Cuenta := Cuenta + 1; // aumenta la cuenta en 1
MessageDlg('Usuario No encontrado',mtError, [mbOK], 0); // envia un mensaje
Edit1.Text := ''; // limpia el edit1
Edit1.SetFocus; // da el foco al edit1
OK := False; // indica que no se definio
If Cuenta = 3 then close; // si el nombre no coincide 3 veces se cierra
end;

if Table1.fieldbyname('Clave').Asstring = Edit2.Text then // si la clave es igual
begin
if OK = True then // define que es verdadero
begin
Form2:=TForm2.Create(self); // crea el form 2
try
Form1.Visible:= False; // esconde el form 1
Form2.ShowModal; // muestra el form 2
finally
Form2.Free; // libera el form 2
Application.Terminate; // termina el programa
end;
end;
end
else // si la clave no es correcta
Begin
OK:= False; // lo define falso
Cuenta := Cuenta + 1; // aumenta la cuenta
MessageDlg('Clave Inválida',mtError, [mbOK], 0); // envia un mensaje
Edit2.Text := ''; // limpia el edit2
Edit2.SetFocus; // le da el foco al edit 2
If Cuenta = 3 then close; // si la cuenta es igual a 3 cierra el programa
end;
end;
Ya esta probado, si tienes alguna duda el codigo tiene cada una de las explicaciones, cambia lo que necesites, asi practicas.
Saludos

Chris
30-07-2011, 22:55:13
Utiliza este código. Inicializaré la variable ClaveCorrecta para ver si es eso lo que te está dando problemas

var
apellido, contrasena: String; // utiliza variables más descriptivas.
// Es una buena practica de programación.
ClaveCorrecta: Boolean; // utilizada para indicar si el usuario
Intentos: Integer; // utilizó un usuario y contraseña correctos.
begin
apellido := Edit1.Text;
contrasena := Edit2.Text;
ClaveCorrecta := False;
edit1.Clear;
edit2.Clear;
table1.First;
edit1.SetFocus;

while table1.eof = false do
begin
// comparar el usuario y contrasena
if (Table1.FieldByName('Apellido').AsString = apellido) and
(Table1.FieldByName('Clave').AsString = contrasena) then
begin
ClaveCorrecta := True;
Form1.Hide;
Form2.Show;
end;

// compararemos con el siguiente registro en la DB
table1.Next;
end;

// no se utilizó un usuario y contraseña correcta?
if not ClaveCorrecta then
begin
ShowMessage('Clave Incorrecta');
// aumentamos el número de intentos
Inc(Intentos); // Inc(Intentos) = Intentos := Intentos + 1;

// ya hizo los 4 intentos?
if Intentos >= 4 then
begin
ShowMessage('Adios!');
Application.Terminate; // cierra la aplicación
end;
end;
end;

Saludos,
Chris

DOS
30-07-2011, 23:12:23
Muchas gracias, ya lo voy a probar, si bien hay varios comandos que todavia no conosco, vamos a ver que pasa. Despues les cuento. ; )

Caral
31-07-2011, 01:08:54
Hola
Bueno, no se si al amigo DOS le funciona, pero a mi definitivamente no me funciona el codigo del amigo Chris, evidentemente no lo reviso, eso pasa.:)
Aqui te dejo el codigo que hice (presiona el boton Caral) y el codigo de Chris (presiona el boton Chris), asi entenderas mejor el concepto y la diferencia.
Esto esta hecho con BD access, pero es lo mismo, para que funcione en tu programa simplemente cambia donde veas ADOTABLE1 por Table1 y listo, copia y pega.
Saludos
PD: pruebalo con estos:
usuario ( caral )
clave ( car )
Puedes equivocarte tanto en la clave como en el usuario.:D

DOS
31-07-2011, 03:12:42
Bueno, Caral, no quiero que se cree una polemica o una pelea entre ustedes muchachos, Le agradesco la ayuda a ambos. En cuanto al programa puedo decir que Chris esta dentro de lo que conosco del lenguaje para tratar de encontrar la solucion, pero, si es verdad que no corre bien, talvez sea la parte del contador.
En cuanto al de Caral, sin dudas funciona, pero hay parte del lenguaje que todavia no he visto y se muy bien que se puede hacer con lo poco que se, sin dudas no sera algo optimo, pero es lo que tengo que realizar.
Nuevamente muchas gracias por sus molestias e interes, que no he visto en ningun otro foro.

Caral
31-07-2011, 03:25:29
Hola
No es pelea ni polémica amigo, para nada, si bien es cierto yo no soy programador y Chris lo sabe, solo trato de hacer los ejemplos y probarlos, con mi poco conocimiento.
Con relacion a lo que sabes o lo que quieres usar es lo mismo.
Si te fijas bien en los dos codigos veras las diferencias, por eso puse los dos.
1- Filtrar, eso no es un problema, si quieres recorrer la tabla hazlo, no hay problema.
2- varables por cada edit, si lo quieres poner no hay problema.
3- revisar tanto el usuario como la clave con un solo IF, esto si que no me parece correcto ya que deberias dar la oportunidad del error en cada uno.
4- crear o devolver el foco solo a edit1 aunque sea la clave la del error me parece una equivocación, pero de que se puede se puede.
5- Mostrar el form2 directamente no es conveniente, es mejor crearlo y luego destruirlo.
Como dije, no es pelea o polemica ni tampoco ver cual es el mejor codigo, solo es mostrar las diferencias.
No puedo y eso lo tengo claro, competir contra un programador como Chris, pero tampoco lo quiero, solo trato de ayudar.
Saludos

DOS
31-07-2011, 04:15:47
Gracias Caral, mañana, un poco mas despierto y descansado reelere los codigos y vere que pasa, saludos.

Caral
31-07-2011, 04:43:45
Hola
Ya que entiendes mejor el codigo del amigo Chris veamos en lo que falla.
1- la variable que va sumando los intentos hay que declararla global, osea en donde se declara el form, aqui:

var
Form1: TForm1;
Intentos: Integer;

implementation

Por que?, por que si se declara en el mismo procedimiento no suma, aquí el valor se suma.
2- Cuando la clave y el usuario son correctos el form 2 se abre, PERO al cerrarse el programa se cuelga, no se cierra, queda el form 1 ahi, pero no se ve, hay que eliminar el form 2 y cerrar el programa.
Aqui te dejo el codigo, copialo y pegalo, ya esta probado.

var
apellido, contrasena: String;
ClaveCorrecta: Boolean;
begin
apellido := Edit1.Text;
contrasena := Edit2.Text;
ClaveCorrecta := False;
edit1.Clear;
edit2.Clear;
Table1.First;
edit1.SetFocus;

while Table1.eof = false do
begin
if (Table1.FieldByName('Usuario').AsString = apellido) and
(Table1.FieldByName('Clave').AsString = contrasena) then
begin
try
Form1.Visible:= False; // aqui se esconde el form 1
Form2.ShowModal; // aqui se muestra el form 2
finally
Form2.Free; // aqui se elimina el form 2
Application.Terminate; // aqui termina el programa
end;
end;
Table1.Next;
end;
if not ClaveCorrecta then
begin
ShowMessage('Clave o Nombre Incorrectos');
Inc(Intentos);
if Intentos >= 4 then
begin
ShowMessage('Adios!');
Application.Terminate;
end;
end;

end;

Saludos

DOS
31-07-2011, 18:38:17
Hola Caral
Debo decir que el programa funciona de maravillas, si bien todavia no vi el TRY y Finally, debe ser un poco mas avanzado a lo que vimos hasta ahora, seguramente para ti debe ser como tratar de que con las herramientas de un cavernicola trates de programar, asi que muchisimas gracias.

Caral
31-07-2011, 20:13:38
Hola
El asunto con el try y finally es que tal como dice en español:
Try = trata de.
finally = finalmente haz.
Osea, al llamar a lo que sea, un procedimiento un form etc. lo que se intenta es que TRATE de hacerlo y una vez que lo haga termina o FINALIZA el proceso anterior.
Saludos

Caral
31-07-2011, 21:28:40
Hola
Jugando con el codigo y quitando try / finally:
Bueno, quería ver que puedo hacer para quitar estos codigos que no as visto todavía y pensé, que tal si hago un procedimiento adicional, bueno, aqui esta el codigo.

// procedimiento nuevo, abre el form 2 y esconde el form 1
procedure abre;
begin
Form1.Hide;
Form2.ShowModal;
end;

// procedimiento del boton.
procedure TForm1.Button1Click(Sender: TObject);
var
apellido, contrasena: String;
ClaveCorrecta: Boolean;
begin
apellido := Edit1.Text;
contrasena := Edit2.Text;
ClaveCorrecta := False;
edit1.Clear;
edit2.Clear;
Table1.First;
edit1.SetFocus;

while Table1.eof = false do
begin
if (Table1.FieldByName('Usuario').AsString = apellido) and
(Table1.FieldByName('Clave').AsString = contrasena) then
begin
abre; // llama al procedimiento abre,
Form2.Free; // cuando el form 2 se cierre...
Application.Terminate;
end;
Table1.Next;
end;
if not ClaveCorrecta then
begin
ShowMessage('Clave o Nombre Incorrectos');
Inc(Intentos);
if Intentos >= 4 then
begin
ShowMessage('Adios!');
Application.Terminate;
end;
end;

end;

Como ves, se puede hacer de muchas maneras lo mismo.
Copialo y pegalo, veras que funciona igual que con el try / Finally.
Saludos

DOS
01-08-2011, 00:11:07
JaJaJa, sin palabras, eres un genio, me has sido de gran ayuda, se nota tu basto conocimiento y predisposision a ayudar a quien lo necesita. Gracias.

Caral
01-08-2011, 00:16:51
Hola
De genio nada, de Novato todo.
La verdad es que me gusta la programación y ya que nunca lo fui trato de aprender y jugar con estos retos que nos ponéis.
Saludos