2014-12-24 2 views
0

У меня есть приложение Delphi 3, которое распространяется по всему миру как минимум на десять лет. Сегодня я получил сообщение о том, что приложение не работает должным образом на планшете Asus Transformer T100TA-C1-GR (S) Windows 8. В частности, приложение отказывается запускать, потому что оно обнаруживает, что разрешение экрана слишком мало, чтобы приложение могло правильно отображать себя. В приложении, у меня есть следующий условный чек:Неверная ширина и высота экрана, о которых сообщает Delphi 3

if (Screen.Width < 800) or (Screen.Height < 600) then begin 
    // display a message reporting screen resolution too low 
    ShowMessage('blah blah...'); 
    Application.Terminate; 

Когда я составил специальную версию своего приложения, чтобы помочь отладить эту проблему, и дал приложение к жалуясь пользователю, они не отчитываются следующие номера:

Width: 980 
    Height: 550 

Вот дополнительный код, который я добавил специальный сборник, который я тогда дал пользователю:

ShowMessage('Width: ' + IntToStr(Screen.Width) + #13#10 + 
    'Height: ' + IntToStr(Screen.Height)); 

пользователь, однако, клянется, что их планшет настроен на 136 8x768. Они даже переключились на 1024x768, и Delphi сообщает о том же неправильном количестве.

Все свойства TForm.Scaled имеют значение False.

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

procedure TForm1.WMDisaplayChange(var m: TWMDisplayChange); 

Любая идея, что может быть происходит?

+0

Пусть установить масштабирование отключить дисплей в настройках совместимости. –

+1

Это означает, что ОС неправильно сообщает размеры экрана, а не Delphi 3. Delphi (даже 3) извлекает их через вызов API (в частности, GetSystemMetrics), поэтому он сообщает о том, что было сказано операционной системой. –

ответ

8

Ваша заявка зависит от виртуализации DPI. Ваше приложение не указало системе, что оно знает и поддерживает устройства с высоким разрешением DPI. В рассматриваемой машине используется масштабирование шрифта более 125%. Это высокая точка отключения DPI. Помимо этого масштабирования система виртуализирует масштабирование шрифтов для приложений, не поддерживающих DPI. От documentation:

В Windows Vista появилась функция, называемая виртуализацией DPI, которая обеспечивает уровень автоматической масштабируемости для приложений, не поддерживающих DPI. С помощью этой функции Windows масштабирует размер текста и элементов пользовательского интерфейса приложений, которые не поддерживают DPI, поэтому они имеют соответствующий размер при высоких настройках DPI без изменений в приложении. Это предотвращает потенциальные проблемы с удобством использования и удобочитаемости, возникающие, когда приложения слишком мала на высоких экранах DPI.

В Windows Vista до Windows 8 эта функция обеспечивает «виртуализированные» системные метрики и элементы пользовательского интерфейса не для приложений с поддержкой DPI, как если бы они работали с разрешением 96 DPI. Затем приложение отображает внешнюю поверхность 96 DPI, а DWM масштабирует полученное окно приложения в соответствии с настройкой DPI. Например, если параметр отображения DPI равен 144, DWM масштабирует окно приложения на 150% или 144/96.

Следствием этого является то, что система подделывает размеры экрана. Когда ваше приложение DPI виртуализировано, система сообщает о виртуализированных измерениях, а не о реальных измерениях.

Лучшей практикой является объявить ваше приложение высоким значком DPI и масштабировать пользовательский интерфейс в соответствии с настройками масштабирования шрифтов пользователя. Конечно, это будет для вас совершенно изменчивым. Возможно, это не тот, который вы хотите взять.

Другой вариант - попросить пользователя использовать уменьшенное масштабирование шрифта. Вероятно, они тоже не будут очень заинтересованы в этом.

Еще один вариант заключается в том, чтобы продемонстрировать ваше приложение, чтобы оно было осведомленным о высоком значении DPI и продолжало не масштабировать его. Тогда это, безусловно, запустится, но это не будет соответствовать предпочтениям масштабирования шрифта пользователя. Опять же, я предполагаю, что пользователь не будет удивлен.

Если вы в настоящее время не показываете свое приложение, значит, теперь это приведет к тому, что он не будет виртуализирован. И я имею в виду виртуализацию приложений, а не виртуализацию DPI. Несмотря на то, что вы действительно не должны запускать виртуализацию, вы можете столкнуться с проблемами, если отключите виртуализацию.

И Sertac предлагает другой вариант. Попросите пользователя применить параметры совместимости для вашего приложения, чтобы отключить виртуализацию DPI. Вы можете применить это к приложению, как и сегодня, без повторной компиляции и, по крайней мере, ваш пользователь сможет добиться прогресса.

По существу, есть проблемы с настройкой машины вашего пользователя. Если он имеет 768 вертикальных пикселей и около 140% масштабирования, это действительно 100% масштабированный эквивалент 550 пикселей. Это не очень много пикселей. Ваше приложение возражает, потому что экран слишком мал и, ну, возможно, это действительно так.

Это различные ответы здесь могут быть полезны для вас: How do I make my GUI behave well when Windows font scaling is greater than 100%

+0

Если приложение проверяет разрешение при запуске по какой-либо причине (а не только для раздражения пользователя), высокая осведомленность о DPI не будет решением: элементы пользовательского интерфейса не будут соответствовать доступному пространству. В этом случае использование параметра совместимости, которое отключает масштабирование экрана для этого приложения, может быть единственным решением (не заставляя пользователя изменять настройки DPI для системы/монитора). –

+0

@Sertac High DPI без масштабирования позволит запускать приложение, хотя пользователь будет злиться. Это почти то же самое, что и отключение масштабирования. –

+0

Да, я видел редактирование +1. Однако параметр совместимости может быть предпочтительным, чтобы дать пользователю возможность, у него/нее может быть больший монитор и т. Д. –

Смежные вопросы