Windows появляется за краем экрана (Delphi) - PullRequest
4 голосов
/ 01 июля 2010

Окна в моем приложении выскакивают с края экрана, и это, конечно, проблема, потому что некоторые окна являются модальными и не могут быть закрыты (вы даже не знаете, что они есть).

Я использую компонент TurboPower Orpheus, который запоминает расположение и размер каждой формы, а затем восстанавливает его при повторном отображении формы. Сохраняет размер и размещение в файле INI.

Что я могу сделать, чтобы окна не отображались сбоку экрана?

Ответы [ 3 ]

9 голосов
/ 01 июля 2010

Обычно такие вещи случаются, если вы используете несколько мониторов, а затем отключаете один, например, когда отсоединяете ноутбук. Или если вы подключаете ноутбук к экрану с более высоким разрешением. Или используйте удаленный рабочий стол и т. Д. Чтобы исправить это, нужно переопределить поведение «запомнить мою позицию» проверкой работоспособности, чтобы увидеть, превышает ли ширина влево + ширину экрана (массив Screen.Monitors, на самом деле - спасибо, ребята), и наоборот для верхнего + высота.

В идеале вы «натыкаетесь», вычитая разницу, так что вы стучите по краю, который окно хотело расположить.

Кроме того, посмотрите, есть ли обновления для Orpheus, которые это исправляют. Если нет, вы можете получить источник, внести исправление (необязательно) и внести его обратно в проект. Насколько я помню, это OSS.

2 голосов
/ 02 июля 2010

Возможно, вы захотите взглянуть на их свойство 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.
1 голос
/ 25 января 2018

Чтобы вспомнить предыдущую позицию формы, не находя ее внезапно в области, которая больше не доступна (из-за отключенного экрана или измененного разрешения), вы просто набираете

TForm.MakeFullyVisible;

Вот и все. См. документацию .

...