Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как исправить неправильное поведение дочерних форм в Delphi под Mac OS X с использованием Wine

Delphi , ОС и Железо , Windows

При разработке приложений на Delphi для платформы Windows, разработчики могут столкнуться с различными проблемами при попытке запуска этих приложений в среде Mac OS X с использованием эмулятора Wine. Одна из таких проблем связана с неправильным поведением дочерних форм, которые не возвращаются в фокус при нажатии на основную форму.

Описание проблемы

Пользователь обнаружил, что в приложении Delphi (XE8), работающем почти идеально в Wine на OSX 10.6, есть проблема: при открытии дочерней формы через меню основной формы, дочерняя форма частично закрывает основную, и нет возможности вернуть основную форму в фокус. Это поведение наблюдается как при использовании WineBottler, так и при использовании Crossover.

Контекст и решение проблемы

Проблема заключается в том, что дочерняя форма является "владеющей" (owned) формой по отношению к основной форме. В Windows-приложениях это стандартное поведение: владеющая форма всегда находится над владельцем.

Шаги решения:

  1. Отключить автоматическое создание дочерней формы в проекте:
  2. В меню проекта выбрать: Project -> Options -> Forms.
  3. Переместить форму из списка "Auto Create Forms" в "Available Forms".

  4. Создать форму вручную: delphi procedure Tfmain.FormCreate(Sender: TObject); begin Form2 := TForm2.Create(Application); end;

  5. Принудительно установить WndParent новой формы в 0, переопределив CreateParams: delphi unit Unit2m; interface type TForm2Interposer = class(TForm) procedure CreateParams(var Params: TCreateParams); override; end; TForm2m = class(TForm2Interposer) ... implementation procedure TForm2Interposer.CreateParams(var Params: TCreateParams); begin inherited; Params.WndParent := 0; end;

  6. Отобразить форму, указав в качестве владельца Application: delphi procedure Tfmain.Button1Click(Sender: TObject); begin form2m.Show; end;

  7. Удалять форму вручную не требуется, так как Application (владелец формы) произведет очистку: delphi procedure Tfmain.FormDestroy(Sender: TObject); begin // Form2.Free; -- Удаление не требуется, владелец произведет очистку. end;

Теперь любая выбранная форма будет выводиться на передний план.

Заключение

Проблема была вызвана стандартным поведением Windows, при котором владеющая форма всегда находится над владельцем. Исправление состояло в ручном создании формы и изменении ее владельца на Application, что позволило дочерним формам иметь равный статус в Z-порядке. Это решение не связано с настройкой MainFormOnTaskbar.

Создано по материалам из источника по ссылке.

Вопрос связан с исправлением неправильного поведения дочерних форм в приложениях Delphi на Mac OS X при использовании эмулятора Wine, где дочерние формы не возвращаются в фокус из-за их владельческих свойств по отношению к основной фо


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Windows ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 01:00:40/0.0030040740966797/0