Cita:
Empezado por Clantt
que si cierro la principal no se cierren las otras ventanitas.
|
El problema es que Delphi siempre se cerrará cuando se cierre el formulario principal. El formulario principal es el primero que se crea mediante
Application.CreateForm(...);
en el dpr.
CreateForm asigna a la propiedad MainForm (de solo lectura) del objeto Application el formulario creado. Cuando un formulario se cierra pregunta si él es el principal
if Application.MainForm = Self then Application.Terminate
y Application.Terminate es quien se encarga de terminar la aplicación.
Con más precisión, Application.Terminate ocasiona que la propiedad Terminated de Application sea true lo cual es la condición de salida del ciclo principal en Application.Run:
Código Delphi
[-]
repeat
try
HandleMessage;
except
HandleException(Self);
end;
until Terminated
Dos opciones que se me ocurren ahora son:
1. Usas un formulario principal de palo que esté escondido y un segundo formulario que haga las veces del principal.
2. Alteras la forma en que Delphi maneja el ciclo principal. Por ejemplo, sustituyes todos los
Application.CreateForm(TFormN, FormN)
por
FormN := TFormN.Create(Application);
y sustituyes la línea
Application.Run
en el dpr por tu propio ciclo:
Código Delphi
[-]
repeat
try
Application.HandleMessage;
except
Application.HandleException(Application);
end;
until Application.Terminated;
Claro que en este caso tienes que asegurarte de que en algún momento se cierre la aplicación (usando, por ejemplo, Application.Terminate) o podría sucederte que se cierren todos los formularios y la aplicación se quede colgada.
Para ello podrías agregar en el evento OnClose de cada formulario algo como
Código Delphi
[-]
Action := caFree;
if Screen.FormCount = 1 then
Application.Terminate;
Esto asegurará que si el formulario que se cierra es el último entonces se llamará a Application.Terminate.
// Saludos