Что такое TApplication.Handle
?
- Откуда он?
- Почему он существует?
- И самое главное: почему все формы имеют его как дескриптор родительского окна?
Справка Delphi говорит:
TApplication.Handle
Предоставляет доступ к дескриптору окна основной формы (окна) приложение.
property Handle: HWND;
Описание
Использовать Handle при вызове Windows API функции, требующие родительского окна ручка. Например, DLL, которая отображает собственное всплывающее окно верхнего уровня для окон требуется родительское окно для отобразить его окна в выражение. Использование свойства Handle делает такие окна частью приложения, чтобы они были минимизированы, восстановлены, включены и отключено приложением.
Если я сосредоточусь на словах "дескриптор окна основной формы приложения", и я считаю, что это означает дескриптор окна основной формы приложения, то я могу сравнить:
- "дескриптор окна основной формы приложения",
- дескриптор окна
MainForm
Application
но они не совпадают:
Application.MainForm.Handle: 11473728
Application.Handle: 11079574
Итак, что такое Application.Handle
?
- Откуда он?
- Что такое Windows & reg; дескриптор окна?
- Если , Windows & reg; дескриптор окна
Application
MainForm
, то почему они не соответствуют? - Если это не дескриптор окна
Application
MainForm
, то что это такое? - Что еще важнее: почему он является основным родителем каждой формы?
- И самое главное: почему все происходит с haywire, если я пытаюсь иметь форму, не имеющую аналогов (так что она может появиться на TaskBar) или попытаться использовать что-то вроде IProgressDialog?
Действительно, я спрашиваю: что такое обоснование дизайна, которое делает Application.Handle существующим? Если я смогу понять, почему, то как должно стать очевидным.
Обновить Понимание игры из двадцати вопросов:
Говоря о том, что решение о создании окна появляется на панели задач, сделав его владельца null
, Питер Ниже в 2000 году сказал:
Это может вызвать некоторые проблемы с модальными формами, показанными на вторичные формы.
Если пользователь отключается от приложения, а модальный форма вверх, а затем обратно в форму, которая показала ее, модальная форма может спрятаться под формой. С этим можно справиться, убедившись модальная форма родилась на форме, которая показала ее (используя `params.WndParent``, как указано выше)
Но это невозможно в стандартном диалогов из блока
Dialogs
и исключений, которые требуют больше усилий для заставить их работать правильно (в основном обработкаApplication.OnActivate
, ищет модальные формы, родившиеся для Приложения черезGetLastActivePopup
и доводя их до вершины Z-порядка черезSetWindowPos
).
- Почему модальная форма заканчивается за другими формами?
- Какой механизм обычно переносит модальную форму на передний план и почему она не работает здесь?
- Окно & рег; отвечает за отображение стеков окон. Что пошло не так, что Windows & reg; не показывает правильные окна?
Он также рассказывал об использовании нового расширенного стиля Windows, который заставляет окно появляться на панели задач (когда обычные правила его неактуальности недостаточны, непрактичны или нежелательны), добавив расширенный стиль WS_EX_APPWINDOW
procedure TForm2.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams( params );
Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
end;
Но затем он предупреждает:
Если вы нажмете на кнопку панели задач вторичной формы, в то время как другое приложение active это все равно приведет к появлению всех форм приложений. если ты не хотите, чтобы есть опция
Кто приносит все формы на фронт, когда владелец формы все еще Application.Handle
. Является Приложением это? Почему он это делает? Вместо этого, не следует ли это делать не? В чем заключается недостаток не; я вижу недостаток делать (системное меню не работает должным образом, миниатюры кнопок на панели задач неточны, Windows & reg; оболочка не может свести к минимуму окна.
В другом сообщении, посвященном Application
, Майк Эденфилд говорит, что родительское окно отправляет другому окну сводку, максимизацию и восстановление сообщений:
Это добавит кнопку панели задач для вашей формы, но есть еще несколько мелких деталей для ручка. Наиболее очевидно, что ваша форма по-прежнему получает сведения об уменьшении/максимизации, которые отправляются родителям форма (основная форма заявки). Чтобы этого избежать, вы можете установить сообщение обработчик для WM_SYSCOMMAND, добавив строку, например:
procedure WMSysCommand(var Msg: TMessage); WM_SYSCOMMAND; procedure TParentForm.WMSysCommand(var Msg: TMessage); begin if Msg.wParam = SC_MINIMIZE then begin // Send child windows message, don't // send to windows with a taskbar button. end; end;
Обратите внимание, что этот обработчик находится в форме PARENT той, которую вы хотите вести независимо от > остальной части приложения, чтобы избежать передачи сообщения минимизации. Вы можете добавить аналогичный код для SC_MAXIMIZE, SC_RESTORE и т.д.
Как это минимизировать/максимизировать/восстановить сообщения для моей Windows & reg; окна не ходят в мое окно? Это потому, что сообщения, предназначенные для окна, отправляются Windows & reg; владельцу окна? И в этом случае все формы в приложении Delphi "принадлежат" Application
? Не означает ли это, что владелец null:
procedure TForm2.CreateParams(var Params: TCreateParams);
begin
inherited;
Params.WndParent := 0; //NULL
end;
удалит Application
, и это окно Handle из-за вмешательства в мою форму, и Windows должна снова отправить мне мои сообщения mimimize/maximize/restore?
Возможно, если бы мы сравнивали и сопоставляли теперь "нормальное" приложение Windows, это делало то, как Borland изначально разрабатывал приложения Delphi для выполнения каких-либо действий - в отношении этого объекта Application
и его основного цикла.
- Каким решением было решение
Application
? - Какие изменения были внесены в более поздних версиях Delphi, чтобы эти же проблемы не существовали?
- Не изменилось ли изменение в более поздних версиях Delphi других проблем, которые так сильно решались в дизайне приложения?
- Как эти новые приложения могут работать без приложения, препятствующего им?
Очевидно, Borland осознал недостаток в своем первоначальном дизайне. Каков был их первоначальный дизайн, какая проблема была в его решении, каков недостаток, какой был перепроектирован и как он решает проблему?