PDA

Ver la Versión Completa : checkbox en un form de registro


gontxalo
21-06-2005, 15:49:19
Hola
En un Form de registro, donde tengo dos edit, uno para nombre y otro para contraseña, para que funcione un CheckBox, el cual digo "recordar mi nombre y contraseña", que tengo que hacer?


Es decir que si el checkbox está check, que la próxima vez que se ejecute la aplicación, las cajas edit tengan ya puestos el nombre y contraseña.

Gracias.

delphi.com.ar
21-06-2005, 16:06:06
Simplemente guardar esos datos en algún lugar donde tu aplicación pueda acceder, por ejemplo: Un archivo propietario, un archivo de inicio, el registro de configuraciones de windows.....

gontxalo
21-06-2005, 16:17:30
Hola
Los guardo en un txt. Pero luego no se como decirle para que salga en los edit lo guardado en los txt.

Como les digo a los edit que lo lea ?

En el botón de login tengo puesto:

procedure TForm2.Button2Click(Sender: TObject);
Var
MiRegistro : textfile;
MiRegistro2 : textfile;
name : string;
password : string;
begin
name := edit1.Text;
Password := edit2.Text;
AssignFile (MiRegistro,'name.txt');
AssignFile (MiRegistro2,'password.txt');
reWrite (MiRegistro);
reWrite (MiRegistro2);
writeln(MiRegistro,name);
writeln(MiRegistro2,password);
CloseFile (MiRegistro);
CloseFile (MiRegistro2);
end;

Y en el checkbox:


procedure TForm2.CheckBox1Click(Sender: TObject);
var
MiRegistro : Textfile;
MiRegistro2 : Textfile;
name : string;
password : string;
begin
AssignFile (MiRegistro,'name.txt');
AssignFile (MiRegistro2,'password.txt');
Reset (MiRegistro);
Reset (MiRegistro2);
Read(MiRegistro,name);
Read(MiRegistro2,password);
CloseFile (MiRegistro);
CloseFile (MiRegistro2);
Edit1 := aqui no se que poner para que me funcione
Edit2 := aqui no se que poner para que me funcione
end;

Gracias

gontxalo
21-06-2005, 16:27:10
Hola
Me faltaba esto creo, pero para que funcione cuando esta check:

if checkbox1.Checked then
Edit1 := No se que poner
Edit2 := No se que poner.

Por lo que el checkbox queda así:

procedure TForm2.CheckBox1Click(Sender: TObject);
var
MiRegistro : Textfile;
MiRegistro2 : Textfile;
name : string;
password : string;
begin
AssignFile (MiRegistro,'name.txt');
AssignFile (MiRegistro2,'password.txt');
Reset (MiRegistro);
Reset (MiRegistro2);
Read(MiRegistro,name);
Read(MiRegistro2,password);
CloseFile (MiRegistro);
CloseFile (MiRegistro2);
if checkbox1.Checked then
Edit1 := aqui no se que poner para que me funcione
Edit2 := aqui no se que poner para que me funcione
end;

En otro form me funciona para leer los edit en un label con un caption:
Label1.Caption := name;
Y me sale en el label lo puesto en el edit. Pero para que me salga en el edit no se hacerlo.

Gracias.

roman
21-06-2005, 16:37:26
Edit1 := aqui no se que poner para que me funcione


Edit1.Text := name;

es decir, la propiedad de un Edit análoga al Caption de un Label es Text.

Pero creo que hay un error conceptual en tu diseño. No me parece lógico que los datos se lean cuando se hace click en el checkbox "recordar mi nombre y contraseña".

// Saludos

gontxalo
21-06-2005, 16:50:36
Hola Roman.
Me funciona.
Pero el problema que tengo ahora es que si le doy al checkbox me sale lo puesto la última vez, pero al ejecutar la aplicación el checkbox me sale sin checked y los edit vacíos. Y al darle al check se rellenan los edit.

Hay alguna forma de que al ejecutar la aplicación y llamar al form, salgan los edit ya con los datos escritos ?

Si el checkbox le pongo la propiedad de checked true, lo que consigo es que salga check pero no con los edit rellenos.

Gracias

roman
21-06-2005, 17:11:53
Por eso te digo que hay un error conceptual en tu diseño.

Para empezar yo no pondría nada de código en el evento OnClick del CheckBox. El CheckBox únicamente sirve para indicar si se guardan o no los datos. Por otro lado

Esquemáticamente hablando yo haría algo así:

Evento OnShow del formulario

Buscas los archivos 'name.txt' y 'password.txt'. Si no existen es que no se pidió guardar los datos. Si existen lees las variables y las asignas a los Edit y marcas la casilla.

Evento OnClick del botón Login

Verificas los datos para determinar si son correctos o no

Evento OnClose del formulario

Si el login fue correcto (no tiene caso guardar los datos si fue incorrecto) te fijas en el valor de la casilla. Si está marcada guardas los datos en tus archivos 'name.txt' y 'password.txt'. En caso contrario, si existen estos archivos los borras.

