Unterstützung für mehrere Displays

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu FireMonkey-Anwendungsdesign


FireMonkey unterstützt automatisch die Ausführung von Anwendungen auf mehreren Displays. Sie müssen programmseitig keine Vorkehrungen für die Unterstützung der Ausführung einer FireMonkey-Anwendung auf mehreren Displays treffen. FireMonkey verwaltet effektiv das Layout der Benutzeroberfläche der Anwendung auf mehreren Displays. Beispielsweise werden Menüs, Dialogfelder und andere Popup-Steuerelemente auf demselben Display wie das übergeordnete Formular geöffnet. Die Multi-Display-Unterstützung im FireMonkey-Framework entspricht der Unterstützung für mehrere Bildschirme in VCL-Anwendungen.

In der Klasse TScreen sind Methoden und Eigenschaften für den Zugriff auf Parameter von mehreren Displays definiert. Ihre Anwendung erstellt automatisch eine globale Screen-Variable mit dem Typ TScreen. Screen kapselt den Status des Bildschirms, auf dem die Anwendung angezeigt wird. Mit Screen rufen Sie eine Liste der Displays (aus denen der Desktop zusammengesetzt ist) und Koordinaten, Dimensionen und andere Eigenschaften dieser Displays ab. Die Eigenschaft DisplayCount gibt die Anzahl der Displays zurück, und Displays ermöglicht den Zugriff auf Eigenschaften aller Displays. Alle Koordinaten sind virtuelle Bildschirmkoordinaten. Virtuelle Bildschirmkoordinaten sind relativ zum primären Display und werden in Pixel gemessen. Der virtuelle Bildschirm ist ein Rechteck, das alle Displays, aus denen der Desktop zusammengesetzt ist, umgibt.

Beispielsweise können Sie mit Code wie dem folgenden Parameter von mehreren Displays abrufen:

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.

Wenn Sie diesen Code ausführen und die Anwendung auf das sekundäre Display verschieben, kann in Memo1 die folgende Ausgabe angezeigt werden:

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) 

In der obigen Ausgabe wurden einige, auf das sekundäre Display bezogene Parameter in Fettschrift markiert.

Siehe auch