Windows появляется за краем экрана (Delphi)
Окна в моем приложении выскакивают с края экрана, и это, конечно, проблема, потому что некоторые окна являются модальными и не могут быть закрыты (вы даже не знаете, что они есть).
Я использую компонент TurboPower Orpheus, который запоминает расположение и размер каждой формы, а затем восстанавливает его, когда форма отображается снова. Сохраняет размер и размещение в INI-файле.
Что я могу сделать, чтобы окна не показывались сбоку экрана?
3 ответа
Такое случается, если вы используете несколько мониторов, а затем отключаете один, например, когда отсоединяете ноутбук. Или если вы подключаете ноутбук к экрану с более высоким разрешением. Или используйте удаленный рабочий стол и т. Д. Средство исправления состоит в том, чтобы переопределить поведение "запомнить мою позицию" проверкой работоспособности, чтобы увидеть, превышает ли ширина по ширине влево + ширину экрана (массив Screen.Monitors, на самом деле - спасибо, ребята), и наоборот для верха + высота.
В идеале, вы "натыкаетесь", вычитая разницу, так что вы стучите по краю, который окно хотело бы расположить.
Кроме того, посмотрите, есть ли обновления для Orpheus, которые исправляют это. Если нет, вы можете получить источник, внести исправление (необязательно) и внести его обратно в проект. Это OSS, насколько я помню.
Вы можете взглянуть на их DefaultMonitor
свойство и читать код из TCustomForm.SetWindowToMonitor
чтобы увидеть, как бороться с позиционированием относительно Screen.Monitors
,
Use DefaultMonitor to associate a form with a particular monitor in a multi-monitor application. The following table lists the possible values:
Value Meaning
dmDesktop No attempt is made to position the form on a specific monitor.
dmPrimary The form is positioned on the first monitor listed in the global screen object's Monitors property.
dmMainForm The form appears on the same monitor as the application's main form.
dmActiveForm The form appears on the same monitor as the currently active form.
Note: DefaultMonitor has no effect if the application does not have a main form.
Чтобы вспомнить предыдущую позицию формы, не находя ее внезапно в области, которая больше не доступна (из-за отключенного экрана или измененного разрешения), вы просто вызываете
TForm.MakeFullyVisible;
Вот и все. Смотрите документацию.