複数ディスプレイのサポート

提供: RAD Studio
移動先: 案内検索

FireMonkey アプリケーションの設計 への移動


FireMonkey では、複数ディスプレイでのアプリケーションの実行を自動的にサポートします。FireMonkey 複数ディスプレイ アプリケーションを動作させるためのプログラミングを特に実装する必要はありません。FireMonkey では、アプリケーションのユーザー インターフェイスの複数ディスプレイでのレイアウトを効果的に管理します。たとえば、メニュー、ダイアログ ボックス、その他のポップアップ コントロールは親フォームと同じディスプレイ上に開かれます。FireMonkey フレームワークでの複数ディスプレイのサポートは、VCL アプリケーションでのマルチモニタのサポートと似ています。


TScreen クラスには、複数ディスプレイのパラメータにアクセスできるようにするメソッドやプロパティが定義されていることに注意してください。アプリケーションでは、TScreen 型のグローバル変数 Screen が自動的に作成されます。Screen は、アプリケーションが動作している画面の状態をカプセル化したものです。Screen を使用すると、(デスクトップを構成するのに使用されている)ディスプレイのリストと、それらのディスプレイの座標や寸法などのプロパティを取得できます。DisplayCount プロパティはディスプレイの数を返します。また、Displays プロパティにより、すべてのディスプレイのプロパティにアクセスできます。座標はすべて、仮想画面座標です。仮想画面座標は、主ディスプレイを基準とする相対座標で、ピクセル単位で測定されます。仮想画面は、デスクトップを構成するのに使用されているすべてのディスプレイの境界となる四角形です。

たとえば、次のようなコードを使用して複数ディスプレイのパラメータを取得できます。

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
  private
    procedure UpdateMemo;
    function RectToStr(R: TRect): String;
    function DispToStr(Disp: TDisplay): String;
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

function TForm1.RectToStr(R: TRect): String;
begin
  Result := '(' + Inttostr(R.Left) + ',' + Inttostr(R.Top) + ' x ' + Inttostr(R.Width) + ',' + Inttostr(R.Height) + ')';
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Screen.UpdateDisplayInformation;
  if (Screen.DisplayCount > 0) and (Screen.Displays[Screen.DisplayCount - 1].Index > 0) then
    Timer1.Tag := Timer1.Tag + 1;
  UpdateMemo;
end;

function TForm1.DispToStr(Disp: TDisplay): String;
begin
    Result := Inttostr(Disp.Index) + '. ';
    if Disp.Primary then
      Result := Result + ' Primary ';
    Result := Result + SLineBreak;
    Result := Result + 'WorkAreaRect: ' + RectToStr(Disp.WorkareaRect) + '; ';
    Result := Result + SLineBreak;
    Result := Result + 'BoundsRect: ' + RectToStr(Disp.BoundsRect) + '; ';
end;

procedure TForm1.UpdateMemo;
var
  I: Integer;
  P: TPoint;
begin
  Memo1.Lines.Clear;
  P := TPoint.Create(Round(Screen.MousePos.X), Round(Screen.MousePos.Y));
  Memo1.Lines.Add('Screen');
  Memo1.Lines.Add('MousePos: ' + FloatToStr(P.X) + ' ' + FloatToStr(P.Y));
  Memo1.Lines.Add('DisplayFromForm(Self).Index: ' + Inttostr(Screen.DisplayFromForm(Self).Index));
  Memo1.Lines.Add('Size.cx: ' + IntToStr(Screen.Size.cx));
  Memo1.Lines.Add('Size.cy: ' + IntToStr(Screen.Size.cy));
  Memo1.Lines.Add('DisplayCount: ' + Inttostr(Screen.DisplayCount));
  Memo1.Lines.Add('WorkAreaRect: ' + RectToStr(Screen.WorkAreaRect));
  Memo1.Lines.Add('DesktopRect: ' + RectToStr(Screen.DesktopRect));
  Memo1.Lines.Add('Displays');
  for I := 0 to Screen.DisplayCount - 1 do
    Memo1.Lines.Add(DispToStr(Screen.Displays[I]));
  Memo1.Lines.Add('Form');
  Memo1.Lines.Add('BoundsRect: ' + RectToStr(TRect.Create(TPoint.Create(Left, Top), Width, Height)));
end;
end.

上記のコードを実行し、アプリケーションを副ディスプレイに移動した場合、Memo1 には次のような出力が表示されます。

Screen
MousePos: 1530 294
DisplayFromForm(Self).Index: 1
Size.cx: 1280
Size.cy: 1024
DisplayCount: 2
WorkAreaRect: (0,0 x 1280,1024)
DesktopRect: (0,0 x 2560,1024)
Displays
0.  Primary
WorkAreaRect: (0,0 x 1280,1024);
BoundsRect: (0,0 x 1280,1024);
1.
WorkAreaRect: (1280,0 x 1280,1024);
BoundsRect: (1280,0 x 1280,1024);
Form
BoundsRect: (1472,199 x 648,507)

ここでは、副ディスプレイに関係するいくつかのパラメータを太字で強調表示していることに注意してください。

関連項目