Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   error con form de acceso al sistema (https://www.clubdelphi.com/foros/showthread.php?t=65894)

Kenobi 20-01-2010 16:49:04

error con form de acceso al sistema
 
Hola amigos ...tengo el siguiente problema

tengo un form para acceder al sistema ....
Código Delphi [-]
Application.Initialize;
  Application.MainFormOnTaskbar := True;
      Application.CreateForm(TDataAreas, DataAreas);


  frmLogin:=TFrmLogin.Create(Nil);
  if FrmLogin.ShowModal=mrYes then
   begin


   Application.CreateForm(TFrmPrincipal, FrmPrincipal);
..
..
..
..
.. // el resto de los formularios 
  Application.Run;

  end;

si ejecuto dicho codigo y no me logeo (modalresult distinto a mrok )sea por cerrar el form con el boton de cerrar me da el siguiente error .....

access violation on address xxxx in module xxxx Read of address xxxxx

si coloco la siguiente linea
Código Delphi [-]
Application.CreateForm(TDataAreas, DataAreas);
dentro del
if FrmLogin.ShowModal=mrYes then todo funciona bien... sin embargo quiero llamar antes del form de acceso a dicho form DataAreas porque el el modulo de datos y lo necesito activo para consultar el usuario....

espero que me puedan ayudar ....

Gracias ....

delphi.com.ar 20-01-2010 17:10:19

una preguntita... ¿Quién destruye a frmLogin?

Lo que haces es mas que habitual, solo que se hace muy difícil de leer por la identación que has usado, y sinceramente se me ha complicado mucho entenderte. El error no está en el código que estas mostrando, pero tienes que tener claras un par de premisas, si el formulario de login, va a acceder a datos mediante "DataAreas", es evidente que este debe ser creado previamente a que uses su referencia.
Para encontrar el error prueba liberar todo "a mano" para identificar que objeto falla al ser destruído.

Saludos!

rgstuamigo 20-01-2010 17:25:51

A simple vista, creo que el error te da es por que ¿que pasa si la funcion
FrmLogin.ShowModal devuelve otro valor distinto a mrYes?:confused::eek:;),
es decir el usuario presiona(Supongo)otro boton, por ejemplo el
boton cancelar.;).(OJO Viendo tu codigo eso implica que los otros
formularios no se estan creando o instanciando).;)
Creo que en ese caso deberias tener un else para finalizar(supongo)
la aplicacion.;).
Saludos...
:)

Kenobi 20-01-2010 20:15:39

Hola
 
Ahora si funciono
Código Delphi [-]
program SisAreas;

uses
  Forms, Controls,
  F_Principal in 'Principal\F_Principal.pas' {FrmPrincipal},
  F_DataAreas in 'DatosAreas\F_DataAreas.pas' {DataAreas: TDataModule},
 ..
..
..
..
..
..
..
{$R *.res}

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TDataAreas, DataAreas);
  frmLogin:=TFrmLogin.Create(Nil);
  if FrmLogin.ShowModal=mrYes then
   begin
    Application.CreateForm(TFrmPrincipal, FrmPrincipal);
    Application.CreateForm(TFrmMobiliario, FrmMobiliario);
    Application.CreateForm(TFrmAreas, FrmAreas);
    Application.CreateForm(TFrmAsignaturas, FrmAsignaturas);
    Application.CreateForm(TFrmMotivos, FrmMotivos);
    Application.CreateForm(TFrmUsuarios, FrmUsuarios);
    Application.CreateForm(TFrmAsignarAreas, FrmAsignarAreas);
    Application.CreateForm(TFrmCalendario, FrmCalendario);
    Application.CreateForm(TPlantilla, Plantilla);
    Application.CreateForm(TFrmBuscador, FrmBuscador);
    Application.CreateForm(TFrmSolicitudArea, FrmSolicitudArea);
    Application.CreateForm(TFrmSolicitudAreaStatus, FrmSolicitudAreaStatus);
    Application.Run;
  end
  else  DataAreas.Destroy;
end.

sin duda el DataModulo llamado DataAreas debe ser destruido explicitamente porque incluso intente en la penultima linea

Código Delphi [-]
 else  application.terminate;

y no funciona para nada pero con Destroy si que si


Gracias a todos ....

P.D: ya lo idente mejor, perdon por el desorden anterior ....

rgstuamigo 20-01-2010 20:29:11

Un consejo
 
En todo caso, lo mas estandar y recomendable para destruir un objeto y liberar memoria en Delphi es usando el metodo Free,este metodo llama internamente al destructor (Destroy) del objeto;ya que si llamamos el destructor directamente, en algunos casos(no siempre) podria ocurrir una Excepcion si nuestro objeto ya fue liberado anteriormente o no fue instanciado(no se reservo memoria),etc,por eso es recomendable destruir un objeto con Free, evitando tales situaciones.;)

Siguiendo tu codigo seria asi:
Código Delphi [-]
...
else DataAreas.Free;//<<----;)
Saludos...:)

delphi.com.ar 20-01-2010 20:59:09

Cita:

Empezado por Kenobi (Mensaje 351303)
sin duda el DataModulo llamado DataAreas debe ser destruido explicitamente porque incluso intente en la penultima linea

Si lo creas como lo hiciste en el código, no tendrías que encargarte de destruírlo, ya que al utilizar Application.CreateForm el DataModule tiene como Owner el objeto Application, y cuando se destruye Application (al ejecutar el finalization de la unit Forms) destruiría el DataModule.
Recuerda que en tu código frmLogin queda en memoria hasta que se termine el proceso por completo.

Saludos!

ElKurgan 21-01-2010 07:24:30

Sin embargo, a mi me ha pasado como a Kenobi. Si no libero el data module me lanza la excepción. No se si tendrá que ver con que se cree antes el modulo de datos (para acceso a la cuenta de usuarios) que el formulario principal, que trata el ciclo de mensajes de windows, o se trata de un bug de Delphi. Programo con Delphi 2005, y lo solucioné como dice Kenobi, con un "else" y un DataModule.Free.

Saludos


La franja horaria es GMT +2. Ahora son las 17:54:55.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi