Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Usuarios, passwd y listbox?? (https://www.clubdelphi.com/foros/showthread.php?t=90358)

JuancaDJ 23-05-2016 21:37:02

Usuarios, passwd y listbox??
 
Hola buenas tardes, tengo la siguiente problematica ya que estoy creando una aplicacion que contiene usuarios y contraseña, esos usuarios estan almacenados en un fichero de texto plano que carga un listbox, y las contraseñas en texto plano tambien que los carga otro listbox, pero ambos listbox estan ocultos, por lo que agregue 2 Edit, uno para usuario y otro para contraseñael tema es el siguiente el codigo me queda asi:

if edit1.text=listbox1.items.string[0] then
if edit2.text=listbox1.items.string[0] then

haga la funcion X y si no, no haga esa funcion, como pueden ver el compara que tanto el usuario y la contraseña esten ubicadas en el mismo orden en los 2 ficheros, o sea fichero usuarios, el primero corresponde a la contraseña ubicada en el primer lugar del fichero passwd

por lo que si tengo 100 usuarios debo estar repitiendo ese codigo 100 veces solo variando el numero del string[]??

PD: No utilizo una Base de datos ya que de momento el ODBC para mysql no he podido bajarlo pues el sitio prohibe las descargas a cuba, pais en el que vivo. Gracias.

rocksoft 23-05-2016 22:28:47

Hola JuancaDJ,

realmente segun tu descripcion no endiendo lo que pretendes pero me lo puedo imaginar, si ya que tienes dos listbox ocultas, por que no usas un stringlist asi no tienes que ocultar nada.

lo que tienes que hacer es buscar el valor del edit1 en la Stringlist (o listbox), si existe lees el numero de linea[i] con este numero solo tienes que ir a la linea[i] del Listbox2, comparas el valor que encuentas con el edit2 y listo.

para esto te recomiendo usar un Hash o al menos codificar los dos archivos y al importarlos decodificarlos

ecfisa 23-05-2016 22:34:55

Hola.

Me resulta confuso el planteo, no se si entendí lo que buscas...

Si interpreté bién no veo la necesidad de usar dos TListBox, podrías hacer algo similar a esto:
Código Delphi [-]
....
var
  User, Password: TStrings;

procedure TForm1.FormCreate(Sender: TObject);
begin
  User     := TStringList.Create;
  Password := TStringList.Create;
  User.LoadFromFile('Users.txt');
  Password.LoadFromFile('Passwords.txt');
end;

procedure TForm1.btnAceptaClick(Sender: TObject);
var
  ix : Integer;
  pIn,uIn: Boolean;
begin
  ix := User.IndexOf(edUser.Text);
  uIn := ix <> -1;
  if uIn then
    pIn := edPassword.Text = Password[ix];
  if not (pIn and uIn) then
    raise Exception.Create('Nombre de usuario o contraseña incorrectos');
  //...
  //...
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  User.Free;
  Password.Free;
end;

Saludos :)

JuancaDJ 23-05-2016 22:41:46

Bueno no conosco cuales son los Stringlist, estoy usando delphi 7, ademas de que la programacion nunca a sido mi mayor trabajo, ya que las redes me ocuparon mucho tiempo pero ahora cambie de trabajo y necesite crear una aplicacion y delphi siempre fue lo que me gusto y usé pero no a niveles muuyy avanzados
Por favor al que posteo ese codigo puede explicarme mas o menos que es?, ya que hay cosas ahi que no entiendo ni se que funsion cumplen. Gracias
Otra cosa eso del hash es buena idea pero igual en esos temas estoy totalmente botado ejeje

rocksoft 23-05-2016 23:06:12

Hola JuancaDJ,

veo que ecfisa te lo dio ya todo masticadito, para un copia y pegar.

Yo te recomiendo que pruebes el codigo y cosa que no sepas que es lo marcas y le das a la ayuda de delphi, te sorprenderas :)

ecfisa 23-05-2016 23:07:54

Hola JuancaDJ
Cita:

Empezado por JuancaDJ (Mensaje 505499)
Bueno no conosco cuales son los Stringlist, estoy usando delphi 7, ...

Cuando usas la propiedad Items de los TListBox, estas usando TStrings ya que dicha propiedad es de ese tipo.

