Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Formular auf zweitem Monitor starten? (https://www.delphipraxis.net/191196-formular-auf-zweitem-monitor-starten.html)

a.def 19. Dez 2016 09:02

Formular auf zweitem Monitor starten?
 
Ich habe jetzt endlich mal meinen zweiten Monitor angeschlossen um eine Funktionalität prüfen zu können.
Leider ging das total in die Hose denn das gewünschte Ergebnis bleibt aus.

In einer Datei sind die Koordinaten meines Formulars gespeichert (es ist in etwa -1600 und 100). Mein Formular war auf dem Monitor LINKS neben meinem Hauptmonitor.

Folgende Funktion sollte nun eigentlich mein Formular auf den zweiten Monitor bringen, tut es aber nicht.
Fast alles was die Ini-Datei angeht habe ich rausgenommen.
Die Variablen X und Y haben am Ende genau die Werte die sie haben sollen nämlich -1600 und 100.
Woran liegt es, dass das Hauptformular frmMain nicht auf dem zweiten Monitor gestartet wird so wie die Variablen X und Y es vorsehen?
loadFOrmPosition rufe ich im FormCreate auf genau so dort Width und Height gesetzt.

Delphi-Quellcode:
procedure loadFormPosition(aFormToSetPos: TForm; sIniSection: string);
var
 x, y: Integer;
 aScreen: TMonitor;
begin
  aScreen := Screen.MonitorFromWindow(frmMain.Handle);
 
  // if IniF.ValueExists(sIniSection, 'posx') and IniF.ValueExists(sIniSection, 'posy') then
  // (alles was die Ini angeht, habe ich der Einfachheit halber rausgenommen)
  // >> Wenn in Ini-Datei die Werte posx und posy vorhanden sind, Position zu poDesigned setzen (verhindert hässliches Flickern unter Windows XP)
   begin
    aFormToSetPos.Position := poDesigned;

    x := IniF.ReadInteger(sIniSection, 'posx', (aScreen.Width - aFormToSetPos.Width) div 2);
    y := IniF.ReadInteger(sIniSection, 'posy', (aScreen.Height - aFormToSetPos.Height) div 2);
   end
  else
   begin
    // Wenn Werte nicht vorhanden, dann zentriere das Formular auf dem Hauptmonitor
    x := (aScreen.Width - aFormToSetPos.Width) div 2;
    y := (aScreen.Height - aFormToSetPos.Height) div 2;
   end;

  aFormToSetPos.Left := x; // -1600
  aFormToSetPos.Top := y; // 100
end;

Jumpy 19. Dez 2016 09:29

AW: Formular auf zweitem Monitor starten?
 
Mach doch mal ein Formular, dass du auf dem Bildschirmen hin und herschieben kannst mit einem Button, der bei Betätigung Top und Left in ein Memo oder so schreibt.

a.def 19. Dez 2016 09:33

AW: Formular auf zweitem Monitor starten?
 
Habe ich gerade mal gemacht.
Es werden immer die korrekten Koordinaten in das Memo geschrieben.
Also positive und negative Werte auf der x-Achse.

Beim Laden ist mir jetzt aufgefallen, dass das Hauptformular immer nur wieder auf dem Hauptbildschirm zentriert ausgegeben wird, wenn der Wert der x-Achse so weit negativ ist, dass das ganze Formular NICHT mehr auf dem Hauptmonitor wäre.
-500 z.B. (halb auf Monitor 1 und 2) funktioniert.

himitsu 19. Dez 2016 10:25

AW: Formular auf zweitem Monitor starten?
 
Erst beim Anzeigen der Form (Show bzw. Visible=True) werden die Property DefaultMonitor und Position ausgewertet.
Will man sowas "manuell" vor dem Anzeigen setzen, dann sollte Position=poDesignd und DefaultMonitor=dmDesktop eingestellt sein, sonst überschreibt die böse VCL deine Vorgaben, weil sie zu blöd ist das bereits im Constructor zu erledigen.

a.def 19. Dez 2016 12:31

AW: Formular auf zweitem Monitor starten?
 
Zitat:

Erst beim Anzeigen der Form (Show bzw. Visible=True) werden die Property DefaultMonitor und Position ausgewertet.
Danke für die Information.
Das bedeutet dann wohl auch leider, dass man unter Windows XP das gewisse Flickern, wenn das Formular platziert wird, nicht weg bekommt auf diese Weise.

Ich habe nun Position auf poDesigned gesetzt - im Objektinspektor.
DefaultMonitor habe ich auf ActiveForm gelassen.

Ich hatte Position zwar schon auf poDesigned gesetzt, aber erst im OnCreate was wohl nicht die richtige Stelle war. Nun die Änderung im Objektinspektor brachte das gewünschte Ergebnis.
Dank meiner folgenden Prozedur wird ein Formular immer auf den Hauptmonitor zentriert ausgegeben, wenn es irgendwo im Nirvana rumfliegt

Delphi-Quellcode:
 if Screen.MonitorFromWindow(aFormToSetPos.Handle, mdNull) = nil then
  begin
   // Form is outside of any monitor. Move to center of main monitor
   aFormToSetPos.Top := (Screen.Height - aFormToSetPos.Height) div 2;
   aFormToSetPos.Left := (Screen.Width - aFormToSetPos.Width) div 2;
  end;

ConnorMcLeod 19. Dez 2016 13:56

AW: Formular auf zweitem Monitor starten?
 
Screen ist die Gesamtheit aller Monitore. Um sicherzugehen würde ich das so formulieren:
Delphi-Quellcode:
aFormToSetPos.Top := (Screen.Monitors[0].Height - Screen.Monitors[0].Height) div 2;
etc.

a.def 19. Dez 2016 16:07

AW: Formular auf zweitem Monitor starten?
 
Danke für den Hinweis.
Sicher ist sicher.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:30 Uhr.

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