Перейти к содержанию
  • 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
2 минуты назад, Barbanel сказал:

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

 

Ок, попробую.

Поделиться сообщением


Ссылка на сообщение
  • 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 эмодзи.

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

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

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


  • Похожий контент

    • От Вадим Смоленский
      Отчего-то, если задать TMediaPlayer.FileName с расширением "mp4", то уже при запуске приложение валится с сообщением "Unsupported media file". Причем в секции initialization юнита FMX.Media.Win присутствует и при запуске отрабатывает такой оператор:
      TMediaCodecManager.RegisterMediaCodecClass('.mp4', SVMP4Files, TMediaType.Video, TWindowsMediaCodec);
      Запускаю под Windows. Файлы *.avi проигрываются без проблем
    • От Вадим Смоленский
      Проблема обозначена в заголовке. Подробнее: при дефолтных установках TFDConnection.ResourceOption  (включенных EscapeExpand, MacroCreate, MacroExpand, ParamCreate, ParamExpand) функция Locate возвращает False. При отключении этих параметров Locate падает с сообщением "Unrecognized token {"
      Вынужден вместо Locate использовать Filter, очень сильно проигрывая в скорости. Хотелось бы все-таки понять, в чем тут дело.
       
    • От Вадим Смоленский
      Наверное, детский вопрос задам, и все-таки. Вдруг обнаружил, что в моем проекте никакие блоки try...except не срабатывают. Видимо, дело в каких-то настройках — но в каких именно? Иду в Options => Debugger Options => Embarcadero Debuggers => Native OS Exceptions, пробую там менять установки, толку никакого. Более того — пытаюсь искусственно спровоцировать падение делением на ноль — и вообще никакого падения не происходит, деление на ноль дает ноль! Такая же примерно ерунда с попыткой устроить переполнение.
      Ткните меня в причину носом кто-нибудь, пожалуйста.
      UPD  Через два дня хаотичных экспериментов с настройками всё прочихалось, и exceptions благополучно работают. В чем было дело, так и не понял.
    • От Вадим Смоленский
      У одного из тестировщиков, под Windows, моя сборка регулярно падает с такой ошибкой:
      Cannot create rendering target for 'TCanvas2D2'
      В свое время я и сам с этим сталкивался. У себя поборол уменьшением размеров всех TBitmap ниже некоторого предела. Померили максимальный размер TBitmap на компьютере тестировщика функцией TCanvasManager.DefaultCanvas.GetAttribute(TCanvasAttribute.MaxBitmapSize), получилось 8192. На моем компьютере столько же — однако у него падает, а у меня нет. Причем падает не при отрисовке изображения, а уже потом, при каких-то случайных действиях, с отрисовкой не связанных. Всякий раз непредсказуемо. Но он заметил, что если на форму выведено больше крупных изображений, то падает быстрее.
      Как это трактовать и что с этим делать?
    • От the BestJVS
      Добрый день, у меня такой вопрос: как сделать автоматическое масштабирование компонентов под любое разрешение с сохранением пропорций на андроиде? Уже много искал по этому поводу, align=scale не работает, TscaledLayout аналогично, для каждого компонента прописывать scaled.x и scaled.y проблематично. Я новичок, прошу вашей помощи
    • От Вадим Смоленский
      Узнал, что в UWP API включены средства для получения уникального идентификатора компьютера. Это юнит Windows.System.Profile, класс HardwareIdentification, метод getPackageSpecificToken. Существуют ли способы обратиться к этим средствам из Delphi?
      Вообще, я привык считать, что такая идентификация компьютера в принципе невозможна, в отличие от мобильных устройств. Но прогресс, как известно, не остановить.
    • От Вадим Смоленский
      Для задач, связанных с вводом японского текста, мне нужно научиться перехватывать системное сообщение WM_IME_NOTIFY. Насколько могу судить, в FireMonkey эти вещи делаются (если вообще делаются) принципиально иначе, нежели в VCL. Конкретного ничего не нагуглил. Не поможет ли кто?
    • От slav_z
      У меня для приложений написанных на FireMonkey не вызывается меню игры windows. Для VCL все в порядке. XE8. Если у кого есть решение этой проблемы, поделитесь пожалуйста. (комбинация клавиш Win+G при запущенном приложении)
    • От Вадим Смоленский
      В феврале я сетовал, что мое Windows-приложение не хочет нормально запускаться в Linux под Wine 3.0. Но время идет, вышел Wine 3.6 - и теперь один из тестировщиков радостно сообщил, что всё заработало, за вычетом одного досадного момента. А именно: приложение способно сохранять фокус ввода лишь долю секунды, потом теряет. Соответственно, невозможно ничего ввести в текстовые боксы, разве только одну-две буквы. Можно щелкнуть по заголовку приложения, оно опять получит фокус - и через мгновение снова потеряет. Куда именно при этом переходит фокус, непонятно. Тестировщик утверждает, что только мое приложение ведет себя так, все остальные работают нормально.
      Нет ли у кого-нибудь идей? Что нужно проверить?
    • От Вадим Смоленский
      В декабре я задавал здесь вопрос о борьбе с перехватами нажатий клавиш компонентом TWebBrowser. Продвинутый пользователь Kami посоветовал тогда, раз уж меня интересует только Windows, поставить хук на клавиатуру. Поделился полезной ссылкой. Добавил, что можно еще много чего нагуглить. Что-то действительно нагуглилось - но не в том объеме, чтобы я смог четко понять, как это следует делать. Вопросов много. Куда именно должна быть воткнута функция KeyboardProc? Что в ней должно содержаться, чтобы управление передавалось уже написанному обработчику события FormKeyDown? Многие также упоминают о возникающих проблемах с юникодом, и хорошо было бы понять, как уберечься от них.
      Буду очень признателен, если кто-нибудь осветит эту темную для меня материю.
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

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