Por eso es que te digo que no necesitas usar dos ListBox ocultos, podes usar directamente dos variables de tipo TStrings, cuentan con los mismos métodos que la propiedad Items de los ListBox ( LoadFromFile, SaveToFile, Add, etc, etc).

El ejemplo que te puse casi cubre todos los aspectos, me faltó agregarle dos líneas que guarden los cambios:
Código Delphi [-]
...
procedure TForm1.FormDestroy(Sender: TObject);
begin
  User.SaveToFile('Users.txt');
  Password.SaveToFile('Passwords.txt');

  User.Free;
  Password.Free;
end;
Saludos :)

JuancaDJ 23-05-2016 23:26:24

Bueno ya me llevo el codigo para probarlo a ver que tal me va, pero sigo sin entender esta parte:

Código Delphi [-]
var   ix : Integer;   pIn,uIn: Boolean; 
begin   ix := User.IndexOf(edUser.Text);
 uIn := ix <> -1;   if uIn then     pIn := edPassword.Text = Password[ix];
 if not (pIn and uIn) then
ademas de que
edUser.Text edPassword que son? dos edit que tengo que tener solamente en el formulario?, ya los listbox no los necesitaria con esta opcion¿?

ecfisa 23-05-2016 23:32:39

Hola JuancaDJ.

Por favor cuando incluyas código en tus mensaje utiliza TAG's para darle más legibilidad. Te pongo una imágen que explica el uso:


Con respecto a tu última consulta, edUser y edNombre serían los Edits que mencionas en tu primer mensaje. Mientras que los ListBox son innecesarios siendo reemplazados por las variables User y Password de tipo TStrings.

Saludos :)

JuancaDJ 23-05-2016 23:38:18

Gracias por el dato de las etiquetas para codigos, pues andaba en busca de eso pero no decia code en ningun lado
Y tambien gracias por aclararme eso de los edit y lo innecesario que resultan los listbox, con esta variable, pero podrias explicarme mas o menos

Código Delphi [-]
ix := User.IndexOf(edUser.Text);   uIn := ix <> -1;   if uIn then     pIn := edPassword.Text = Password[ix];   if not (pIn and uIn) then

Gracias

ecfisa 23-05-2016 23:55:29

Perdón, olvidé ese punto :o

Te comento las líneas de código que te resultan confusas:
Código Delphi [-]
var 
  ix : Integer; // variable que almacenará el índice        
  pIn, uIn: Boolean;  // True si logran el acceso, False de otro modo
begin 
  ix := User.IndexOf(edUser.Text);  // En ix el índice del nombre de usuario o -1 si no existe
  uIn := ix <> -1;   // uIn es verdadero si ix <> -1
  if uIn then   // si el nombre existe -> controlar contraseña
     pIn := edPassword.Text = Password[ix]; // pIn es True si la contraseña ingresada = almacenada
  if not (pIn and uIn) then // si al menos uno de los dos es falso
     // Mostrar error
...
Encontrarás una explicación mas detallada en la ayuda de Delphi (estando el cursor sobre el término deseado presiona F1), además te puede resultar útil:Saludos :)

JuancaDJ 24-05-2016 00:15:07

Ahh yap, pero ese codigo hace lo que plantié en la problematica del incio?
o sea tengo 1 fichero de texto plano con 10 usuarios y otro con 10 contraseñas, por al usuario 1 le corresponde la contraseña 1 del fichero passwd, no es que eso va a escanear el fichero de texto y decir de los 10 usuarios si existe el usuario pepito en el puesto 4, y en el fichero passwd existe la contraseña de pepito en el puesto 10, no no es pepito puesto 4 y la contraseña de pepito igual en el puesto 4

rocksoft 24-05-2016 00:44:38

Justamente :)

en esta linea esta la magia:
Código Delphi [-]
ix := User.IndexOf(edUser.Text);  // En ix el índice del nombre de usuario o -1 si no existe

la explicación: LINK

JuancaDJ 26-05-2016 21:16:45

Muchas gracias, heche a andar el ejemplo que me dieron y me sirvio de maravillas pero tengo un problema, ya que si analizan el primero post, ese usuario necesitaba cumplir con ciertos requisitos, que ya con este codigo me ayudaron mucho, pero una vez que ese usuario era valido, se cargarma un segundo formalario que controlaba el tiempo disponible de ese usuario, es tipo un cibercafe, si tienes tiempo puedes hacer esto o aquello si no no, entonces el segundo form tenia esto:

Código Delphi [-]
procedure TForm2.FormActivate(Sender: TObject);
begin

//usuario 0
//timer1.Enabled:=true;
if form1.Edit1.Text=form1.ListBox1.Items.Strings[0] then
memo1.Lines.LoadFromFile('/veryimport/data/time0.dll');
labeltimer.Caption:=memo1.Lines.Text;

// usuario 1
//timer1.Enabled:=true;
if form1.Edit1.Text=form1.ListBox1.Items.Strings[1] then
memo1.Lines.LoadFromFile('/veryimport/data/time1.dll');
labeltimer.Caption:=memo1.Lines.Text;

end;

end.


procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
//usuario 0
memo1.Lines.Text:=labeltimer.Caption;
if form1.Edit1.Text=form1.ListBox1.Items.Strings[0] then
memo1.Lines.SaveToFile('/veryimport/data/time0.dll');
form1.Close;

//usuario1
if form1.Edit1.Text=form1.ListBox1.Items.Strings[1] then
memo1.Lines.SaveToFile('/veryimport/data/time1.dll');
form1.Close;

¨Timer¨¨

LabelTimer.Caption:= FormatdateTime('hh:mm:ss',StrToDateTime(LabelTimer.Caption) -0.00001);
if labelTimer.caption='00:00:00' then
form1.Close; //Se cierra la aplicacion

CVomo pueden ver cuando en el form1.edit1 se insertaba cierto usuario entonces ese form2 cargaba el fichero tiempo que controlaba ese usuario, entonces la pregunta es, puede prescidir de crear cientos de ficheros tiempo y hacer tipo el de usuario y contraseña¿, o sea que cargue de una lista el que pertenece a cada usuario y finalizada su session guarde en ese mismo lugar el valor con el que termina u obligatoriamente si tiene que hacerse cientos de ficheros, uno por usuario??
Gracias

rocksoft 26-05-2016 22:08:36

Hola JuancaDJ,

no se pero creo que te estas enredando tu solo con tanto arquivo, por que no usas una base de datos plana y te ahorras muchos problemas, o en el peor de los casos, crea un solo archivo, lo importas en una tabla de memoria y tienes practicamente el uso como si fuera una base de datos.

Ademas no es una buena practica lo que estas haciendo preguntado el estado de un componente de otra unit, muy aparte de que empiezas a repetir codigo, que pasaria si tienes 300 usuarios, mejor le pasas la variable a la forma2 que es el index de tu listbox que seria ix= 0; y te ahorras lo que esta en rojo


Código Delphi [-]
procedure TForm2.FormActivate(Sender: TObject);
begin

//usuario 0
//timer1.Enabled:=true;
if form1.Edit1.Text=form1.ListBox1.Items.Strings[0] then
memo1.Lines.LoadFromFile('/veryimport/data/time'+inttostr(ix)+'.dll');
labeltimer.Caption:=memo1.Lines.Text;

// usuario 1
//timer1.Enabled:=true;
if form1.Edit1.Text=form1.ListBox1.Items.Strings[1] then
memo1.Lines.LoadFromFile('/veryimport/data/time1.dll');
labeltimer.Caption:=memo1.Lines.Text;

end;

JuancaDJ 26-05-2016 23:49:57

Hola, gracias por la ayuda nuevamente me interesa mucho esta parte: crea un solo archivo, lo importas en una tabla de memoria y tienes practicamente el uso como si fuera una base de datos.

Ya que al no poder descargar el odbc de mysql entonces he tenido que hacer todo ese reguero de ficheros, podrias explicarme como hago eso que me dices arriba?
Gracias

rocksoft 27-05-2016 01:37:47

Hola JuancaDJ,

una pregunta por que quieres usar el odbc de mysql si puedes acceder directamente? con los componentes firedac o ZeosLib.

Mira si tienes algun componente MemData en tu delphi, sino puedes buscar alguno libre
si usas DevExpress lo cargas asi:

Código Delphi [-]
dxMemData1.LoadFromTextFile('c:\xxxx.txt');