Esto es adaptando a tu técnica de tener archivos 'name.txt' y 'password.txt' pero yo guardaría todos los datos en un sólo lugar. Podría ser el registro de Windows o un archivo ini. Por ejemplo, puedes crear un archivo ini 'opciones.ini':


[login]
username=fulano
password=tupassword


Entre corchetes se indica el nombre de la sección del archivo ini y puedes tener más secciones si así lo necesitas.

Usa un objeto TIniFile para leer el archivo:


var
IniFile: TIniFile;
UserName: String;
Password: String;

begin
IniFile := TIniFile.Create('opciones.ini');
UserName := IniFile.ReadString('login', 'username', '');
Password := IniFile.ReadString('login', 'password', '');
end;


ReadString toma tres parámetros: nombre de la sección del archivo ini, identificador en esa seccción que quieres leer, valor por defecto en caso de que no se encuentre.

Si UserName y Password son cadenas vacías es que no se pidió guardar los datos. En caso contrario los pones en los Edit y marcas la casilla.

Para guardar usas:



IniFile.WriteString('login', 'username', Edit1.Text);
IniFile.WriteString('login', 'password', Edit2.Text);


// Saludos

Crazyro
21-06-2005, 17:31:37
Además de guardar los datos del user y pass en el fichero, deberías guardar una opción que te diga si se guardan o no desde la última vez, para que cuando ejecutes la aplicación primero veas si tiene que estar el check activo, si es así, recoge los datos del user y pass, si desmarcas esta opción deberías guardarla tambien el en txt, para que a la proxima vez que ejecutes la aplicación, no introduzca los datos.

// Para guardar los datos cuando haces click en recordar los datos

procedure TfrmPrincipal.recordarClick(Sender: TObject);
var
fText : TextFile;
fFichero : String; // Nombre del fichero
lFichero : String; // Linea del fichero
bEstado : Boolean; // Si está o no marcada la opción de guardar los datos

begin
Try
lFichero := ' ';
fFichero := 'Nombrefichero.txt' // Con la ruta claro...;-)

AssignFile(fText, fFichero);
Rewrite(fText);


if checkbox.enabled then begin
bEstado := 'T';
// Los ';' son para separar los datos en el fichero
sFichero := bEstado + ';' + edUser.Text + ';' + edPass.Text;
end else begin
bEstado := 'F';
sFichero := bEstado;
end;

Writeln(fText, sFichero);
CloseFile(fText);
except
MessageDlg('Error en el fichero de user', mtConfirmation, [mbYes], 0);
CloseFile(fText);
end;

end;

// Este código se debería poner antes de realizar el application.run
// Jugamos con las mismas variables de antes

AssignFile(fText, fFichero);
Reset(fText);
Readln(fText, sLinea);

// en sLinea tenemos la linea que guardamos la última vez, lo que hay que
// buscar, si el primer caracter es 'T' ó 'F', para seguir o no
// Crearse una función que busque el caracter ';' en la linea sLinea
// cuidado, si hay ';', porque puede ser el primero ; o él último eso
// hay que controlarlo.

nPos := buscar(sLinea, ';');

if nPos = 0 then begin
// no hay ; esto es que no se quiso guardar
end else begin
// hay ; pues recoger todos los datos del user y pass, y marcar el clic como
// activo
end;

CloseFile(fText);



Espero que te haya servido, lo hice rapido y no se si le falta algún control, o que?

salu2.

Crazyro
21-06-2005, 17:34:25
Como dice Roman, en el clic del check no hacer nada, si cuando pulsas aceptar, este está marcado guardar los ficheros con los datos, o el fichero según decidas como hacerlo.

salu2.

roman
21-06-2005, 17:38:18
Además de guardar los datos del user y pass en el fichero, deberías guardar una opción que te diga si se guardan o no desde la última vez, para que cuando ejecutes la aplicación primero veas si tiene que estar el check activo, si es así, recoge los datos del user y pass, si desmarcas esta opción deberías guardarla tambien el en txt, para que a la proxima vez que ejecutes la aplicación, no introduzca los datos.

Había pensado algo similar a esto, pero creo que no es necesario guardar esa opción y simplemente basarse en el hecho de que estén o no presentes los otros valores.

// Saludos

gontxalo
04-07-2005, 00:24:03
Hola
Bien, es que en ficheros .txt o ficheros .ini, se leen con bloc de notas. Y creo que guardar un nombre y contraseña de acceso en estos archivos sería un fallo de seguridad. Que opináis.

Lo mejor sería guardarlo en registro de windows ?

Si puede ser así, que tendría que poner en el evento click del botón login para que lo puesto en los edit nombre y contraseña se guarde en el registro de windows ?

Y que tendría que hacer luego para que el checkbox si esta checked lea ese registro de windows y al abrir la aplicación, los edit ya tengan ese nombre y contraseña ?

Gracias

