Segun lo q haz puesto es logico q entre en un loop infinito, porque, al ejecutar la
TForm(Screen.Forms[idx]).Close nuevamente va a entrar a FormCloseQuery y asi susesivamente, lo q podrias hacer es en vez de usar FormCloseQuery usar el evento OnClose.
Código Delphi
[-]procedure TfmMain.FormClose(Sender: TObject; var Action: TCloseAction);
var
idx:Integer;
begin
if Application.MessageBox('Desea Salir del Sistema ...?','Salir',
MB_YESNO+MB_ICONQUESTION+MB_DEFBUTTON2) = IdYes Then
begin
for idx:=Screen.FormCount-1 downto 1 do
begin
if TForm(Screen.Forms[idx]).Name<>'' Then
if TForm(Screen.Forms[idx]).Owner=Self Then
TForm(Screen.Forms[idx]).Close;
end;
end else
Action := caNone;
end;
No lo he probado, y tambien depende en q forma estes usando el evento, supongo y se esta ejecutando en el formulario principal, es una aplicacion MDI??