Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 01-06-2012
steelha steelha is offline
Miembro
 
Registrado: mar 2012
Posts: 158
Poder: 13
steelha Va por buen camino
Problema al cerrar ventana de login

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:

Código Delphi [-]
 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

Código Delphi [-]
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
Responder Con Cita
  #2  
Antiguo 01-06-2012
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
Hola...

¿Ya trataste de hacer un seguimiento del código usando puntos de roptura (Break Points) y la tecla F7?

Otro detalle que veo es que declaras muchas de las variables que usas dentro del constructor como campos públicos de la clase TfrmLogin y solo se usan dentro de este. Deberías declararlas dentro del constructor.


Saludos...
__________________
Lee la Guía de Estilo antes que cualquier cosa. - Twitter
Responder Con Cita
  #3  
Antiguo 01-06-2012
steelha steelha is offline
Miembro
 
Registrado: mar 2012
Posts: 158
Poder: 13
steelha Va por buen camino
Muchas gracias por tu observacion es que soy poco novato .... verificare esto y luego publico que ha pasado
Responder Con Cita
  #4  
Antiguo 01-06-2012
steelha steelha is offline
Miembro
 
Registrado: mar 2012
Posts: 158
Poder: 13
steelha Va por buen camino
Te explico justamente aca es donde da el error en el form de login:
Código Delphi [-]
  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;

Sobre las variables publicas, es que luego de cerrar el login que solo tiene una conexion a la db para la desconectare y el form principal creara otra nueva conexion en base a estos datos ya recolectados. pero si dices que esta mal esta mal buscare otra forma
Responder Con Cita
  #5  
Antiguo 01-06-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Prueba poniendo Close en lugar de frmLogin.Close.

// Saludos
Responder Con Cita
  #6  
Antiguo 01-06-2012
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
Hola...

No puedes hacer referencia a una variable del tipo de una clase (en este caso frmLogin) dentro del código del constructor o en tu caso en el código del evento FormCreate. Esto es por que no siempre hay seguridad de que esa variable ya esté referenciada. Si necesitas llamar a un metodo de la clase, usa solo el nombre del método o usa la refencia a Self.

Ahora, dentro del constructor de una clase que desciende de TForm o el evento FormCreate no se debe usar el método Close, ya se que para empezar el objecto aun se está creando y no se ha mostrado. En tu caso elimina la llamada a frmLogin.Close.

Código Delphi [-]
If qryUsuario.RecordCount < 1 then
  begin
    ShowMessage('Usuario ó Clave erronea, intente de nuevo');
    edUsuario.SetFocus;
  end
  //else <-- eliminar
  //  frmLogin.Close; <-- eliminar

Saludos...
__________________
Lee la Guía de Estilo antes que cualquier cosa. - Twitter
Responder Con Cita
  #7  
Antiguo 01-06-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por maeyanes Ver Mensaje
Ahora, dentro del constructor de una clase que desciende de TForm o el evento FormCreate no se debe usar el método Close, ya se que para empezar el objecto aun se está creando y no se ha mostrado. En tu caso elimina la llamada a frmLogin.Close.
Mmm. No creo que ese código último que puso esté en el constructor.

// Saludos
Responder Con Cita
  #8  
Antiguo 01-06-2012
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
Hola...

roman, si me di cuenta, es por eso que edité mi mensaje. Aun estándo el código dentro del evento FormCreate, el formulario aun no se ha mostrado por lo que llamar al método Close no tiene ningún efecto (no recuerdo si produce alguna excepción).


Saludos...
__________________
Lee la Guía de Estilo antes que cualquier cosa. - Twitter
Responder Con Cita
  #9  
Antiguo 01-06-2012
steelha steelha is offline
Miembro
 
Registrado: mar 2012
Posts: 158
Poder: 13
steelha Va por buen camino
ps... parece que maeyane tenia razon gracias y tanto que pase por esa linea parece que la copie de otro lugar :P ... pero simplemente cierra y la ventana principal no se presenta... pero lo importante es que ya no me da el error
Responder Con Cita
  #10  
Antiguo 01-06-2012
luisgutierrezb luisgutierrezb is offline
Miembro
 
Registrado: oct 2005
Ubicación: México
Posts: 925
Poder: 19
luisgutierrezb Va por buen camino
nada mas para complementar la razón, en tu unidad, la forma se llama frmlogin, pero al crearla desde el programa principal le llamas LoginForm, entonces al darle frmlogin.close, te manda al error porque no existe frmLogin, sino LoginForm, como te dijeron arriba, usa el close solamente, debe funcionar bien puesto que ese código esta en un botón...
Responder Con Cita
  #11  
Antiguo 01-06-2012
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
Hola...

Vaya, me acabo de dar cuenta de que el código en cuestión está dentro del evento OnClick de un botón y no en el código del FormCreate. Como bien indica roman y parte de lo que le comenté arriba, con solo usar Close o Self.Close se solucionaba el problema.

Eso me pasa por no fijarme bien en el código. Tienes razón roman, el código no es parte del evento FormCreate y por consiguiente, en este caso, lo que comenté al respecto no afecta.


