Могу ли я из модальной формы активировать существующее немодальное окно? - PullRequest
1 голос
/ 05 октября 2010

Могу ли я из модальной формы активировать существующее немодальное окно? Я пользуюсь Delphi.

В нашем приложении пользователи могут редактировать отчеты в немодальном окне. Обычно это делается путем выбора «Редактировать отчеты» в главном окне. Но есть также возможность открыть отчет из модального диалогового окна печати. Это приводит к следующей проблеме: пользователь открывает отчет для редактирования из главного окна. Он вносит некоторые изменения, но не сохраняет их (он минимизирует это или что-то). Затем из диалогового окна печати он снова открывает тот же отчет, забывая, что он уже открыт, или полагая, что это старое окно, вносит некоторые изменения и сохраняет его. Теперь у нас есть проблема. Либо эти изменения будут потеряны (когда он запоминает и открывает старое окно редактирования и сохраняет свои изменения), либо старые изменения будут потеряны (когда он запоминает старое окно и закрывает его без сохранения)

Я хочу открыть старое окно редактирования, когда пользователь инициирует редактирование из диалогового окна печати. У меня уже есть код для найти старое окно редактирования, но как мне его активировать?

Ответы [ 4 ]

1 голос
/ 07 октября 2010

При исследовании немодальных окон я наткнулся на следующую информацию, которая, кажется, именно то, что вы ищете.Я не знаю относительных плюсов и минусов этого метода по сравнению с использованием RecreateAsPopup.

http://blogs.teamb.com/deepakshenoy/2006/08/21/26864

1 голос
/ 06 октября 2010

Если вы используете D2005 или новее, я думаю, вы можете использовать RecreateAsPopup в ReportForm, передавая дескриптор модальной формы в качестве параметра.Документация на это немного скудна, поэтому попробуйте ее на свой страх и риск.:)

1 голос
/ 05 октября 2010

Предполагается, что ваша переменная формы называется ReportForm:Обычный способ - просто снова вызвать метод ReportForm.Show.Или установите ReportForm.WindowState в wsNormal для свернутых окон.Или позвоните ShowWindow(ReportForm.Handle, SW_RESTORE);, который вернет свернутое окно в его первоначальную форму.Вы также можете принудительно вывести ReportForm на передний план, но поскольку он немодальный, он не реагирует ни на что, заставляя ваше приложение вести себя так, как будто оно зависает.Для этого используйте:

  ReportForm.FormStyle := fsStayOnTop;
  ReportForm.Show;
  ReportForm.FormStyle := fsNormal;

Это работает, возвращая ReportForm обратно на передний план.Возможно, вы захотите сохранить старое значение FormStyle.И да, это немного взломать.Кроме того, форма не будет реагировать на мышь или клавиатуру просто потому, что модальная форма все еще требует внимания на заднем плане!(Рано или поздно он снова вернется на передний план.)Модальная форма потребует всего внимания от сообщений Windows.Этот трюк просто временно скрывает модальную форму.Между прочим, самый простой способ найти эту форму - использовать глобальную переменную в вашем проекте и назначить форму отчета для этой переменной.Тогда вы можете просто позвонить if Assigned(YourForm) then YourForm.Show;, когда вам нужно снова отобразить его.(Плюс две другие строки, если это необходимо.)Итак, лучшим решением будет ShowWindow(ReportForm.Handle, SW_RESTORE);, который должен работать, я думаю ... Он вернется за модальную форму, где он должен быть.

0 голосов
/ 05 октября 2010

А как насчет следующего потока:

  • Прежде чем открывать отчет в модальном режиме для печати, проверьте, открыт ли тот же самый отчет (у вас уже есть это).
  • Еслисуществует открытая форма, запишите ее состояние (в строку, объект или запись, поток и т. д.)
  • Закройте немодальную форму
  • Создайте новую модальную форму отчета и инициализируйтеэто с захваченным состоянием.
...