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
procedure AceptaDatos;
procedure ResetDatos;
public
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; end;
procedure TFLogin.Execute;
var tries:Integer;
Begin
If ZUsuarios.Connection.Connected Then 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'); 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.