Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi [FMX] Screenauflösung und Monitore (https://www.delphipraxis.net/177228-%5Bfmx%5D-screenaufloesung-und-monitore.html)

stahli 25. Okt 2013 17:49

[FMX] Screenauflösung und Monitore
 
Gibt es Möglichkeiten, unter FMX (unter Windows reicht) die Screen- bzw. Monitorauflösungen zu ermitteln?

Bernhard Geyer 25. Okt 2013 17:53

AW: [FMX] Screenauflösung und Monitore
 
Notfalls direkt über die WinAPI wenn du Forms und Co. nicht einbinden willst:

http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx

RWarnecke 25. Okt 2013 18:37

AW: [FMX] Screenauflösung und Monitore
 
Für die Horizontalen Pixel nutze ich :
Delphi-Quellcode:
function TDisplayInfo.GetHorzPixel: integer;
var
  DevMode: TDeviceMode;
begin
  result := 0;
  DevMode.dmSize := SizeOf(DevMode);
  if EnumDisplaySettings(PChar('\\.\Display' + IntToStr(FIndexDisplay + 1)), ENUM_CURRENT_SETTINGS, DevMode) then
    result := DevMode.dmPelsWidth;
end;
Für die Vertikalen Pixel nutze ich :
Delphi-Quellcode:
function TDisplayInfo.GetVerPixel: integer;
var
  DevMode: TDeviceMode;
begin
  result := 0;
  DevMode.dmSize := SizeOf(DevMode);
  if EnumDisplaySettings(PChar('\\.\Display' + IntToStr(FIndexDisplay + 1)), ENUM_CURRENT_SETTINGS, DevMode) then
    result := DevMode.dmPelsHeight;
end;
Oder Du schaust mal, ob dieses Beispiel funktioniert.

Thom 25. Okt 2013 21:35

AW: [FMX] Screenauflösung und Monitore
 
Delphi-Quellcode:
uses
  FMX.Forms, FMX.Platform;

type
  TScreenHelper = class helper for TScreen
  private
    function GetHeight: Single;
    function GetSize: TSizeF;
    function GetWidth: Single;
  public
    property Height: Single read GetHeight;
    property Size: TSizeF read GetSize;
    property Width: Single read GetWidth;
  end;

function TScreenHelper.GetHeight: Single;
begin
  Result:=Size.cy;
end;

function TScreenHelper.GetSize: TSizeF;
var
  ScreenService: IFMXScreenService;
begin
  if TPlatformServices.Current.SupportsPlatformService(IFMXScreenService,IInterface(ScreenService))
    then Result:=ScreenService.GetScreenSize
    else Result:=TPointF.Create(0,0);
end;

function TScreenHelper.GetWidth: Single;
begin
  Result:=Size.cx;
end;

stahli 25. Okt 2013 22:41

AW: [FMX] Screenauflösung und Monitore
 
Danke Euch!

Ich habe mir mal aus Rolfs Beispiel ein paar Funktionen abgeleitet.
Damit kann ich beim Projektstart zwei Formulare ganz gut am Monitor ausrichten.
Ist so schon recht komfortabel.

Gut wäre noch, die Höhe der Taskbar zu erkennen (ist aber nicht unheimlich wichtig).

Delphi-Quellcode:
procedure TFormLayoutTest.FormCreate(Sender: TObject);
var
  Mon: Integer;

  function GetMonLeft(Mon: Integer): Integer;
  var
    DevMode: TDeviceMode;
    I: Integer;
  begin
    Result := 0;
    DevMode.dmSize := SizeOf(DevMode);
    I := 1;
    while EnumDisplaySettings(PChar('\\.\Display' + IntToStr(I)), $FFFFFFFF,
      DevMode) do
    begin
      if I = Mon then
        Exit
      else
      begin
        Result := Result + Integer(DevMode.dmPelsWidth);
        Inc(I);
      end;
    end;
  end;

  function GetMonWidth(Mon: Integer): Integer;
  var
    DevMode: TDeviceMode;
    I: Integer;
  begin
    Result := 0;
    DevMode.dmSize := SizeOf(DevMode);
    I := 1;
    while EnumDisplaySettings(PChar('\\.\Display' + IntToStr(I)), $FFFFFFFF,
      DevMode) do
    begin
      if I = Mon then
        Exit(Integer(DevMode.dmPelsWidth))
      else
        Inc(I);
    end;
  end;

  function GetMonTop(Mon: Integer): Integer;
  var
    DevMode: TDeviceMode;
    I: Integer;
  begin
    Result := 0;
    DevMode.dmSize := SizeOf(DevMode);
    I := 1;
    while EnumDisplaySettings(PChar('\\.\Display' + IntToStr(I)), $FFFFFFFF,
      DevMode) do
    begin
      if I = Mon then
        Exit
      else
      begin
        Result := Result + Integer(DevMode.dmPelsHeight);
        Inc(I);
      end;
    end;
  end;

  function GetMonHeight(Mon: Integer): Integer;
  var
    DevMode: TDeviceMode;
    I: Integer;
  begin
    Result := 0;
    DevMode.dmSize := SizeOf(DevMode);
    I := 1;
    while EnumDisplaySettings(PChar('\\.\Display' + IntToStr(I)), $FFFFFFFF,
      DevMode) do
    begin
      if I = Mon then
        Exit(Integer(DevMode.dmPelsHeight))
      else
        Inc(I);
    end;
  end;

begin
{$WARN SYMBOL_PLATFORM OFF}
  if DebugHook <> 0 then
    Mon := 3
  else
    Mon := 1;
{$WARN SYMBOL_PLATFORM ON}
  Left := GetMonLeft(Mon);
  Top := 0;

  // Exit;
  // ShowMessage(IntToStr(GetHorzPixel) + '*' + IntToStr(GetVertPixel));

  FormLayoutTestEdit := TFormLayoutTestEdit.Create(Self);
  FormLayoutTestEdit.Top := 0;
  FormLayoutTestEdit.Width := GetMonWidth(Mon) div 2;
  FormLayoutTestEdit.Height := GetMonHeight(3);
  FormLayoutTestEdit.Left := GetMonLeft(Mon) + GetMonWidth(Mon) -
    FormLayoutTestEdit.Width;
  FormLayoutTestEdit.Show;
  PaintLayout := ssLayout1;
end;

Der schöne Günther 28. Okt 2013 10:02

AW: [FMX] Screenauflösung und Monitore
 
Ich bin ganz verwirrt und frage dumm dazwischen: Gibt es eigentlich einen Grund, dass es unter der VCL noch
Delphi-Quellcode:
Vcl.Forms.TMonitor
gab, bei FireMonkey allerdings nicht mehr?

Bernhard Geyer 28. Okt 2013 10:07

AW: [FMX] Screenauflösung und Monitore
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1233372)
Ich bin ganz verwirrt und frage dumm dazwischen: Gibt es eigentlich einen Grund, dass es unter der VCL noch
Delphi-Quellcode:
Vcl.Forms.TMonitor
gab, bei FireMonkey allerdings nicht mehr?

Ja. FMX.Platform.TPlatformServices.SupportsPlatformSer vice übernimmt jetzt die Aufgabe TMonitor-Klasse.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:48 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz