Вы не упомянули, какая версия Delphi ...
Более новые версии Delphi добавили два новых свойства в TCustomForm: PopupMode и PopupParent. Установка PopupParent вашего модального диалога в форму, которая создает это диалоговое окно, гарантирует, что дочерняя форма остается поверх своего родительского. Обычно это решает проблему, которую вы описываете.
Я думаю, что эта пара свойств была добавлена в Delphi 2006, но, возможно, это был 2005 год. Они определенно присутствуют в Delphi 2007 и более поздних версиях.
РЕДАКТИРОВАТЬ: После просмотра вы используете Delphi 7, единственное предложение, которое у меня есть, состоит в том, что в коде, который отображает вашу модальную форму, вы отключаете форму, создающую ее, и повторно включаете по возвращении. Это должно помешать получающему окну получать входные данные, что может помочь сохранить правильный Z-порядок.
Нечто подобное может работать (не проверено, поскольку я больше не использую D7):
procedure TForm1.ShowForm2;
begin
Self.Enabled := False;
try
with TForm2.Create(nil) do
begin
try
if ShowModal = mrOk then
// Returned OK. Do something;
finally
Free;
end;
end;
finally
Self.Enabled := True;
end;
end;
Если Form2 создает модальное окно (как вы уже упоминали), просто повторите процесс - отключите Form2, создайте Form3 и покажите его модально, и снова включите Form2, когда оно вернется. Убедитесь, что вы используете try..finally, как я уже показал, чтобы в модальной форме что-то пошло не так, форма создания всегда была включена заново.