Перейти к содержанию
Fire Monkey от А до Я
  • 0

Не выходит задать положение формы на планшете


POV

Вопрос

Винда 10, два компа (рабочий ноут и планшет от мелкософта - у первого 100% экран, у другого 200%).

Исходя из габаритов разных там компонентов и другой формы, рассчитываю Top и Left интересующей меня формы. На ноуте выводится где и хотел, а на планшете выше и левее. Смещение не кратно никак масштабу. В доступе планшета нет, как отлаживать не придумаю.

Косяк всё же в в масштабе может быть или иное?

Ссылка на комментарий

Рекомендуемые сообщения

  • 0
6 часов назад, POV сказал:

Исходя из габаритов разных там компонентов и другой формы, рассчитываю Top и Left интересующей меня формы

Покажите код. У меня когда-то была похожая проблема - может чё посоветую.

Ссылка на комментарий
  • 0

За подходы прошу не пинать, все пришлось сделать в считанные минуты в полевых условиях...

Изначально на форме была скрытая картинка imExpand. Когда на кнопочку тыркалось, надо было размер формы ужать до размеров этой картинки, и картинку сделать видимой поверх всех. Сама форма нового мелкого размера должна была оказаться выровнена по левому нижнему краю изначального размера и положения. Но оно на планшете косячило, положение формы оказывалось где не надо.

Переделал - теперь эта картинка на отдельной форме frmGalleryClose. Но оно вышло ровно так же! При этом на моём ноуте все позиционируется как надо.

Если важно, то планшет какой-то из "сурфес про".

procedure TfrmViso.bOkManClick(Sender: TObject);
begin
  frmGalleryClose.Left := Left + Width - Trunc(imExpand.Width);
  frmGalleryClose.Top := Top + Height - Trunc(imExpand.Height);
  Hide;
  frmGalleryClose.ShowModal;
  Show;
exit;

 

Изменено пользователем POV
Ссылка на комментарий
  • 0

Попробуйте учитывать Screen.PixelsPerInch
На обычном компе без системного масштабирования Screen.PixelsPerInch = 96.
При 150% машстабировании (для 4к дисплеев например) Screen.PixelsPerInch=96*1.5=144
Возможно у вас масштабирование больше чем 150% (я с таким не сталкивался, но может десятка так умеет, я хз). В любом случае, Screen.PixelsPerInch должно возвращать вам это значение.
Учитывайте его при пересчете координат, примерно так:

// нужное значение
Form1.Left := 100;
Form1.Top  := 100;

// пересчитываем координаты
Form1.Left := Form1.Left * Trunc(Screen.PixelPerInch / 96);
Form1.Top  := Form1.Top  * Trunc(Screen.PixelPerInch / 96);

 

Ссылка на комментарий
  • 0

Если правильно помню - у меня проблема была в том, что при расчете использовал как размеры и положение контролов на форме, так и самой формы (как и у Вас). Где-то они уже преобразованы в соответствии с масштабом, а где-то - нет. Для начала попробуйте вычислять координаты с помощью функций ScreenToClient и ClientToScreen, не используя Left, Top, Width и Height формы

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

Замечу, что многое зависит от системы, на которой запускалось приложение - разное поведение на Win7, Win8, Win8.1 и Win10. Так же проверьте - выставлен ли параметр Enable High DPI в параметрах проекта - в зависимости от него API-шные функции винды возвращают разные значения.

Ссылка на комментарий
  • 0
34 минуты назад, Barbanel сказал:

Попробуйте учитывать Screen.PixelsPerInch

Это олдскул. Есть FMX.Platform.IFMXScreenService.GetScreenScale, FMX.Helpers.Win.GetDCScale и FMX.Helpers.Win.GetWndScale

Изменено пользователем dnekrasov
Ссылка на комментарий
  • 0
13 минут назад, dnekrasov сказал:

Это олдскул. Есть FMX.Platform.IFMXScreenService.GetScreenScale, FMX.Helpers.Win.GetDCScale и FMX.Helpers.Win.GetWndScale

Оно какое-то нерабочее. Тут я находил такие советы - масштаб читается как 1, хотя я задал 125%.

Ссылка на комментарий
  • 0
4 минуты назад, POV сказал:

Оно какое-то нерабочее. Тут я находил такие советы - масштаб читается как 1, хотя я задал 125%.

Система? Версия Delphi? У меня проблемы возникают только если подключено 2 монитора и на одном мониторе 125, а на другом 100. Кстати - после изменения масштаба обязательно перелогиниться, иначе не всё подхватывается.

Изменено пользователем dnekrasov
Ссылка на комментарий
  • 0
В 28.10.2018 в 04:46, POV сказал:

В доступе планшета нет, как отлаживать не придумаю

Для отладки - заведите в винде нового пользователя, у него установите масштаб побольше и, переключаясь между основным и ним, отлаживайтесь. Немного геморно но... за неимением гербовой... и т.д. по тексту :)

Ссылка на комментарий
  • 0
46 минут назад, dnekrasov сказал:

Система? Версия Delphi? У меня проблемы возникают только если подключено 2 монитора и на одном мониторе 125, а на другом 100. Кстати - после изменения масштаба обязательно перелогиниться, иначе не всё подхватывается.

Вин 10, токио последний. Один моник.

Если нужно будет перелогиниваться, то это несерьезно.

Ссылка на комментарий
  • 0
1 минуту назад, POV сказал:

Если нужно будет перелогиниваться, то это несерьезно.

Да нет. Это вполне серьёзно. Это настройка и особенность винды и Delphi тут ни при чём. Так что для отладки используйте способ, описанный мною чуть выше. Без перелогина после изменения масштаба Вы ничего не увидите. Заранее сочувствую - я помню как сам намучался, когда отлаживал подобное.

Ссылка на комментарий
  • 0
15 минут назад, dnekrasov сказал:

Да нет. Это вполне серьёзно. Это настройка и особенность винды

В десятке тоже нужно перелогиниться?
Помню только про семерку.

Ссылка на комментарий
  • 0
1 минуту назад, Barbanel сказал:

В десятке тоже нужно перелогиниться?
Помню только про семерку.

Да. После изменения масштаба отображаться начинает вроде нормально, даже без перезагрузки приложения, а вот многие API-шные функции, относящиеся к работе с масштабом возвращают старые значения.

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...