Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Login-Delphi (https://www.clubdelphi.com/foros/showthread.php?t=46990)

TKW04 17-08-2007 20:12:57

dice
 
el adoquery si lo pongo active me dice eso
por eso es que no se que hacer...... te mando mi codigo para lo veas .... el el form....
:confused:

enecumene 20-08-2007 06:40:45

esta duda va para caral: hice este login para mi aplicacion de acuerdo a tus sugerencia y me ha quedado asi:

Código Delphi [-]
procedure TFLogin.BitBtn1Click(Sender: TObject);
begin
 LoginOK :=False;
   ADLogin.Active:= True;
   ADLogin.Parameters.ParamByName('cod').Value:= EUsuario.Text;
    If ADLogin.RecordCount < 1 then
    Begin
       Cuenta := Cuenta + 1;
       MessageDlg('Usuario no encontrado',mtError, [mbOK], 0);
       EUsuario.Text := '';
       EClave.Text := '';
       ADLogin.Active := False;
       If Cuenta = 3 then Close;
    end
   else
       If ADLoginpass.AsString = EClave.Text then
        Begin
           LoginOk := True;
           Usuario := ADLoginusername.AsString;
           Nombre := ADLoginnom_user.AsString;
           ADLogin.Active := False;
           Close;
        end
     else
         Begin
           Cuenta := Cuenta + 1;
           MessageDlg('Clave Inválida',mtError, [mbOK], 0);
           EClave.Text := '';
           ADLogin.Active := False;
           If Cuenta = 3 then Close;
         end;
end;

pero me sale el siguiente error al clickear el boton:

Cita:

---------------------------
Debugger Exception Notification
---------------------------
Project Sigesped.exe raised exception class EDatabaseError with message 'Missing Connection or ConnectionString'. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------
he tratado de dar con el problema y pues me ha roto la cabeza, existe la posibilidad de que el form principal sea MDI? trabajo con ado.

saludos...

Caral 20-08-2007 15:44:41

Hola
Si se llama al login desde el form principal, hay que ir a projects, option y pasar al form login a available forms.
Si es el primer form, hay que colocarlo en main form.
Con esto ya se elimina el problema.
Saludos

enecumene 20-08-2007 17:49:32

Caral, precisamente lo tengo asi, el login en forma alvailable y el main en auto-create form y el error persiste todavia :confused::confused::confused:

Caral 20-08-2007 17:53:59

Hola
Te as fijado que en uses del login este el datamodule?
No va a tener conexion si no lo incluye.
Revisalo, no se me ocurre nada.
Saludos

enecumene 20-08-2007 18:01:45

efectivamente esta incluido en el uses del form

Caral 20-08-2007 18:09:25

Hola
Este es el codigo del login:
Código Delphi [-]
unit UFLogin;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, ADODB, StdCtrls;

type
  TFLogin = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    EUsuario: TEdit;
    EClave: TEdit;
    BtnOk: TButton;
    BtnCancel: TButton;
    ADLogin: TADOQuery;
    ADLoginCodUsuario: TWideStringField;
    ADLoginNombre: TWideStringField;
    ADLoginClave: TWideStringField;
    procedure FormCreate(Sender: TObject);
    procedure BtnOkClick(Sender: TObject);
    procedure BtnCancelClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  FLogin: TFLogin;
  Cuenta : integer;
  Usuario, Nombre : String;
  LoginOK : boolean;
    
implementation

uses UFClientes; // este es el fom que se conecta, revisarlo.

{$R *.dfm}

procedure TFLogin.FormCreate(Sender: TObject);
begin
    Cuenta := 0;
   Usuario := '';
   Nombre := '';
end;

procedure TFLogin.BtnOkClick(Sender: TObject);
begin
   LoginOK := False;
   ADLogin.Parameters.ParamByName('nom').Value:= EUsuario.Text;
   ADLogin.Active:= True;
   EUsuario.Text:= ADLogin.Fields[1].AsString;
   If ADLogin.RecordCount < 1 then
    Begin
       Cuenta := Cuenta + 1;
       MessageDlg('Usuario no encontrado',mtError, [mbOK], 0);
       EUsuario.Text := '';
       EClave.Text := '';
       ADLogin.Active := False;
       If Cuenta = 3 then Close;
    end
   else
       If ADLoginClave.AsString = EClave.Text then
        Begin
           LoginOk := True;
           Nombre := ADLoginNombre.AsString;
           ADLogin.Active := False;
           FClientes:=TFClientes.Create(self);
           try
           FLogin.Visible:= False;
           FClientes.ShowModal;
           finally
           FClientes.Free;
           end;
           Close;
        end
     else
         Begin
           Cuenta := Cuenta + 1;
           MessageDlg('Clave Inválida',mtError, [mbOK], 0);
           EClave.Text := '';
           ADLogin.Active := False;
           If Cuenta = 3 then Close;
         end;

end;

procedure TFLogin.BtnCancelClick(Sender: TObject);
begin
  LoginOK :=False;
   Close;
end;

end.
En projets, el login esta en main form.
Me dejas mal parado, no entiendo el problema.
Saludos

cHackAll 20-08-2007 18:31:31

Cita:

Empezado por Caral
Código Delphi [-]
       If ADLoginClave.AsString = EClave.Text then

Como comentario para el hilo, la clave es algo "sagrado".
Alguien mal intencionado podría utilizar la API GetWindowText(Edit1.Handle, Buffer); para obtener la clave del TEdit, lo que significa que PasswordChar no oculta completamente la contraseña. Por lo que aconsejo utilizar un código parecido a éste:


Código Delphi [-]
var Clave: string;
 
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var Temp: string;
begin
 if Key = #8 then
  begin
   if Length(Clave) <> 0 then
    SetLength(Clave, Length(Clave) - 1);
  end
 else
  if Key in ['0'..'9', 'a'..'z', 'A'..'Z'{etc}] then
   begin
    Clave := Clave + Key;
    Key := Edit1.PasswordChar;
   end
  else
   Key := #0;  
end;

Lo que le da un nivel mayor a la seguridad de la aplicación.
Es muy importante tambien NO realizar comparaciones directas con la clave; alguien puede lograr abrir la BD y ver las contraseñas. Lo óptimo es siempre encriptarla o en su defecto se puede sacar la CRC o Hash de la contraseña y guardar ése valor en ves de la contraseña como tal.

Saludos.

enecumene 20-08-2007 18:41:24

caral, resolvi el problema del error en vez poner en connection en la propiedad del adoquery el form donde esta la base de datos que es un datamodule lo conecte directamente a la base de dato a traves del connectionstring, pero ahora sucede otro problema, al poner el user y el pass le doy click al boton y lo que hace es que me limpia los edits, al no poner una clave o una clave erronea la clave real me aparece en el edit de user... que puede estar pasando?:confused::confused::confused: y gracias po tu tiempo caral..

saludos..

Caral 20-08-2007 18:45:36

Hola
Que dificil, ni idea.
Coloca el codigo, a ver que esta pasando.
Saludos

enecumene 20-08-2007 18:50:40

Aqui esta el codigo Caral:

Código Delphi [-]
unit Login;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, DB, ADODB;

type
  TFLogin = class(TForm)
    Label1: TLabel;
    EUsuario: TEdit;
    Label2: TLabel;
    EClave: TEdit;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    ADLogin: TADOQuery;
    ADLoginusername: TWideStringField;
    ADLoginpass: TWideStringField;
    ADLoginnom_user: TWideStringField;
    procedure FormCreate(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  FLogin: TFLogin;
  Cuenta : integer;
  Usuario, Nombre : String;
  LoginOK : boolean;

implementation

uses Datos, inicio;

{$R *.dfm}

procedure TFLogin.FormCreate(Sender: TObject);
begin
   Cuenta := 0;
   Usuario := '';
   Nombre := '';
end;

procedure TFLogin.BitBtn1Click(Sender: TObject);
begin
 LoginOK := False;
   ADLogin.Parameters.ParamByName('cod').Value:= EUsuario.Text;
   ADLogin.Active:= True;
   EUsuario.Text:= ADLogin.Fields[1].AsString;
   If ADLogin.RecordCount < 1 then
    Begin
       Cuenta := Cuenta + 1;
       MessageDlg('Usuario no encontrado',mtError, [mbOK], 0);
       EUsuario.Text := '';
       EClave.Text := '';
       ADLogin.Active := False;
       If Cuenta = 3 then Close;
    end
   else
       If ADLoginpass.AsString = EClave.Text then
        Begin
           LoginOk := True;
           Nombre := ADLoginnom_user.AsString;
           ADLogin.Active := False;
           incio:=Tincio.Create(self);
           try
           FLogin.Visible:= False;
           incio.ShowModal;
           finally
           incio.Free;
           end;
           Close;
        end
     else
         Begin
           Cuenta := Cuenta + 1;
           MessageDlg('Clave Inválida',mtError, [mbOK], 0);
           EClave.Text := '';
           ADLogin.Active := False;
           If Cuenta = 3 then Close;
         end;
end;

end.

Caral 20-08-2007 18:55:26

Hola
Cual es el codigo del sql strimgs del query?
Lo pone para verlo?
Lo que necesito es ver la relacion.
Saludos

enecumene 20-08-2007 18:59:59

aqui está:

Código SQL [-]
SELECT username, pass, nom_user FROM users WHERE username = cod

Caral 20-08-2007 23:39:23

Hola
Acabo de probar tu codigo tal cual lo pusiste y me funciona perfectamente.
hay que tener en cuenta que segun los parametros que pusiste va asi:
username = EUsuario.Text
pass = EClave.Text
Dale click a parameters del query en Value ponle 0
Dale doble click al query, raton derecho, add, y coloca todos los campos en la pantallita.
Tiene que funcionar, a mi me funciona.
Saludos

enecumene 20-08-2007 23:46:13

ok Caral ahora mismo ire a probar...luego te comento

enecumene 21-08-2007 00:12:27

Hola Caral, ya resolvi el problema!!!, gracias a ti por tu tiempo, tuve que hacer un pequeñito cambio, originalmente esta parte del codigo era asi:

Código Delphi [-]
If ADLoginpass.AsString = EClave.Text then
Begin
LoginOk := True;
Nombre := ADLoginnom_user.AsString;
ADLogin.Active := False;
incio:=Tincio.Create(self);
try
FLogin.Visible:= False;
incio.ShowModal;
finally
incio.Free;
end;
Close;
End


ahora lo puse asi:

Código Delphi [-]
If ADLoginpass.AsString = EClave.Text then
Begin
LoginOk := True;
Nombre := ADLoginnom_user.AsString;
ADLogin.Active := False;
FLogin.Visible:= False;
incio.Show;
Close;
end


en este cambio le elimine el try...finally, el free y el showmodal porque solo funciona solo si el form a llamar es fsNormal
pero el mio es tipo MDIform por eso que al digitar la clave se quedaba en el login y se limpiaban los edits.

ahora tengo este otro problemita que persiste y es cuando se digita una clave erronea la clave aparece en el edit de usuarios..

saludos.

enecumene 21-08-2007 00:27:50

Bueno ya resolvi el ultimo problema que era muy sencillo lo puse asi:

Código Delphi [-]
Begin
           Cuenta := Cuenta + 1;
           EUsuario.Text := '';
           MessageDlg('Clave Inválida',mtError, [mbOK], 0);
           EClave.Text := '';
           ADLogin.Active := False;
           If Cuenta = 3 then Close;
         end;

de Nuevo gracias caral por tu tiempo, te lo agradezco, que dios te bendiga. ah y otra cosita, donde defino los privilegios? en el login o en el main?.

Saludos...

enecumene 22-08-2007 03:15:57

Hola de nuevo, continuando con el mismo hilo, quisiera saber como defino los privilegios de los usuarios? ejemplo:

la tabla de usuario contiene esos campos tipo "Yes/No" que son los botones y menus a restringir el acceso:

backup
findped
findtra
instra
insped
settings
reports
findsupli
inssupli
stats

con el mismo codigo del login como defino los accesos por ejemplo:
si se loguea pedro y el tiene estos privilegios:

backup->No
findped->Yes
findtra->Yes
instra->Yes
insped->Yes
settings->No
reports->Yes
findsupli->Yes
inssupli->Yes
stats->No

al momento de pedro loguearse los menus y botones correspondientes se pongan false o true dependiendo del Yes o No.

quise hacerlo asi pero no me funciona:

Código Delphi [-]
var
BackUp: string;
Begin
BackUp:=ADLoginbackup.Dataset.DatasetField.Value;
if BackUp = 'No' then
Begin
incio.BackUpdatos1.Enabled:=False;
end
else
Begin
incio.BackUpdatos1.Enabled:=True;
end;
end;

Caral 22-08-2007 04:33:40

Hola
Te voy a explicar como lo hago yo:
Creo un campo (permiso) este campo es numerico, defino los permisos en base a la numeracion, 1, 2, 3
1= acceso a todo
2= acceso a x parte o botones
3= acceso a otros botones
asi se pueden tener tantos accesos o permisos como se quiera.
Agrego el campo a la tabla, esta quedara en tercer lugar, 0-1-2-3
el codigo que uso es este:
Lo reconoceras, facilmente:
Código Delphi [-]
  LoginOK :=False;
   AdoQuery1.Parameters.ParamByName('Cod').Value:= Edit1.Text;
   AdoQuery1.Active:= True;
  If AdoQuery1.Fields[3].AsString = '1' then
     // todo
   begin
  // todo
   end;
   If AdoQuery1.Fields[3].AsString = '2' then
   // bodega
   begin
     FmainForm.BitBtn3.Enabled := False;
     FmainForm.BitBtn17.Enabled := False;
     FmainForm.BitBtn18.Enabled := False;
     FmainForm.BitBtn19.Enabled := False;
     FmainForm.BitBtn6.Enabled := False;
     FmainForm.BitBtn1.Enabled := False;
     FmainForm.BitBtn2.Enabled := False;
     FmainForm.BitBtn15.Enabled := False;
     FmainForm.BitBtn14.Enabled := True;
     FmainForm.BitBtn8.Enabled := True;
     FmainForm.BitBtn23.Enabled := False;
     FmainForm.BitBtn24.Enabled := False;
     FmainForm.Timer2.Enabled := False;
     FmainForm.PopupMenu7.Items[3].Enabled:= False;
     FmainForm.PopupMenu7.Items[4].Enabled:= False;
     FmainForm.PopupMenu7.Items[5].Enabled:= False;
     FmainForm.PopupMenu7.Items[6].Enabled:= False;
     FmainForm.PopupMenu7.Items[7].Enabled:= False;
     FmainForm.PopupMenu7.Items[8].Enabled:= False;
     FmainForm.PopupMenu7.Items[20].Enabled:= False;
     FmainForm.PopupMenu7.Items[21].Enabled:= False;
     FmainForm.PopupMenu7.Items[23].Enabled:= False;
     FmainForm.PopupMenu7.Items[24].Enabled:= False;

   end;
    If AdoQuery1.Fields[3].AsString = '3' then
   // produccion, acabado
   begin
     FmainForm.BitBtn2.Enabled := False;
     FmainForm.BitBtn3.Enabled := False;
     FmainForm.BitBtn17.Enabled := False;
     FmainForm.BitBtn18.Enabled := False;
     FmainForm.BitBtn19.Enabled := False;
     FmainForm.BitBtn16.Enabled := False;
     FmainForm.BitBtn5.Enabled := False;
     FmainForm.BitBtn6.Enabled := False;
     FmainForm.BitBtn7.Enabled := False;
     FmainForm.BitBtn1.Enabled := False;
     FmainForm.BitBtn15.Enabled := False;
     FmainForm.BitBtn13.Enabled := False;
     FmainForm.BitBtn4.Enabled := False;
     FmainForm.BitBtn14.Enabled := False;
     FmainForm.BitBtn8.Enabled := False;
     FmainForm.BitBtn27.Enabled := False;
     FmainForm.BitBtn21.Enabled := False;
     FmainForm.BitBtn22.Enabled := False;
     FmainForm.BitBtn23.Enabled := False;
     FmainForm.BitBtn24.Enabled := False;
     FmainForm.BitBtn25.Enabled := False;
     FmainForm.Timer2.Enabled := False;
     FmainForm.PopupMenu7.Items[1].Enabled:= False;
     FmainForm.PopupMenu7.Items[2].Enabled:= False;
     FmainForm.PopupMenu7.Items[3].Enabled:= False;
     FmainForm.PopupMenu7.Items[4].Enabled:= False;
      end;
 If AdoQuery1.RecordCount < 1 then
    Begin
       Cuenta := Cuenta + 1;
       MessageDlg('Usuario no encontrado',mtError, [mbOK], 0);
       Edit1.Text := '';
       Edit2.Text := '';
       AdoQuery1.Active := False;
       If Cuenta = 3 then Close;
    end
   else
       If AdoQuery1Clave.AsString = Edit2.Text then
        Begin
           LoginOk := True;
           Usuario := AdoQuery1CodUsuario.AsString;
           Nombre := AdoQuery1Nombre.AsString;
           AdoQuery1.Active := False;
           Close;
        end
     else
         Begin
           Cuenta := Cuenta + 1;
           MessageDlg('Clave Inválida',mtError, [mbOK], 0);
           Edit2.Text := '';
           AdoQuery1.Active := False;
           If Cuenta = 3 then Close;
         end;
espero te sirva.
Saludos

enecumene 22-08-2007 05:08:55

Gracias Caral ahora mismo intentare implementarlo, luego te comento. Gracias.


La franja horaria es GMT +2. Ahora son las 11:59:43.

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