Qué tal foro, espero que este sea el sitio en donde colocar este hilo.
Sé que éste tema ya ha sido bastante contestado, pero realmente no se que es lo que ha ocurrido con mi formulario.
Estoy creando una aplicación y como en otros estoy poniendo un formulario de Login, lo estoy haciendo del siguiente modo:
En el programa principal
Código:
program Orcode;
uses
Forms,
main in 'main.pas' {frm_main},
fLogin in 'fLogin.pas' {frm_login},
fDataModule in 'fDataModule.pas' {DataModule1: TDataModule},
fEntidad in 'fEntidad.pas' {frm_entidad};
{$R *.res}
var
w_user, w_passwd : String;
begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TDataModule1, DataModule1);
Application.CreateForm(Tfrm_main, frm_main);
if Tfrm_login.Execute then
begin
Application.MessageBox('Bienvenido.', 'Bienvenido') ;
Application.Run;
end;
end.
En el formulario frm_login agregué la función "Execute"
Código:
unit fLogin;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, AdvSmoothLabel, AdvSmoothButton, StdCtrls, ZConnection, main, fDataModule;
type
Tfrm_login = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
sBtn_Aceptar: TAdvSmoothButton;
AdvSmoothLabel1: TAdvSmoothLabel;
AdvSmoothLabel2: TAdvSmoothLabel;
ZConnection1: TZConnection;
procedure sBtn_AceptarClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations}
class function Execute : boolean;
end;
var
frm_login: Tfrm_login;
implementation
{$R *.dfm}
var
w_intentos: Integer;
class function Tfrm_login.Execute: boolean;
begin
with Tfrm_login.Create(nil) do
try
w_intentos:=1;
Result := ShowModal = mrOk;
finally
Free;
end;
end;
Con lo anterior se crea y muestra el formulario en forma correcta.
Para el botón Aceptar pongo lo siguiente, me parece que aquí no está el problema, porque funciona correctamente y para el problema que me aqueja ni siquiera lo utilizo. Pero lo pongo por si a alguien le sirve parte del código, a mí me funcionó bastante bien.
Me estoy conectando a un servidor Postgres con los componentes Zeos
Código:
procedure Tfrm_login.sBtn_AceptarClick(Sender: TObject);
begin
try // Verifica que haya conexión con la base de datos usando un usuario válido
zConnection1.User := 'postgres';
zConnection1.Password := 'postgres';
zConnection1.Connected := True;
zConnection1.Connected := False;
try // Si hay conexión con el servidor entonces ahora se intenta la conexión con los datos del usuario
zConnection1.User := Edit1.Text;
zConnection1.Password := Edit2.Text;
zConnection1.Connected := True;
zConnection1.Connected := False;
frm_main.w_user := Edit1.Text; // Se envía el nombre del usuario válido a la variable del formulario principal
frm_main.w_passwd := Edit2.Text; // Se envía la contraseña del usuario válido a la variable del formulario principal
ModalResult := mrOK;
except
on E: Exception do
begin
Application.MessageBox(PChar('Nombre de usuario o contraseña incorrectos. Verifique sus datos.'+#13+ 'Le quedan '+IntToStr(3-w_intentos)+' intentos.'),'Usuario inválido', MB_OK+MB_ICONINFORMATION);
if w_intentos<3 then
begin
w_intentos := w_intentos +1;
Edit1.SetFocus // Se coloca en el primer control para volver a escribir el nombre de usuario
end
else
ModalResult := mrAbort;
end;
end;
except
on E: Exception do
begin
{WriteLn(E.Message);}
Application.MessageBox('No hay conexión con la base de datos. Verifique la conexión con el servidor y que la base de datos esté correctamente configurada','Base de datos no disponible',MB_OK+MB_ICONERROR);
ModalResult := mrAbort
end;
end;
end;
end.
Ahora mi problema es que el formulario funcionaba perfectamente hasta hace unas horas, no le había cambiado nada, es más ya ni estaba trabajando en él. Pero si doy click en el botón de Cerrar del formulario (la X de la esquina) o ingresan 3 veces un usuario inválido me manda un error de "Access violation at address ..."
Pero eso no lo hacía antes, comento, hace ya un rato que no le modificaba nada.
Al ir siguiendo al depurador, el error ocurre al llegar al "Free" de la clase "Execute". Y al ir siguiendo el free, el error lo manda algo dentro de Zeos, pero eso no lo hacía.
Espero haberme explicado. Ya le di muchas vueltas y no hallo nada que hubiese modificado.
Gracias de antemano a todos.