Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 24-05-2007
Avatar de fedelphi
fedelphi fedelphi is offline
Miembro
 
Registrado: abr 2006
Ubicación: Santa Fe
Posts: 122
Poder: 19
fedelphi Va por buen camino
Validacion de usuarios

Hola de nuevo, quiero hacer que el programa me pida usuario y clave antes de entrar en la pantalla principal del mismo, entonces como se hace para que solo aparezca esta pantalla y quede a la espera del ingreso del usuario? y una vez realizado esto, verificaria en una tabla los datos y en caso de ser correctos recupero el id_usuario y lo coloco en una variable privada o publica de la pantalla principal que se crea con el proyecto y mostraria esta, es esta la forma correcta de realizarlo?
gracias
__________________
De lo que hay no falta nada!!!
Responder Con Cita
  #2  
Antiguo 24-05-2007
[FGarcia] FGarcia is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Cordoba, Veracruz, México
Posts: 1.123
Poder: 20
FGarcia Va por buen camino
Hola!

Una busqueda en el foro te da suficientes resultados, algunos de ellos:

http://www.clubdelphi.com/foros/show...ght=form+login
http://www.clubdelphi.com/foros/show...ght=form+login
http://www.clubdelphi.com/foros/show...tringir+acceso
http://www.clubdelphi.com/foros/show...ght=form+login

En la seccion de trucos hay uno para esto que tu quieres pero ese te dejo que lo busques.
Responder Con Cita
  #3  
Antiguo 24-05-2007
Avatar de ElDioni
[ElDioni] ElDioni is offline
Miembro Premium
 
Registrado: jul 2005
Ubicación: Murcia (España)
Posts: 935
Poder: 19
ElDioni Va por buen camino
en la unidad principal del proyecto, tengo puesto lo siguiente:
Código Delphi [-]
var
  frmacceso:tfrmacceso;
begin
  Application.Initialize;
  frmacceso:=tfrmacceso.create(nil);
  if frmacceso.Showmodal=mrOK then
    begin
      frmacceso.Free;
      Application.CreateForm(TFrmPresAdh, FrmPresAdh);
      ...
      Application.Run;
      Application.Terminate;
    end
  else
    begin
      frmacceso.free;
    end;
end.
y luego desde el formulario de acceso, se comprueba el nombre de usuario y la contraseña si son correctos entonces modalresult:=MROK y si no modalresult:=MRCANCEL.

Un saludo
Responder Con Cita
  #4  
Antiguo 25-05-2007
Avatar de vtdeleon
vtdeleon vtdeleon is offline
Miembro
 
Registrado: abr 2004
Ubicación: RD & USA
Posts: 3.236
Poder: 24
vtdeleon Va por buen camino
Run y terminate en el mismo bloque? Seguro que te funciona?

Código Delphi [-]
var
  frmacceso:tfrmacceso;
begin
  Application.Initialize;
  frmacceso:=tfrmacceso.create(nil);
  if frmacceso.Showmodal=mrOK then
    begin
      Application.CreateForm(TFrmPresAdh, FrmPresAdh);
      ...
      Application.Run;
    end
    frmacceso.free;
end.
Creo que asi está mejor.
__________________
Van Troi De León
(Not) Guía, Code vB:=Delphi-SQL, ¿Cómo?
Viajar en el tiempo no es teóricamente posible, pues si lo fuera, ya estarían aqui contándonos al respecto!
Responder Con Cita
  #5  
Antiguo 25-05-2007
Avatar de Maury Manosalva
Maury Manosalva Maury Manosalva is offline
Miembro
 
Registrado: ago 2005
Posts: 101
Poder: 19
Maury Manosalva Va por buen camino
Como hacer una entrada para usuarios

Código Delphi [-]
with QryConsultas do
   begin
   close;
   SQL.Clear;
   consulta := 'Select * from TabUsuarios where IdUsuario ='+char(39)+ txtUsuario.Text+char(39)+
   'and ConUsuario ='+chr(39) + txtcontrasena.Text+char(39);
   valor := txtUsuario.Text;
   SQL.Add(consulta);
   Open;
   If (RecordCount=1) then

si es igual a 1 pasa a lo que quieres que haga, de lo contrario un application.terminate
Responder Con Cita
  #6  
Antiguo 26-05-2007
Avatar de vtdeleon
vtdeleon vtdeleon is offline
Miembro
 
Registrado: abr 2004
Ubicación: RD & USA
Posts: 3.236
Poder: 24
vtdeleon Va por buen camino

Saludos
__________________
Van Troi De León
(Not) Guía, Code vB:=Delphi-SQL, ¿Cómo?
Viajar en el tiempo no es teóricamente posible, pues si lo fuera, ya estarían aqui contándonos al respecto!
Responder Con Cita
  #7  
