2016-03-18 5 views
3

Ich habe mit einer Schaltfläche „Öffnen“, die eine andere Form öffnet, wie dies eine Delphi 7 Hauptformular befindet:Multimonitor - Öffnen Sie das Anwendungsfenster auf dem Monitor in dem Mauszeiger

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    try 
    Application.CreateForm(TfrmPswd, frmPswd); 
    Application.NormalizeTopMosts; 
    Application.ProcessMessages; 
    frmPswd.ShowModal; 
    finally 
    frmPswd.Release; 
    frmPswd := nil; 
    end; 
end; 

Auf der frmPswd OnCreate Ereignis ich versuche, es zu zentralisieren, je nach Monitor, auf dem Mauszeiger befindet, wie folgt aus:

procedure TfrmPswd.FormCreate(Sender: TObject); 
var 
    Monitor: TMonitor; 
begin 
    Monitor := Screen.MonitorFromPoint(Mouse.CursorPos); 
    frmPswd.Top := Round((Monitor.Height - frmPswd.Height)/2); 
    frmPswd.Left := Round((Monitor.Width - frmPswd.Width)/2); 
end; 

Wenn das Hauptformular in demselben Monitor wie der Maus-Cursor befindet, öffnet sich frmPswd Form wie erwartet, in das Zentrum dieses Monitors. Aber wenn das Hauptformular in einem Monitor anders als Maus ist, erscheint frmPswd in einer seltsamen Position, die ich nicht verstehen kann, warum.

EDIT:

Hier sind die Ergebnisse wie von Remy Lebeau gefragt, auch mit dem neuen Code:

Monitor := Screen.MonitorFromPoint(Mouse.CursorPos); 
Self.Left := Monitor.Left + ((Monitor.Width - Self.Width) div 2); 
Self.Top := Monitor.Top + ((Monitor.Height - Self.Height) div 2); 

Monitor 0 
Top: 0 
Left: 0 
Width: 1440 
Height: 900 

Monitor 1 
Top: -180 
Left: -1920 
Width: 1920 
Height: 1080 

frmPswd.Width = 200 
frmPswd.Height = 200 

Main form in Monitor 0 and Mouse cursor in Monitor 0 
frmPswd.Top = 350 
frmPswd.Left = 620 

Main form in Monitor 1 and Mouse cursor in Monitor 1 
frmPswd.Top = 260 
frmPswd.Left = -1060 

Main form in Monitor 0 and Mouse cursor in Monitor 1 
frmPswd.Top = 440 
frmPswd.Left = 860 

Main form in Monitor 1 and Mouse cursor in Monitor 0 
frmPswd.Top = 170 
frmPswd.Left = -1300 
+2

Die anderen Monitor ist wahrscheinlich nicht bei (0, 0), dessen Offset hinzuzufügen. Also form.left = monitor.left + ..... –

+0

Übrigens, es ist keine gute Idee, die Maus als bestimmenden Faktor für die Formularplatzierung zu verwenden. Sie können Ihr Programm mit der Tastatur über die Verknüpfung auf dem Hauptmonitor starten und sich fragen, wo das Anmeldeformular verschwunden ist. –

+0

@SertacAkyuz, danke für die Antwort. Du hast recht, zweiter Monitor oben links ist nicht (0, 0). aber wenn frmPswd.Left: = Monitor.Left + Round ((Monitor.Width - frmPswd.Width)/2) Ich habe dasselbe Problem :( – Guybrush

Antwort

3

Sie sollten nicht Application.CreateForm() wie diese verwendet werden. Verwenden Sie stattdessen TfrmPswd.Create(). Und verwenden Sie Free() anstelle von Release().

Befreien Sie sich von Application.NormalizeTopMosts() und Application.ProcessMessages() Anrufe, sie gehören nicht in diesen Code überhaupt.

Verwenden Sie in Ihrem OnCreate Ereignis Self anstelle der globalen frmPswd Variable.

Und Sie müssen die Monitor.Left und Monitor.Top Offsets zu Ihren neuen Koordinaten hinzufügen, um Monitore zu berücksichtigen, die nicht bei Offset 0,0 des Virtual Screen starten.

Versuchen Sie, etwas mehr wie folgt aus:

procedure TForm1.Button1Click(Sender: TObject); 
var 
    frm: TfrmPswd; 
begin 
    frm := TfrmPswd(nil); 
    try 
    frm.ShowModal; 
    finally 
    frm.Free; 
    end; 
end; 

procedure TfrmPswd.FormCreate(Sender: TObject); 
var 
    Monitor: TMonitor; 
begin 
    Monitor := Screen.MonitorFromPoint(Mouse.CursorPos); 
    Self.Left := Monitor.Left + ((Monitor.Width - Self.Width) div 2); 
    Self.Top := Monitor.Top + ((Monitor.Height - Self.Height) div 2); 
end; 
+0

danke! Ich werde Tests machen! Btw, ich habe die Frage mit den Positionsergebnissen meiner Tests bearbeitet ... – Guybrush

+0

Leider habe ich die gleichen Ergebnisse mit Self statt frmPswd :(Btw, die Ergebnisse, die ich in die Frage mit einbezog, benutze Monitor.Left + ... und Monitor .Top + ... Bitte, jede andere Idee? – Guybrush

+0

'Mouse.CursorPos' verwendet die Win32' GetCursorPos() '-Funktion, die von DPI und LargeAddress Problemen betroffen ist. Versuchen Sie mit dem Win32' GetCursorInfo() 'oder' GetPhysicalCursorPos () 'Funktionen statt. –

Verwandte Themen