JuancaDJ 27-05-2016 02:00:26

Ummm estoy usando delphi7 esos componentes vienen ahi?
El tema de usar Mysql es que queria usar un base de datos para almacenar usuario, passwd y tiempo conectado pero al no poder poseer una base de datos he tenido que hacer 3 ficheros, usuario, passwd y tiempo, que en el caso del fichero tiempo se me esta complicando pues si tengo 300 usuarios tengo que hacer unos 300 ficheros ya que si dejo solo 1, cuando el usuario x cierra su aplicacion no podra guardar los cambios poque el usuario z aun esta conectado y el fichero esta en uso, por eso el tema de una base de datos o algo similar que me permita eso

Casimiro Notevi 27-05-2016 09:29:47

Creo que no está muy claro, exactamente, lo que quieres conseguir. Creo que estás intentando solucionar algo de forma no demasiado correcta. Deberías centrarte primero en explicar claramente la problemática que necesitas solucionar. Luego buscar la mejor solución para esa problemática. Finalmente implementar esa solución.
Tú estás empezando por la última parte, sin saber si es la mejor solución para esa problemática.
Es mi parecer, puede que no haya entendido bien.

JuancaDJ 01-06-2016 19:16:17

Código Delphi [-]
procedure TForm2.FormActivate(Sender: TObject); 
begin  
  //usuario 0
  //timer1.Enabled:=true; 
  if form1.Edit1.Text=form1.ListBox1.Items.Strings[0] then
    memo1.Lines.LoadFromFile('/veryimport/data/time'+inttostr(ix)+'.dll'); 
  labeltimer.Caption:=memo1.Lines.Text;

Esto me quedó asi:
Código Delphi [-]
procedure TForm2.FormActivate(Sender: TObject);
begin
  label2.Caption:=form1.Edit1.Text;
  timer1.Enabled:=true;
  memo1.Lines.LoadFromFile('/veryimport/data/time/' + form1.Edit1.Text + '.time');
  labeltimer.Caption:=memo1.Lines.Text;
end;

Referente a la problematica que tengo es simple, la idea era usar una Base de Datos pero ya por las razones expuestas no pude usarla y tuve que usar ficheros txt para mi solucion.

ecfisa 02-06-2016 12:00:24

Hola JuancaDJ.

Otra opción que podrías considerar es usar un TClientDataSet en memoria y manejarlo como si estuviera conectado a una bd usando los métodos LoadFromFile y SaveFromFile para plasmar y recuperar los datos en tu archivo.

Te pongo un ejemplo básico del control de ingreso:
Código Delphi [-]
...
implementation

var
  gFileName : string;

procedure TForm1.FormCreate(Sender: TObject);
var
  fld: TField;
  cds: TClientDataSet;
begin
  cds := ClientDataSet1;

  // ~ (*)
  fld := TStringField.Create(cds);
  fld.FieldName := 'NAME';
  fld.DataSet   := cds;
  fld := TStringField.Create(cds);
  fld.FieldName := 'PASSWORD';
  fld.DataSet   := cds;
  // ~

  cds.CreateDataSet;
  gFileName := ExtractFilePath(Application.ExeName) + 'ARCHIVO.CDS';
  if FileExists(gFileName) then
    cds.LoadFromFile(gFileName);
  cds.Open;
end;

procedure TForm1.btnAceptClick(Sender: TObject);
begin
  if not ClientDataSet1.Locate('NAME', EditName.Text, []) then
    raise Exception.Create('Nombre de usuario inexistente');

  if EditPassword.Text <> ClientDataSet1.FieldByName('PASSWORD').AsString then
    raise Exception.Create('Contraseña incorrecta');
  //...
  ShowMessage('¡ Bienvenido !');
end;

//....
procedure TForm1.FormDestroy(Sender: TObject);
begin
  ClientDataSet1.SaveToFile(gFileName);
end;
(*) los campos podes crearlos en tiempo de diseño pero lo hice en ejecución para clarificar.

Me valí de Edits para simplificar el ejemplo, pero no tendrías problemas en beneficiarte usando los controles de la pestaña DataControls como si el CDS estuviese conectado con una BD.

Saludos :)


La franja horaria es GMT +2. Ahora son las 22:05:20.

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