Antiguo 29-05-2007
Avatar de ElDioni
[ElDioni] ElDioni is offline
Miembro Premium
 
Registrado: jul 2005
Ubicación: Murcia (España)
Posts: 935
Poder: 19
ElDioni Va por buen camino
Vtdeleon tienes razon, lo pegaría sin darme cuenta, como lo modifique antes de pegar el codigo, para que quedara mas claro, al final parece casi lo complico más.
Responder Con Cita
  #8  
Antiguo 29-05-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Cita:
Empezado por vtdeleon
Run y terminate en el mismo bloque? Seguro que te funciona?
Pues curiosamente, puede que funcione. Ten en cuenta que dentro de "Run" se ejecuta un bucle que no finaliza hasta que la aplicación se termina.
Código Delphi [-]
repeat
  ....
until Terminated;
Así que no ejecutaríamos el método "Terminate" hasta que la aplicación este ya por finalizar. Es decir, la cosa no creo que de error, pero tampoco tiene mucho sentido.
Responder Con Cita
  #9  
Antiguo 30-05-2007
Avatar de vtdeleon
vtdeleon vtdeleon is offline
Miembro
 
Registrado: abr 2004
Ubicación: RD & USA
Posts: 3.236
Poder: 24
vtdeleon Va por buen camino
Saludos
Cita:
Empezado por Domingo
Así que no ejecutaríamos el método "Terminate" hasta que la aplicación este ya por finalizar.
Tienez razón.
Cita:
Empezado por Domingo
Es decir, la cosa no creo que de error, pero tampoco tiene mucho sentido.
Asi es...
__________________
Van Troi De León
(Not) Guía, Code vB:=Delphi-SQL, ¿Cómo?
Viajar en el tiempo no es teóricamente posible, pues si lo fuera, ya estarían aqui contándonos al respecto!
Responder Con Cita
  #10  
Antiguo 30-05-2007
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Poder: 20
cHackAll Va por buen camino
Cool Comentario

Cita:
Empezado por Maury Manosalva
...consulta := 'Select * from TabUsuarios where IdUsuario ='+char(39)+ txtUsuario.Text+char(39)+
'and ConUsuario ='+chr(39) + txtcontrasena.Text+char(39);
...


creo que con un "' or 'x' = 'x" estaríamos haciendo "SQL Injection"... NO aconsejo usar de esta forma al SQL.
Saludos
Responder Con Cita
  #11  
Antiguo 04-06-2007
Avatar de fedelphi
fedelphi fedelphi is offline
Miembro
 
Registrado: abr 2006
Ubicación: Santa Fe
Posts: 122
Poder: 19
fedelphi Va por buen camino
Hola, muchas gracias por las respuestas, he puesto el codigo asi,
Código Delphi [-]
var
  usuario:TFValidaUsr;
begin

  Application.Initialize;
  Application.CreateForm(Tmodulodatos, modulodatos);

  usuario:=TFValidaUsr.create(nil);
  if usuario.showmodal=mrOK then  
  begin
    usuario.Free;
    Application.CreateForm(TFPrincipal, FPrincipal);
    Application.CreateForm(TFCierreventa, FCierreventa);
    Application.Run;
    
  end;
Application.Terminate;
pero si el showmodal no es mrOK, me da un error de 'Access violation at address...', y ademas la tabla de usuarios tiene un campo que indica si tienen permiso a todo o solo a ingreso de datos, como puedo manejar eso? Yo pensaba crear una variable global y asignarla pero ahora no se donde definirla, tomar su valor o asignarla.
Gracias
Fede
__________________
De lo que hay no falta nada!!!
Responder Con Cita
  #12  
Antiguo 05-06-2007
Avatar de sitrico
[sitrico] sitrico is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Caracas, Venezuela
Posts: 295
Poder: 21
sitrico Va por buen camino
Prueba con:

Código Delphi [-]
var
//  usuario:TFValidaUsr;  no lo necesitas
  mr : Integer;
begin

  Application.Initialize;
  Application.CreateForm(Tmodulodatos, modulodatos);

  With TFValidaUsr.create(nil) do
    Begin
    Try
        mr := showmodal; 
        // dentro de este formulario debes leer las variables/permisos que necesites,
        // Define las variables en Tmodulodatos  ej: modulodatos.NivelAcceso, modulodatos.IdUsuario
     Finally
        free;  
        End;
     End;

  if mr=mrOK then  
    begin
    Application.CreateForm(TFPrincipal, FPrincipal);
    Application.CreateForm(TFCierreventa, FCierreventa);
    Application.Run;
    
  end;
Application.Terminate;

