Bueno, al parecer terminó funcionando
Se ha quedado de la siguiente manera :
Código Delphi
[-]procedure TMainform.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var
i : Integer;
begin
for i := MDIChildCount - 1 downto 0 do begin
if Assigned(MDIChildren[i].OnCloseQuery) then begin
MDIChildren[i].Close;
Application.ProcessMessages;
end;
end;
for i := MDIChildCount - 1 downto 0 do
MDIChildren[i].Close;
end;
Primero intento cerrar todas las ventanas en las cuales necesite hacer una comprobación antes del cierre, y por lo tanto aquellas que tengan un 'OnCloseQuery', y después sigo con las que no lo tienen.
Te esta manera si el usuario decide 'abortar' el proceso de cierre, aquellas ventanas que no necesiten de comprobación seguirán abiertas.
En el OnCloseQuery de las MDIChild que lo necesiten :
Código Delphi
[-]procedure TMDIChild.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var
Option : String;
begin
if Modificado then begin
if (WindowState = wsMinimized) or (Height <> Constraints.MaxHeight) or (Width <> Constraints.MaxWidth) then begin
WindowState := wsNormal;
Height := Constraints.MaxHeight;
Width := Constraints.MaxWidth;
BorderIcons := BorderIcons - [biMaximize];
end;
if not Active then Show;
Mostrar_Mensaje('Se realizaron Cambios. Quiere Guardar dichos Cambios ?',1);
Option := Mostrar_Mensaje.ShowModal;
Mostrar_Mensaje.Free;
If Option = 'CANCEL' then begin
CanClose := False;
Abort;
end;
end;
end;
Si no se necesita de esta comprobación, se ejecutará directamente el código que se halle en OnClose, entre otras la liberación de la memoria mediante el Free correspondiente.
Además incluyo la rutina que utilizo para la misma comprobación cuando se intenta hacer un cambio de usuario mediante mi propia pantalla de LogIn. Al cambiar de usuario lo que hago es también obligar a cerrar todas las ventanas activas.
Código Delphi
[-]procedure TMainform.LogInClick(Sender: TObject);
var
i : Integer;
Option : Integer;
Aux_Name : String;
begin
if MDIChildCount <> 0 then begin
Mostrar_Mensaje('Se cerrarán todas las Ventanas Abiertas. Continuar?',0);
Option := Mostrar_Mensaje.ShowModal;
Mostrar_Mensaje.Free;
if Option = 1 then begin
for i := MDIChildCount - 1 downto 0 do begin
if Assigned(MDIChildren[i].OnCloseQuery) then begin
MDIChildren[i].Close;
Application.ProcessMessages;
end;
end;
for i := MDIChildCount - 1 downto 0 do
MDIChildren[i].Close;
end
else Exit;
end;
ActionMainMenuBar1.Enabled := False;
LogIn := TLogIn.Create(Self);
LogIn.ShowModal;
LogIn.Free;
ActionMainMenuBar1.Enabled := True;
end;
Después de todos los comentarios de los compañeros, no sé realmente por qué he tenido que incluir el 'Application.ProcessMessages'. La cuestión es que puedo tener abiertas varias instancias de un mismo form (en mi caso reservas de habitaciones). Y comenté anteriormente el problema que tenía con la transacción de cada una de esas instancias del mismo form.
Lo que si he podido comprobar con certeza es que si incluyo dicho 'Application.ProcessMessages' todo funciona correctamente, en cambio si lo omito, al cerrar la transacción de la primera instancia del form de reservas, me cierra también las transacciones de las demás instancias.
Saludos a todos, y una vez más gracias a todos por la ayuda prestada.
