A ver amigo, lo que tu pides da para un poco de hilos, de todas formas voy a tratar de ayudarte, tu dices:
En el Inicio del Programa, si cierro esta ventana, en la X, el programa se bloquea, como hago que al tomar esta opción se cierre por completo la aplicación.
Para solucionar esta parte sigue esta guía:
En el Form_Login haz los siguientes cambios:
1. Elimina el ADLogin. mas adelante te explico porqué.
2. Al BtnOk cámbiale su propiedad ModalResult a mrNone.
3. Quita los eventos OnClick de los botones btnOk y btnCancel.
4. Copia y remplaza el código de la unit CONTROL_ACCESO como lo pongo enseguida, después asigna el evento OnClick al btnOk para que coincida con el nuevo código.
5. Cambia la propiedad visible del Form a False.
unit CONTROL_ACCESO;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, jpeg, ExtCtrls, StdCtrls, Buttons;
type
TForm_Login = class(TForm)
Label2: TLabel;
EUsuario: TEdit;
EClave: TEdit;
BtnOk: TBitBtn;
BtnCancel: TBitBtn;
Label1: TLabel;
Image2: TImage;
Image1: TImage;
procedure BtnOkClick(Sender: TObject);
private
{ Private declarations }
public
class function Execute: Boolean;
end;
implementation
Uses UData;
{$R *.dfm}
procedure TForm_Login.BtnOkClick(Sender: TObject);
begin
if DataModule1.UsuarioValido(EUsuario.Text, EClave.Text) then
ModalResult := mrOK
else
ShowMessage('Sus datos son incorrectos.')
end;
class function TForm_Login.Execute: Boolean;
begin
with TForm_Login.Create(nil) do
try
Result := ShowModal = mrOK;
finally
Free;
end;
end;
end.
Notarás que he agregado una función de clase que se encarga de gestionar el control de acceso, he eliminado la variable CUENTA pues no le encuentro sentido contar los intentos si de todas formas al cerrar el form puede intentarlo cuantas veces quiera, la variable Nombre la he pasado al DataModule1, como veremos más adelante. El btnOk pasa los parámetros a la función UsuarioValido que está en DataModule1.
En DataModule1 haz lo siguiente:
1. Agrega un AdoQuery y ponle el nombre qLogin y en su propiedad SLQ ponle:
SELECT NOMBRE, CLAVE FROM TITAN_USUAR WHERE (NOMBRE = :NOM) AND (CLAVE = :CLAV)
2. Crea los campos persistentes en QLogin, haciendo doble click sobre el componente y dale agregar todos los campos.
3. Copia y remplaza el código de UData con el código que te pongo en seguida, y haz que coincidan los eventos DataModuleCreate y DataModule Destroy con el nuevo código.
unit UData;
interface
uses
SysUtils, Classes, DB, ADODB, IniFiles,Forms, Dialogs;
type
TDataModule1 = class(TDataModule)
ADOConnection1: TADOConnection;
qLogin: TADOQuery;
qLoginNombre: TWideStringField;
qLoginClave: TWideStringField;
procedure DataModuleCreate(Sender: TObject);
procedure DataModuleDestroy(Sender: TObject);
private
{ Private declarations }
public
function UsuarioValido(ANombre, AClave: string): Boolean;
{ Public declarations }
end;
var
DataModule1: TDataModule1;
NombreGlobal: String;
implementation
{$R *.dfm}
procedure TDataModule1.DataModuleCreate(Sender: TObject);
var
BaseDeDatos, ConStr: String;
IniFile: TIniFile;
begin
// Obtiene la ruta y el nombre de la base de datos
IniFile := TIniFile.Create(ExtractFilePath(Application.ExeName) + 'BD.ini');
try
BaseDeDatos := IniFile.ReadString('BD', 'Path', '');
If BaseDeDatos = '' then
raise Exception.Create('Error al cargar Base de Datos');
ConStr := 'Provider=Microsoft.Jet.OLEDB.4.0;' + 'Data Source=' +
BaseDeDatos + ';' + 'Persist Security Info=False;' +
'Jet OLEDB:Database Password=Admin';
ADOConnection1.ConnectionString := ConStr;
ADOConnection1.Open;
finally
IniFile.Free
end;
end;
procedure TDataModule1.DataModuleDestroy(Sender: TObject);
begin
ADOConnection1.Close;
end;
function TDataModule1.UsuarioValido(ANombre, AClave: string): Boolean;
begin
Result := False;
qLogin.Close;
qLogin.Parameters[0].Value := ANombre;
qLogin.Parameters[1].Value := AClave;
try
qLogin.Open;
Result := not qLogin.IsEmpty;
if Result then
NombreGlobal := qLoginNombre.AsString;
finally
qLogin.Close;
end;
end;
end.
Notarás que he agregado la función UsuarioValido que recibe los parámetros de nombre y clave de usuario, abre el query y devuelve True si el usuario existe, si es así entonces guarda el nombre del usuario en la variable NombreGlobal que posteriormente puedes usar desde cualquier parte de tu programa, por ejemplo pasar ese nombre al statusbar del form principal.
Finalmente los cambios son en el DPR de la aplicación, haz click en Procject > ViewSource y remplaza el código con el siguiente:
program TITAN;
uses
Forms,
UData in '..\ICONOS\UData.pas' { DataModule1: TDataModule } ,
TITAN_MAIN in 'TITAN_MAIN.pas' { Form_Menu } ,
CONTROL_ACCESO in 'CONTROL_ACCESO.pas' { Form_Login } ,
F_MATERIALES in 'F_MATERIALES.pas' { Form_FMateriales } ,
F_EQUIPOS in 'F_EQUIPOS.pas' { Form_FEquipos } ,
F_MANO in 'F_MANO.pas' { Form_FMano } ,
F_UMEDIDAS in 'F_UMEDIDAS.pas' { Form_Unidades } ,
M_MATERIALES in 'M_MATERIALES.pas' { Form_Materiales } ,
M_EQUIPOS in 'M_EQUIPOS.pas' { Form_Equipos } ,
M_MANO in 'M_MANO.pas' { Form_ManoObra } ,
M_PROVEEDORES in 'M_PROVEEDORES.pas' { Form_MProveedores } ,
M_USUARIOS in 'M_USUARIOS.pas' { Form_Usuarios } ,
T_EQUIPOS in 'T_EQUIPOS.pas' { Form_Tequipos } ,
M_PARTIDAS in 'M_PARTIDAS.pas' { Form_Partidas } ;
{$R *.res}
begin
Application.Title := 'TITAN';
Application.CreateForm(TDataModule1, DataModule1);
if TForm_Login.Execute then
begin
Application.Initialize;
Application.CreateForm(TForm_Menu, Form_Menu);
Application.Run;
end
else
begin
DataModule1.Destroy;
Application.Terminate;
end;
end.
Notarás que el MainForm solo se crea y la aplicación arranca si la función execute del FormLogin devuelve true, de lo contrario, destruimos el datamodule1 y terminamos la aplicación.
Bueno amigo con esto tienes un acceso limpio a tu aplicación, yo lo probé y funciona bien, con tus otras necesidades te puedo colaborar en cuanto tenga un tiempo.
Te adjunto el FormLogin y el Datamodule modificados, los hice en Delphi 2010 y te podrían dar algún problema menor, por ese motivo copié el código en este post.
Saludos
PD : Después de hacer estos cambios el programa arrancará normalmente, pero si intentas abrir los otros forms te dará un access Violation porque lo que estabas haciendo es incorrecto, esto se subsana así: Por ejemplo para crear el Form Partidas desde el MainForm:
procedure TForm_Menu.partidas1Click(Sender: TObject);
begin
with TForm_Partidas.Create(Application) do
Show;
end;
Y luego en el evento OnClose del Form Partidas para liberarlo colocamos lo siguiente:
procedure TForm_Partidas.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;
Hay que hacer lo mismo con los otros forms.