steelha
01-06-2012, 20:01:31
Buenas tardes, tenia la necesidad de hacer un login que abriese primero que la ventana principal. Vi unos ejemplos de caral y trate de implementarlo pero el problema viene cuando encuentro al usuario y debe presentarse la ventana principal obtengo el siguiente error y no he podido solucionarlo. Por favor necesito de su ayuda:
Application.Initialize;
LoginForm := TfrmLogin.Create(Application);
if LoginForm.ShowModal = ID_OK then
begin
LoginForm.Free; // o LoginForm.Hide
Application.CreateForm(Tfrmprincipal, frmprincipal);
end;
Application.Run;
Este es el error justamente en la linea del if loginform:
Project prIglesia.exe raised exception class EAccessViolation with message 'Access violation at address 0045C04D in module 'prIglesia.exe'. Read of address 000002F4'. Process stopped. Use step or Run to continue.
Acontunuacion coloco el codigo del login form:
unit ufrmlogin;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, jpeg, ExtCtrls, RzForms, StdCtrls, IniFiles, DB, ADODB;
type
TfrmLogin = class(TForm)
RzFormShape1: TRzFormShape;
Label1: TLabel;
Label2: TLabel;
edUsuario: TEdit;
edClave: TEdit;
btEntrar: TButton;
btCerrar: TButton;
ADOConnection: TADOConnection;
qryUsuario: TADOQuery;
procedure btCerrarClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure btEntrarClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
ini : TIniFile;
provider : string;
source : string;
security : string;
password : string;
jet : string;
rutadb : string;
rutapr : string;
user : string;
fechalg : string;
cadenacn : string;
end;
var
frmLogin: TfrmLogin;
implementation
{$R *.dfm}
procedure TfrmLogin.btCerrarClick(Sender: TObject);
begin
Application.Terminate;
end;
procedure TfrmLogin.FormCreate(Sender: TObject);
begin
provider:= '';
source := '';
security:= '';
password:= '';
jet := '';
rutadb := '';
user := '';
fechalg := '';
cadenacn:= '';
//Obtener Ruta donde se ejecuta la aplicacion
rutapr := ExtractFilePath(Application.ExeName);
//Verificar que exista el archivo de configuracion
If not FileExists('Iglesia.ini') then
Begin
ShowMessage('Error en la aplicación, no existe componente principal de configuracion');
Application.Terminate;
end;
//Crear o Abrir Archivo INI
ini := TIniFile.Create(rutapr+'Iglesia.ini');
//Leer Archivo INI
provider:= ini.ReadString('DB','provider','');
source := ini.ReadString('DB','source','');
security:= ini.ReadString('DB','security','');
password:= ini.ReadString('DB','password','');
jet := ini.ReadString('DB','jet','');
rutadb := ini.ReadString('DB','ruta','');
user := ini.ReadString('LOGIN','user','');
fechalg := ini.ReadString('LOGIN','fecha','');
edUsuario.Text := user;
//redireccionar la direccion de la DB
source := Trim(rutapr) + 'Data\' + Trim(source);
//Liberar recurso INI
FreeAndNil(ini);
//Conectar a DB con los datos obtenidos desde el ini
cadenacn:= 'Provider=Microsoft.Jet.OLEDB.4.0;'+
'Password='+password+';'+
'Data Source='+source+';'+
'Persist Security Info=False';
ADOConnection.Connected := False;
ADOConnection.ConnectionString := cadenacn;
ADOConnection.Connected := True;
end;
procedure TfrmLogin.btEntrarClick(Sender: TObject);
begin
qryUsuario.Close;
qryUsuario.SQL.Text := 'SELECT * FROM tblusuarios Where userid='+QuotedStr(Trim(edUsuario.Text))+' AND password='+QuotedStr(Trim(edClave.Text));
qryUsuario.Open;
If qryUsuario.RecordCount < 1 then
begin
ShowMessage('Usuario ó Clave erronea, intente de nuevo');
edUsuario.SetFocus;
end
else
frmLogin.Close;
end;
end.
Muchas gracias por cualquier ayuda
Application.Initialize;
LoginForm := TfrmLogin.Create(Application);
if LoginForm.ShowModal = ID_OK then
begin
LoginForm.Free; // o LoginForm.Hide
Application.CreateForm(Tfrmprincipal, frmprincipal);
end;
Application.Run;
Este es el error justamente en la linea del if loginform:
Project prIglesia.exe raised exception class EAccessViolation with message 'Access violation at address 0045C04D in module 'prIglesia.exe'. Read of address 000002F4'. Process stopped. Use step or Run to continue.
Acontunuacion coloco el codigo del login form:
unit ufrmlogin;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, jpeg, ExtCtrls, RzForms, StdCtrls, IniFiles, DB, ADODB;
type
TfrmLogin = class(TForm)
RzFormShape1: TRzFormShape;
Label1: TLabel;
Label2: TLabel;
edUsuario: TEdit;
edClave: TEdit;
btEntrar: TButton;
btCerrar: TButton;
ADOConnection: TADOConnection;
qryUsuario: TADOQuery;
procedure btCerrarClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure btEntrarClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
ini : TIniFile;
provider : string;
source : string;
security : string;
password : string;
jet : string;
rutadb : string;
rutapr : string;
user : string;
fechalg : string;
cadenacn : string;
end;
var
frmLogin: TfrmLogin;
implementation
{$R *.dfm}
procedure TfrmLogin.btCerrarClick(Sender: TObject);
begin
Application.Terminate;
end;
procedure TfrmLogin.FormCreate(Sender: TObject);
begin
provider:= '';
source := '';
security:= '';
password:= '';
jet := '';
rutadb := '';
user := '';
fechalg := '';
cadenacn:= '';
//Obtener Ruta donde se ejecuta la aplicacion
rutapr := ExtractFilePath(Application.ExeName);
//Verificar que exista el archivo de configuracion
If not FileExists('Iglesia.ini') then
Begin
ShowMessage('Error en la aplicación, no existe componente principal de configuracion');
Application.Terminate;
end;
//Crear o Abrir Archivo INI
ini := TIniFile.Create(rutapr+'Iglesia.ini');
//Leer Archivo INI
provider:= ini.ReadString('DB','provider','');
source := ini.ReadString('DB','source','');
security:= ini.ReadString('DB','security','');
password:= ini.ReadString('DB','password','');
jet := ini.ReadString('DB','jet','');
rutadb := ini.ReadString('DB','ruta','');
user := ini.ReadString('LOGIN','user','');
fechalg := ini.ReadString('LOGIN','fecha','');
edUsuario.Text := user;
//redireccionar la direccion de la DB
source := Trim(rutapr) + 'Data\' + Trim(source);
//Liberar recurso INI
FreeAndNil(ini);
//Conectar a DB con los datos obtenidos desde el ini
cadenacn:= 'Provider=Microsoft.Jet.OLEDB.4.0;'+
'Password='+password+';'+
'Data Source='+source+';'+
'Persist Security Info=False';
ADOConnection.Connected := False;
ADOConnection.ConnectionString := cadenacn;
ADOConnection.Connected := True;
end;
procedure TfrmLogin.btEntrarClick(Sender: TObject);
begin
qryUsuario.Close;
qryUsuario.SQL.Text := 'SELECT * FROM tblusuarios Where userid='+QuotedStr(Trim(edUsuario.Text))+' AND password='+QuotedStr(Trim(edClave.Text));
qryUsuario.Open;
If qryUsuario.RecordCount < 1 then
begin
ShowMessage('Usuario ó Clave erronea, intente de nuevo');
edUsuario.SetFocus;
end
else
frmLogin.Close;
end;
end.
Muchas gracias por cualquier ayuda