Saludos...
__________________
Lee la Guía de Estilo antes que cualquier cosa. - Twitter
Responder Con Cita
  #12  
Antiguo 01-06-2012
steelha steelha is offline
Miembro
 
Registrado: mar 2012
Posts: 158
Poder: 13
steelha Va por buen camino
Muchas gracias por los comentarios me ayudaron. Pero como soluciono el problema de desplegar la ventana del form principal ya que al hacer close se cierra todo y no se ejecuta la aplicacion ... por lo cual aun no entiendo esta parte :

Código Delphi [-]
program prIglesia;

uses
  Forms,
  Windows,
  uPrincipal in 'uPrincipal.pas' {frmprincipal},
  ufrmlogin in 'ufrmlogin.pas' {frmLogin};

var
  loginform, pprincipal : TForm;

{$R *.res}

begin
  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;
end.

se supone deberia abrir la form principal despues de logeada, pero no sucede eso simplemente se cierrar toda la aplicacion
Responder Con Cita
  #13  
Antiguo 01-06-2012
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
Hola...

No estoy muy seguro y no tengo forma de comprobarlo ahora, pero el problema puede ser la forma en como comparas el resultado de ShowModal. Prueba con:

Código Delphi [-]
if LoginForm.ShowModal = mrOk then


Saludos...
__________________
Lee la Guía de Estilo antes que cualquier cosa. - Twitter
Responder Con Cita
  #14  
Antiguo 01-06-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por steelha Ver Mensaje
se supone deberia abrir la form principal despues de logeada, pero no sucede eso simplemente se cierrar toda la aplicacion
Posiblemente la condición

Código Delphi [-]
 if LoginForm.ShowModal = ID_OK then

no se cumple y si eso es así es porque no estás poniendo ModalResult = mrOk en ningún lado. Usualmente esto se hace poniendo la correspondiente propiedad en el botón de Aceptar del LoginForm.

// Saludos
Responder Con Cita
  #15  
Antiguo 01-06-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

Estaba mirando el código y el origen de la excepción es que en el proyecto, steela hace la creación sobre la variable LoginForm:
Código Delphi [-]
begin
  Application.Initialize;
  LoginForm := TfrmLogin.Create(Application);
  ...

Pero luego, y dentro de él libera a frmLogin:
Código Delphi [-]
   ...
   else
     frmLogin.Close;
Y como no existe una instancia de frmLogin de allí la excepción. Confusión esta que queda solapada si se llama directamente al método Close o a Self.Close ya que de ese modo se libera a la instancia correcta.

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #16  
Antiguo 01-06-2012
steelha steelha is offline
Miembro
 
Registrado: mar 2012
Posts: 158
Poder: 13
steelha Va por buen camino
ok probare en unos minutos aca hay mucho trabajo hoy
y debo entregar esta aplicacion en 3 horas a mas tarda T_T espero terminar a tiempo gracias por la ayuda
Responder Con Cita
  #17  
Antiguo 01-06-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Creo que esto es lo que observó luisgutierrezb en el mensaje #10.

// Saludos
Responder Con Cita
  #18  
Antiguo 01-06-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
Empezado por roman Ver Mensaje
Creo que esto es lo que observó luisgutierrezb en el mensaje #10.

// Saludos
Tenes razón, no ví el mensaje o no le presté atención... mis disculpas Luis


Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #19  
Antiguo 01-06-2012
steelha steelha is offline
Miembro
 
Registrado: mar 2012
Posts: 158
Poder: 13
steelha Va por buen camino
Probe con colocar segun opiniones lo siguiente
Código Delphi [-]
 if LoginForm.ShowModal = mrOk
pero consigo el siguiente mensaje
[Error] prIglesia.dpr(18): Undeclared identifier: 'mrOk'

Me imagino que es una variable la cual debo declarar pero:
1.- que tipo de variable debe ser
2.- que como desde el form de login le paso un valor x si se da la coincidencia de usuario
(si lo se como que pregunto mucho)

Gracias por su ayuda
Saludos :P
Responder Con Cita
  #20  
Antiguo 01-06-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola steela.

Cita:
pero consigo el siguiente mensaje
[Error] prIglesia.dpr(18): Undeclared identifier: 'mrOk'
Tenes que incluir la unidad Controls.
Código Delphi [-]
uses ..., Controls;

Y lo que te comentó roman es que cuando la contraseña sea correcta hagas:
Código Delphi [-]
  ModalResult:= mrOk;
Edito: (No sé si te referías a eso en tu última pregunta).

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 01-06-2012 a las 23:16:43.
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
Ventana de Login al correr un programa Yasnet MySQL 12 16-11-2008 20:30:00
como crear una ventana de login wadhis Conexión con bases de datos 1 27-08-2008 09:47:26
Ayuda Con Ventana Para Login!!! jugomez MS SQL Server 5 23-10-2006 17:22:29
Problema al cerrar ventana de impresion salvanano Impresión 4 04-06-2005 20:21:20
Problema al cerrar una ventana noModal. Perenquen OOP 2 04-11-2004 14:35:43


La franja horaria es GMT +2. Ahora son las 21:15:36.


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