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 12-11-2010
Avatar de elaguna
elaguna elaguna is offline
Miembro
 
Registrado: abr 2009
Ubicación: México
Posts: 51
Poder: 16
elaguna Va por buen camino
Unhappy Access violation al cerrar un formulario

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.

Última edición por elaguna fecha: 12-11-2010 a las 02:04:55. Razón: Error en las etiquetas para el estilo del código
Responder Con Cita
  #2  
Antiguo 12-11-2010
Avatar de ElKurgan
[ElKurgan] ElKurgan is offline
Miembro Premium
 
Registrado: nov 2005
Posts: 1.234
Poder: 20
ElKurgan Va camino a la fama
A mi me pasó algo parecido con Delphi 2005. Creo que el problema era que si no se metía bien la clave, no se ejecutaba nunca la sentencia "Application.run", y al cerrarse todo era el propio datamodule el que generaba la excepción.

Yo lo solucione poniendo algo así:

Código Delphi [-]
 
Application.CreateForm(TDataModule1, DataModule1);
  Application.CreateForm(Tfrm_main, frm_main);

  if Tfrm_login.Execute then
   begin
    Application.MessageBox('Bienvenido.', 'Bienvenido') ;
    Application.Run;
   end
   else
     DataModule1.Free;

Un saludo
Responder Con Cita
  #3  
Antiguo 12-11-2010
Avatar de elaguna
elaguna elaguna is offline
Miembro
 
Registrado: abr 2009
Ubicación: México
Posts: 51
Poder: 16
elaguna Va por buen camino
Muchas gracias ElKurgan.

Efectivamente era el Datamodule el que mandaba el error, solo que seguía mandando el error si se trata de liberar después de hacer la llamada al "Execute" dentro del programa principal.

Entonces hice el DataModule1.Free desde dentro de la clase Execute del formulario, para que antes del Free que va a terminar con la ejecución del formulario se libere el DataModule, quedando de la siguiente forma.

Código Delphi [-]
class function Tfrm_login.Execute: boolean;
 begin
   with Tfrm_login.Create(nil) do
   try
     w_intentos:=1;
     Result := ShowModal = mrOk;
   finally
     DataModule1.Free;
     Free;
   end;
 end;

Muchas gracias por tu ayuda, realmente fuiste una luz en un momento de oscura desesperación.

Saludos.
__________________
No lo intentes!. Hazlo o no lo hagas, pero no lo intentes !!! (Yoda)

Última edición por elaguna fecha: 12-11-2010 a las 19:40:36.
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
Access Violation al cerrar .exe mArTaLF Varios 3 16-10-2007 09:11:37
Cambiar propiedad de componente del formulario padre al cerrar el formulario hijo jzginez OOP 5 22-06-2007 21:40:51
Cerrar conexión al cerrar formulario arantzal Conexión con bases de datos 5 09-08-2006 12:43:52
Access Violation al cerrar ClientSocket auveele Internet 0 15-11-2004 00:39:53
Access violation Giasl Varios 6 07-05-2003 12:35:51


La franja horaria es GMT +2. Ahora son las 10:24:23.


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