2 Monitore nutzen, Startet immer auf dem Hauptmonitor

Antworten
MmVisual
Beiträge: 1466
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

2 Monitore nutzen, Startet immer auf dem Hauptmonitor

Beitrag von MmVisual »

Hallo,

Ich nutze 2 Monitore und möchte dass die EXE immer mit der Position des letzten Beendens wieder startet. Also wenn die EXE zuvor auf dem Nebenmonitor lief, so muss die dort beim nächsten Start auch wieder erscheinen. Leider klappt das nicht so recht. Anbei mein Code:

Code: Alles auswählen

      sl.LoadFromFileUTF8(sFileTable);
      rcForm.Left := StrToIntDef(sl.Values['frmMain.Left'], Left);
      rcForm.Top := StrToIntDef(sl.Values['frmMain.Top'], Top);
      rcForm.Right := Max(480, StrToIntDef(sl.Values['frmMain.Width'], Width));
      rcForm.Bottom := Max(240, StrToIntDef(sl.Values['frmMain.Height'], Height));
      If Screen.MonitorCount > 1 Then
      Begin
        Mon := Screen.MonitorFromRect(rcForm);
      End Else Begin
        Mon := Screen.Monitors[0];
      end;
      rcMon := Mon.WorkareaRect;
 
      if rcForm.Left < rcMon.Left then
        rcForm.Left := rcMon.Left;
      if rcForm.Top < rcMon.Top then
        rcForm.Top := rcMon.Top;
      if rcForm.Right > rcMon.Right - rcMon.Left then
        rcForm.Right := rcMon.Right - rcMon.Left;
      if rcForm.Bottom > rcMon.Bottom - rcMon.Top then
        rcForm.Bottom := rcMon.Bottom - rcMon.Top;
      if (rcForm.Left + rcForm.Right) > rcMon.Right then
        rcForm.Left := rcMon.Right - rcForm.Right;
      if (rcForm.Top + rcForm.Bottom) > rcMon.Bottom then
        rcForm.Top := rcMon.Bottom - rcForm.Bottom;
 
      SetBounds(rcForm.Left, rcForm.Top, rcForm.Right, rcForm.Bottom);
      stWindowForm := TWindowState(StrToIntDef(sl.Values['frmMain.WindowState'], Ord(WindowState)));
      WindowState := stWindowForm;


Zu Beginn wird die Variable rcForm.Left mit dem korrekten Wert 2700 Pixel geladen, der Wert wird auch mit SetBounds() übergeben, aber dennoch tut Lazarus die auf den ersten Monitor zeigen. Ich habe ansonsten so gut wie keine Infos mit Google gefunden, daher frage ich mal hier.

Weiß jemand wo ich den Fehler habe?
Oder muss ich dem Formular noch extra sagen, dass er es auf dem zweiten Monitor zeichnen soll?
Oder ist das ein Fall für den Bugtracker?

Grüße Markus.
EleLa - Elektronik Lagerverwaltung - www.elela.de

Antrepolit
Beiträge: 340
Registriert: Di 12. Sep 2006, 08:57
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Re: 2 Monitore nutzen, Startet immer auf dem Hauptmonitor

Beitrag von Antrepolit »

Und in welchem Ereignishandler des Forms rufst du deinen Code auf?
Grüße, Antrepolit

care only if your os is really burning

MmVisual
Beiträge: 1466
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: 2 Monitore nutzen, Startet immer auf dem Hauptmonitor

Beitrag von MmVisual »

Im FormCreate. Hat bisher auch immer gut funktioniert, bis ich mir einen zweiten Monitor zugelegt habe :wink:

PS: Der Code klappt auch nicht sauber mit Linux, daher ist der Monitor-Teil für Linux jetzt auskommentiert:

Code: Alles auswählen

      {$ifdef LINUX}
      rcMon := Screen.WorkAreaRect;
      {$else}
      If Screen.MonitorCount > 1 Then
      Begin
        Mon := Screen.MonitorFromRect(rcForm); // Monitor herausfinden
      End Else Begin
        Mon := Screen.Monitors[0];
      end;
      rcMon := Mon.WorkareaRect;
      {$endif}
EleLa - Elektronik Lagerverwaltung - www.elela.de

Antrepolit
Beiträge: 340
Registriert: Di 12. Sep 2006, 08:57
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Re: 2 Monitore nutzen, Startet immer auf dem Hauptmonitor

Beitrag von Antrepolit »

Versuch das mal ins OnShow-Event auszulagern. OnCreate wird doch noch recht früh aufgerufen.
Grüße, Antrepolit

care only if your os is really burning

Heinrich Wolf
Beiträge: 323
Registriert: Di 12. Apr 2011, 13:21
OS, Lazarus, FPC: WinXP + VMWare Player mit Fedora14, L 1.1, FPC 2.7.1
CPU-Target: 1core 1,8GHz 32Bit
Wohnort: Fürth
Kontaktdaten:

Re: 2 Monitore nutzen, Startet immer auf dem Hauptmonitor

Beitrag von Heinrich Wolf »

OnShow wird aber vielfach zur Laufzeit aufgerufen. Es gibt auch ein OnFirstShow event. Dazu weist man in OnCreate einen Handler zu.

MmVisual
Beiträge: 1466
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: 2 Monitore nutzen, Startet immer auf dem Hauptmonitor

Beitrag von MmVisual »

Ein OnFirstShow habe ich nicht gefunden.
Aber wenn ich das im Timer, kurz nach dem Start mache, dann klappt das.
EleLa - Elektronik Lagerverwaltung - www.elela.de

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2640
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: 2 Monitore nutzen, Startet immer auf dem Hauptmonitor

Beitrag von m.fuchs »

MmVisual hat geschrieben:Ein OnFirstShow habe ich nicht gefunden.

Das gibt es auch nicht, muss man über den Umweg AddHandlerFirstShow machen:

Code: Alles auswählen

type
  TForm1 = class(TForm)
    private
      procedure Lalala(Sender: TObject);
    public
      procedure FormCreate(Sender: TObject);
  end;
 
  (* ... *)
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  Form1.AddHandlerFirstShow(@Lalala);
end;
 
procedure TForm1.Lalala(Sender: TObject);
begin
  ShowMessage('Lalala');
end;               
 
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

MmVisual
Beiträge: 1466
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: 2 Monitore nutzen, Startet immer auf dem Hauptmonitor

Beitrag von MmVisual »

Klappt dennoch nicht. Der FirstShow wird zwar aufgerufen, dennoch wird das Formular nicht auf dem zweiten Monitor gezeigt.
Ich vermute da ein Bug in Lazarus.
EleLa - Elektronik Lagerverwaltung - www.elela.de

Antworten