1 Programm - 2 Bildschirme

Für Fragen rund um die Ide und zum Debugger
Antworten
MrChey
Beiträge: 2
Registriert: Fr 24. Mai 2019, 11:41
OS, Lazarus, FPC: Lazarus 2.0.12, FireBird, MariaDB
Wohnort: Westerwald und Allgäu

1 Programm - 2 Bildschirme

Beitrag von MrChey »

Servus @All,
ich hätte da mal ein kleines Problem:
Ich schreibe derzeit an einem Programm, welches aus einem BarCode den GesamtPreis ausliest, abspeichert und
an einen Bezahlautomaten übergibt. Funktioniert alles.
Nur: Ich würde gerne eine zweite Form auf einem zweiten Monitor anzeigen lassen, wo der Kunde quasi den
Zahlbetrag, Gegebenen Betrag und das Rückgeld, sowie eventuell etwas Werbung (ipg, etc.) sehen kann.
Habe zwar mit "screen.MonitorCount" die Anzahl meiner Monitore anzeigen können, weiss aber jetzt aber leider
nicht weiter, wie ich "Form2" auf "Monitor2" anzeigen lassen kann.
Kann mir da jemand einen Tip geben?

hum4n0id3
Beiträge: 301
Registriert: So 5. Mai 2019, 15:23

Re: 1 Programm - 2 Bildschirme

Beitrag von hum4n0id3 »

Hallo!

Du könntest versuchen die Positionen Top und Left der jeweiligen Form händisch zu stellen. Wenn du weißt wie groß die Monitore sind (zb. 1920x1080) kannst du die Form2->Left auf über 1920 setzen. Somit erscheint es auf Desktop2.

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: 1 Programm - 2 Bildschirme

Beitrag von Socke »

In der Unit Forms hast du über die globale Variable Screen Zugriff auf die Bildschirminformationen.
Damit kannst du dann die Position der Forms selbst setzen.

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
  Msg: String;
begin
 // aktuelle Informationen vom OS abfragen,
 // falls Bildschirme während der Programmlaufzeit angeschlossen/entfernt wurden
 Screen.UpdateMonitors;
 for i := 0 to Screen.MonitorCount - 1 do
 begin
   Msg := Format('Monitor %d: %dx%d X:%d Y:%d', [
     i,
     Screen.Monitors[i].Width,
     Screen.Monitors[i].Height,
     Screen.Monitors[i].Left,
     Screen.Monitors[i].Top
   ]);
   ListBox1.AddItem(Msg, nil);
 end;
end;
Ergibt bei mir z.B.

Code: Alles auswählen

Monitor 0: 1920x1080 X:0 Y:0
Monitor 1: 1440x900 X:1920 Y:0
Nachtrag:
Gerade habe ich die Methode MakeFullyVisible entdeckt.
Du kannst also auch schreiben:

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject);
begin
  if Screen.MonitorCount >= 2 then
    Self.MakeFullyVisable(Screen.Monitor[1]);
end;
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

MrChey
Beiträge: 2
Registriert: Fr 24. Mai 2019, 11:41
OS, Lazarus, FPC: Lazarus 2.0.12, FireBird, MariaDB
Wohnort: Westerwald und Allgäu

Re: 1 Programm - 2 Bildschirme

Beitrag von MrChey »

Hallo Ihr zwei Beiden,

vielen lieben Dank für Eure Hilfe.

Ich habe es jetzt so gelöst:

1. In der Haupt-Form:

Code: Alles auswählen

procedure TForm1.FormShow(Sender: TObject);
begin
     if Screen.MonitorCount > 1  then
     begin
       Form3.Left:=Screen.Monitors[2].Left;
       Form3.Show;
     end;
 end;
 
2. In der Anzeige-Form:

Code: Alles auswählen

procedure TForm3.FormCreate(Sender: TObject);
begin
  Form3.Color:=clLime;
  Form3.WindowState:=wsMaximized;
end;                              
Bin zwar noch nicht so ganz glücklich, aber dann muss ich schauen, dass die "Anzeigen-Monitore" die gleiche Größe/Auflösungen haben. Aber das sollte kein Problem sein. :lol:

Antworten