LoginSignup
5
3

More than 1 year has passed since last update.

[Delphi][FMX] ScreenScale 取得方法4つ

Posted at

FireMonkey の解像度の概念

FireMonkey は自分でコントロールを描画するためデバイスの物理的な解像度ではなく、仮想解像度を使って描画を管理しています。
また Windows においては Form の大きさも DP 単位で管理されていて、やはり物理的な解像度と切り離されています。

ということで、全て物理解像度とは別で管理されているため、実際のピクセルベースの大きさなどが知りたいときに ScreenScale が必要になります。
例えば、Bitmap は Pixel で幅や高さが指定されています。
Bitmap の物理解像度⇔仮想解像度間の変換は ScreenScale が必要です。

FireMonkey には ScreenScale を取得する方法がいくつかあるので、それを紹介します。

FireMonkey ScreenScale 取得方法

1.IFMXScreenService

最初は IFMXScreenService による方法です。
これは、どんな場面でも使えるものの数行書かないといけないのでちょっと面倒です。

IFMXScreenScale
// IFMXScreenService は FMX.Platform unit に宣言されている
var S: IFMXScreenService;
if
  TPlatformServices.Current.SupportsPlatformService(IFMXScreenService, S)
then
  var Scale := S.GetScreenScale; // GetScreenScale で取得できる

IFMXScreenService を TPlatformServices から取り出して GetScreenScale を使って ScreenScale を取り出します。

2.TControl.Scene

TControl から派生した Control(例えば TButton や TEdit など)があれば、簡単に取得できます。

TControl.Scene
var Scale := Button1.Scene.GetSceneScale;

TControl の Scene プロパティの GetSceneScale で取得できます。

IScene から取る方法は GetScreenScale ではなく GetSceneScale です。

3.IScene

TControl.Scene プロパティの実体は TCustomForm です。
ですので Form を IScene にキャストすると Control と同じように GetSceneScale を使って取り出せます。

ISccene
var Scale := (Form1 as IScene).GetSceneScale;

4.TDisplay.Scale

TDisplay.Scale プロパティを使うとディスプレイ毎の Scale を取り出せます。
TDisplay の取得方法はいくつかありますが、ここでは Screen.DisplayFromForm を使いました。
これは引数で指定した Form が表示されている Display を返すメソッドです。

TDisplay
var Scale := Screen.DisplayFromForm(Form1).Scale

まとめ

一番簡単なのは TControl.Scene.GetSceneScale を使う方法です。
つぎに簡単なのは TForm を IScene として使う方法です。

Display 毎の Scale が必要な場合は Screen から Display を取り出して使います(Screen.Displays プロパティを使えば任意の Display を取り出せます)。

IFMXScreenService は正統な方法だと思いますが、他の3つの方法があれば、これを使う機会はあまり無さそうです。

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3