FireMonkey の解像度の概念
FireMonkey は自分でコントロールを描画するためデバイスの物理的な解像度ではなく、仮想解像度を使って描画を管理しています。
また Windows においては Form の大きさも DP 単位で管理されていて、やはり物理的な解像度と切り離されています。
ということで、全て物理解像度とは別で管理されているため、実際のピクセルベースの大きさなどが知りたいときに ScreenScale が必要になります。
例えば、Bitmap は Pixel で幅や高さが指定されています。
Bitmap の物理解像度⇔仮想解像度間の変換は ScreenScale が必要です。
FireMonkey には ScreenScale を取得する方法がいくつかあるので、それを紹介します。
FireMonkey ScreenScale 取得方法
1.IFMXScreenService
最初は IFMXScreenService による方法です。
これは、どんな場面でも使えるものの数行書かないといけないのでちょっと面倒です。
// 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 など)があれば、簡単に取得できます。
var Scale := Button1.Scene.GetSceneScale;
TControl の Scene プロパティの GetSceneScale で取得できます。
IScene から取る方法は GetScreenScale ではなく GetSceneScale です。
3.IScene
TControl.Scene プロパティの実体は TCustomForm です。
ですので Form を IScene にキャストすると Control と同じように GetSceneScale を使って取り出せます。
var Scale := (Form1 as IScene).GetSceneScale;
4.TDisplay.Scale
TDisplay.Scale プロパティを使うとディスプレイ毎の Scale を取り出せます。
TDisplay の取得方法はいくつかありますが、ここでは Screen.DisplayFromForm を使いました。
これは引数で指定した Form が表示されている Display を返すメソッドです。
var Scale := Screen.DisplayFromForm(Form1).Scale
まとめ
一番簡単なのは TControl.Scene.GetSceneScale を使う方法です。
つぎに簡単なのは TForm を IScene として使う方法です。
Display 毎の Scale が必要な場合は Screen から Display を取り出して使います(Screen.Displays プロパティを使えば任意の Display を取り出せます)。
IFMXScreenService は正統な方法だと思いますが、他の3つの方法があれば、これを使う機会はあまり無さそうです。