delphi.com.ar
04-07-2005, 00:55:16
Hola
Bien, es que en ficheros .txt o ficheros .ini, se leen con bloc de notas. Y creo que guardar un nombre y contraseña de acceso en estos archivos sería un fallo de seguridad. Que opináis.

Lo mejor sería guardarlo en registro de windows ?

Los TXT los lees con el block de notas, y el Registro con el Regedit... ¿Cuál es la diferencia?
Si vas a guardar datos importantes y privados, guardes dónde los guardes lo importante es que esten bien encriptados.

gontxalo
04-07-2005, 01:00:39
No lo se, la verdad pensaba que podían leer más facilmente por ajenos a nuestro ordenador los archivos .txt que lo que tienes en el registro de windows

Lepe
04-07-2005, 10:16:11
En lugar de guardarlo como .txt guarda el archivo con extensión .XCR ya no sale el icono del bloc de notas. Es un truco muy usado :D

Un saludo

gontxalo
04-07-2005, 11:07:54
Hola
Si, guardarlo así no sale el icono de bloc de notas, pero creo que no deja de ser un fallo de seguridad.

Alguien sabe como guardarlo en .txt pero que se guarde encriptado?

Se guardan las claves en .txt pero después de encriptarlo.

En comoponentes indy creo que hay algo de esto, md5 pero no se donde.

Gracias.

delphi.com.ar
04-07-2005, 14:29:12
Hola
Alguien sabe como guardarlo en .txt pero que se guarde encriptado?

Busca en el foro la palabra: "encriptar" y vas a encontrar varios hilos al respecto.

Saludos!

gontxalo
04-07-2005, 14:31:39
Gracias.
Voy a buscar.

gontxalo
05-07-2005, 18:11:04
Hola
He leído mensajes del foro de encriptación y muchos hablan del truco nº 1oo de http://www.q3.nu/trucomania/

Pero en los comentarios sale también que no funciona correctamente y eso es lo que me pasa.

También Miguel Angel comenta:
A mi me funciona perfectamente, aunque con dos limitaciones.
1 Se ha de utilizar variables de tipo string (No un componente como TEdit, TMemo etc.).
2 El tamaño de la cadena a encriptar no puede ser mayor de 255 caracteres.

Yo creo un fichero .txt de los Edit y en el evento click de un botón se guarda encriptado. Luego en el evento click de otro botón recuperarlo, desencriptarlo y que aparezca en los edit. Me funciona correctamente, pero en algunas palabras no. En algunas se me corta, en otras aparece en los edit parte del encriptado.

Que puedo hacer?
Si no funciona correctamente por los edit que puedo hacer?

Gracias.

Code:
implementation
{$R *.dfm}
procedure TForm2.Button1Click(Sender: TObject);
Var
MiFichero : TextFile;
Nombre : String;
const
C1 = 52845;
C2 = 11719;
function Encrypt(const S: String; Key: Word): String;
Var
I: byte;
begin
SetLength(Result,Length(S));
for I := 1 to Length(S) do begin
Result[I] := char(byte(S[I]) xor (Key shr 8));
Key := (byte(Result[I]) + Key) * C1 + C2;
end;
end;
begin
Edit1.Text := Encrypt(Edit1.Text,6474);
Nombre := Edit1.Text;
AssignFile (MiFichero,'nombre.txt');
Rewrite (MiFichero);
writeln(MiFichero,Nombre);
CloseFile (mifichero);
Edit1.Clear
end;
procedure TForm2.Button2Click(Sender: TObject);
Var
MiFichero : TextFile;
Nombre : String;
const
C1 = 52845;
C2 = 11719;
function Decrypt(const S: String; Key: Word): String;
var
I: byte;
begin
SetLength(Result,Length(S));
for I := 1 to Length(S) do begin
Result[I] := char(byte(S[I]) xor (Key shr 8));
Key := (byte(S[I]) + Key) * C1 + C2;
end;
end;
begin
AssignFile (MiFichero,'nombre.txt');
Reset (MiFichero);
Read(MiFichero,Nombre);
CloseFile (mifichero);
Edit1.Text := Nombre;
Edit1.Text := Decrypt(Edit1.Text,6474);
end;
end.

delphi.com.ar
05-07-2005, 18:33:24
1 Se ha de utilizar variables de tipo string (No un componente como TEdit, TMemo etc.)
Los dos componentes tienen una propiedad Text que es del tipo string, simplemente tienes que encriptar ese valor

2 El tamaño de la cadena a encriptar no puede ser mayor de 255 caracteres.
Esto depende del algoritmo a utilizar.


PD: Viendo las trabas que tienes con algo tan sencillo... ¿No crees que sería importante capacitarte antes de encarar el proyecto?... Leer un libro, asistir a un curso...

gontxalo
05-07-2005, 18:41:03
Si, estoy en ello. Pero a la vez que voy aprendiendo con libros y tutoriales me meto ha hacer cosas ya que creo que así se aprende. Si leo y no hago y no experimento, no aprendo.

Gracias