Cita:
Empezado por vtdeleon
o me equivoco???:-s
|
No te equivocas. Supongo que cuando
jachguate dijo:
Cita:
Empezado por jachguate
El caso es que delphi toma el primer formulario creado como formulario principal de la aplicación
|
realmente quería decir:
Cita:
El caso es que delphi toma el primer formulario creado con Application.CreateForm como formulario principal de la aplicación
|
El punto es, que si no usas Application.CreateForm, entonces apenas cierres el cuadro modal terminará la aplicación. En tu ejemplo usas Application.CreateForm luego de cerrar la ventana de acceso y entonces frmprincipal será el formulario principal y la aplicación terminará en cuanto se cierre.
He buscado un hilo donde se hablaba de esto pero no lo encuentro así que repito.
Puede crearse una aplicación con dos formularios, ninguno de los cuales sea el principal y sin que la aplicación se cierre al cerrar uno de ellos. Para ello, alteren el archivo dpr de manera que se vea así:
Código Delphi
[-]
program Project1;
uses
Forms,
Unit1 in 'Unit1.pas' ,
Unit2 in 'Unit2.pas' ;
{$R *.res}
begin
Application.Initialize;
Form1 := TForm1.Create(Application);
Form2 := TForm2.Create(Application);
repeat
try
Application.HandleMessage;
except
Application.HandleException(Application);
end;
until Application.Terminated;
end.
El caso es que Application.CreateForm establece la propiedad MainForm de Application la primera vez que se usa y Application.Run es un ciclo como el de arriba que no termina sino hasta que Application.Terminated es
true.
El método Close de TForm (de hecho de TCustomForm) verifica sí es el MainForm y en caso afirmativo llama a Application.Terminate quien a su vez pone Application.Terminated en
true, ocasionando que se termine el ciclo de Application.Run.
Ahora, en el ejemplo que doy, hay entonces que dar una forma alternativa de cerrar la aplicación, alguna parte donde se llama a Application.Terminate.
He hecho la prueba poniendo esto en el evento OnClose de ambos formularios:
Código Delphi
[-]
if Screen.FormCount = 1 then
Application.Terminate;
Action := caFree;
Si ambos formularios están abiertos, Screen.FormCount será igual a 2, así que lo único que pasa es que el formulario que se cierra se destruye.
Pero si ya se cerró uno, Screen.FormCount será igual a 1, de manera que se ejecutará Application.Terminate.
Como mencioné (creo) en el hilo que no encuentro, desconozco qué efectos colaterales pueda tener el no ejecutar Application.Run, así que habrá que tomarlo con reserva.
// Saludos