Aunque te recomiendo que definas un registro y una variable en modulo datos:

Código Delphi [-]
Type tRegUsuario = record
  IdUsuario : integer;
  Nombre : ShortString;
  NivelAcceso : Byte;
  // lo que necesites
  End;

Var
Usuario = tRegUsuario;
__________________
Sitrico

Última edición por sitrico fecha: 05-06-2007 a las 00:07:16.
Responder Con Cita
  #13  
Antiguo 05-06-2007
Avatar de fedelphi
fedelphi fedelphi is offline
Miembro
 
Registrado: abr 2006
Ubicación: Santa Fe
Posts: 122
Poder: 19
fedelphi Va por buen camino
Asi es sitrico, lo he resuelto con un registro y el form de validacion lo largo en el oncreate del form principal de la sig manera:
Código Delphi [-]
procedure TFPrincipal.FormCreate(Sender: TObject);
var
  usuario:TFValidaUsr;
begin
  usuario:=TFValidaUsr.create(nil);
  if usuario.showmodal<>mrOK then
  begin
    usuario.Free;
    Application.Terminate;
  end;
end;

esta bien hacerlo de esta manera, que ventajas tiene hacerlo de la otra manera?
y para validar al usuario definí un procedure en la base firebird y quedo asi
Código Delphi [-]
with modulodatos.ibspvalidausr do
  begin
    parambyname('PELOGIN').asstring:=Elogin.Text;
    parambyname('PECLAVE').asstring:=EClave.text;
    execproc;
    if parambyname('PSVALIDADO').asstring='si' then
    begin
      ModalResult:=mrOK;
      FPrincipal.usuario_actual.login:=ELogin.text;
      FPrincipal.usuario_actual.id_usuario:=parambyname('PSID_USUARIO').AsInteger;
      FPrincipal.usuario_actual.administrador:=parambyname('PSPERMISO').asInteger;

    end
    else
    begin
      ModalResult:=mrCancel;
      showmessage('Usuario inválido');
    end;
end;
y al registro lo defino asi
Código Delphi [-]
current_usr=record
    login:string;
    administrador:integer;
    id_usuario:integer;
  end;
luego creo una instancia de este el la parte publica del form principal para accederlo desde cualquier form.
Es correcto hacerlo de esta manera, es la primera vez que hago una validación de usuarios y me gustaria escuchar alguna opinion. Gracias
Fede
__________________
De lo que hay no falta nada!!!
Responder Con Cita
  #14  
Antiguo 05-06-2007
Avatar de AzidRain
[AzidRain] AzidRain is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Córdoba, Veracruz, México
Posts: 2.914
Poder: 21
AzidRain Va camino a la fama
A mi me funciona esto de forma muy simple:
Pongo este código en el onshow de la ventana principal

Código Delphi [-]
  FLogin := TFLogin.Create(self,Datos.Conexion);
  Flogin.Execute;
  If Not FLogin.LoggedIn  Then Close
  Else
   PonLineaEstado;
FLogin es una ventanita de captura que pide usuario y contraseña, de paso en el mismo objeto guardo los datos de usuario,nivel, nombre, etc. esta ventana le digo al IDE que me la cree automáticamente y ahi la dejo para acceder a los datos del usuario logeado desde cualquier otro lado del programa. Es rudimentario pero me ha funcionado muy bien

Aqui el codigo integro de la unidad FLogin, aclaro que uso Zeos para hacer la conexion a BD MySQL

Código Delphi [-]
unit UFLogin;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, ExtCtrls, DB, ZAbstractRODataset, ZDataset,
  ZAbstractDataset, Konst, cxButtons, cxLookAndFeelPainters, Udatos,
  ZConnection;

type
  TFLogin = class(TForm)
    Panel1: TPanel;
    Label1: TLabel;
    ELogin: TEdit;
    EPassword: TEdit;
    Label2: TLabel;
    ZUsuarios: TZQuery;
    Image1: TImage;
    BotIngresar: TcxButton;
    constructor Create(owner:TComponent; con:TZConnection);
    procedure BotIngresarClick(Sender: TObject);
  private
    { Private declarations }
    procedure AceptaDatos;
    procedure ResetDatos;
  public
    { Public declarations }
    UsuarioActual  : String;
    NivelActual    : Integer;
    LoggedIn       : Boolean;
    SucursalActual : String;
    NombreActual   : String;
    UBicacionActual : String;
    tries:integer;

   procedure Execute;
 
  end;

var fLogin:TFLogin;
implementation

{$R *.dfm}

constructor TFLogin.Create(owner: TComponent; con: TZConnection);
begin
   inherited create(owner);
   LoggedIN    := FALSE;
   tries := 1;
   ZUsuarios.Connection := con; // le paso la conexion MySQL 
end;

procedure TFLogin.Execute;
var tries:Integer;
Begin

 If ZUsuarios.Connection.Connected Then // ZUsuarios es la tabla
 Begin
       ShowModal
 end
 else
  raise  Exception.Create('La conexión al servidor debe estar disponible');
end;


procedure TFLogin.BotIngresarClick(Sender: TObject);
begin
   If ZUsuarios.Active Then ZUsuarios.Close;
   ZUsuarios.ParamByName('LOGIN').AsString := ELogin.Text;
   ZUsuarios.ParamByName('PASSW').AsString := EPassword.Text;
   ZUsuarios.Open;
   If ZUsuarios.RecordCount> 0 Then
   Begin
     AceptaDatos;
     modalResult := mrOk;
     Close;
   end
   else
   Begin
      MessError('Usuario o Contraseña Incorrecta'); // Sustituir por ShowMessage o algun otro
     If tries=3 Then
     Begin
        modalResult := mrCancel;
        Close;
     end
     else
        ResetDatos;
   end;
end;

procedure TFLogin.AceptaDatos;
begin
   LoggedIN      := TRUE;
   UsuarioActual := ZUsuarios.FieldBYName('LOGIN').AsString;
   NivelActual   := ZUsuarios.FieldBYName('NIVEL').AsInteger;
   SucursalActual:= ZUsuarios.FieldBYName('SUCURSAL').AsString;
   NombreActual  := ZUsuarios.FieldBYName('NOMBRE').AsString;
end;

procedure TFLogin.ResetDatos;
begin
  Elogin.Clear;
  EpassWord.Clear;
  ELogin.SetFocus;
  Inc(tries);
end;

end.

Les repito que a mi me ha funcionado muy bien y obviamente le faltan toques de elegancia pero ahi se los dejo.

Para saber por ejemplo que usuario esta dentro del sistema en cualquier otro lado del programa, solo agrego la unidad al uses y accedo FLogin para conocerlo.
Te anexo el código y el form.
Archivos Adjuntos
Tipo de Archivo: zip UFLogin.zip (5,3 KB, 26 visitas)
__________________
AKA "El animalito" ||Cordobés a mucha honra||

Última edición por AzidRain fecha: 05-06-2007 a las 03:27:03.
Responder Con Cita
  #15  
Antiguo 05-06-2007
Avatar de fedelphi
fedelphi fedelphi is offline
Miembro
 
Registrado: abr 2006
Ubicación: Santa Fe
Posts: 122
Poder: 19
fedelphi Va por buen camino
Muchas gracias azidrain me viene muy bien esto ya que estoy aprendiendo, lo vere con mas detalle.
Fede
__________________
De lo que hay no falta nada!!!
Responder Con Cita
  #16  
Antiguo 06-06-2007
Avatar de sitrico
[sitrico] sitrico is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Caracas, Venezuela
Posts: 295
Poder: 21
sitrico Va por buen camino
fedelphi
Cita:
que ventajas tiene hacerlo de la otra manera?
En el primer caso (el mío) no se ve el form principal de la aplicación en el 2do (el tuyo), si se ve. Ventajas/Desventajas reales no encuentro.

Cita:
AzidRain
A mi me funciona esto de forma muy simple:
Pongo este código en el onshow de la ventana principal


FLogin := TFLogin.Create(self,Datos.Conexion);
Flogin.Execute;
If Not FLogin.LoggedIn Then Close
Else
PonLineaEstado;FLogin
¿ No liberas FLogin (Flogin.free.) ?

¿ cada vez que se ejecuta el onShow se crea un nuevo formulario ?

Creo que tienes fugas de recursos.
__________________
Sitrico
Responder Con Cita
  #17  
Antiguo 07-06-2007
Avatar de AzidRain
[AzidRain] AzidRain is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Córdoba, Veracruz, México
Posts: 2.914
Poder: 21
AzidRain Va camino a la fama
No señor, el flogin, se libera hasta que se cierra la aplicación.

Flogin es una ventana pequeña sin adornos solo tiene 2 edits y un boton, no creo que sean tantos recursos como para preocuparse.
__________________
AKA "El animalito" ||Cordobés a mucha honra||
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Validación de nif Acker Varios 4 20-06-2006 13:44:03
Validacion spaike Varios 2 19-04-2006 19:56:12
validacion halifax Tablas planas 7 06-02-2005 23:25:53
Validacion Carlex Conexión con bases de datos 1 08-09-2004 23:53:41
Validación C.I.F. Kafu Varios 2 23-05-2003 19:09:29


La franja horaria es GMT +2. Ahora son las 09:06:50.


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
Copyright 1996-2007 Club Delphi