![]() |
Ein Formular für alle Monitore, Hilfe bitte
Guten morgen,
ich benötige ein Formular das sich auf allen Monitoren ausbreitet. Da dies komplettes Neuland für mich ist habe ich leider noch gar keinen Ansatz wie man so etwas bewerkstelligt. Wenn jemand einen Tipp oder gar eine Lösung hat, bitte teile Dein Wissen mit mir :-) Vielen Dank für's Lesen! Mein aktueller Quelltext der leider nur für den primären Monitor funktioniert:
Delphi-Quellcode:
Ps: Dies ist ein Borderless Window
procedure TForm1.FormShow(Sender: TObject);
begin Self.Left := 0; Self.Top := 0; Self.ClientHeight := Screen.Height; Self.ClientWidth := Screen.Width; end; |
AW: Ein Formular für alle Monitore, Hilfe bitte
Liste der Anhänge anzeigen (Anzahl: 1)
Wie soll das mit einem rechteckigen Formular gehen wenn ich meine Monitore z.B. so angeordnet habe?
Anhang 52966 Mach doch einfach eins für jeden Monitor. |
AW: Ein Formular für alle Monitore, Hilfe bitte
Was Du suchst ist der Desktop, nicht der Screen.
Aber, wie Günther schon sagte: es gibt "unendlich" viele Kombinationen an möglichen Bildschirmen. Portrait und Landscape und Dutzende mögliche Auflösungen. Und selbst bei zwei identischen hat oft nur einer die Windows-Startleiste. Wenn ich mich recht erinnere, hat TApplication ein array aller Screens, darüber lässt sich Plazierung der einzelnen Formulare (und vorige Regelung, wie viele es gibt) gut regeln. |
AW: Ein Formular für alle Monitore, Hilfe bitte
Ist doch ganz einfach und bei unterschíedlichen Bildschirmgrößen oder Bildschirmauflösungen garantiert unbrauchbar ;-)
Gehen wir davon aus, dass die Bildschirme nebeneinander stehen:
Delphi-Quellcode:
Sind sie übereinander angeordnet, müssen Width und Height vertauscht werden.
Self.Width := 0;
Self.Height := Screen.Heigth; for i := 0 to Screen.MonitorCount -1 do begin Self.Width := Self.Width + Screen.Monitors[i].Width; Self.Height := Min(Self.Height,Screen.Monitors[i].Height); end; Bei 'ner aus mehreren Bildschirmen neben- und übereinander aufgebauten Fläche, klappt das natürlich nicht. Dann muss man wissen, wieviele Bildschirme über- bzw. nebeneinander angeordnet sind. Beschreibe doch bitte einfach erstmal, wofür Du die Problemlösung suchst und von welchen Gegebenheiten wir bei der Lösungssuche ausgehen müssen. Zahl der Bildschirme, Art der Bildschirme? z. B. Aus Bildschirmen bestehende "Leinwand" von 8 * 4 Bildschirmen, wobei alle Bildschirme vom gleichen Hersteller und vom gleichen Typ sind. Wild zusammengewürfeltes Sammelsorium von Bildschirmen. Keine Ahnung, über wieviele Bildschirme der Softwarenutzer verfügt, welche Modelle und / oder wie sie angeordnet sind. ... |
AW: Ein Formular für alle Monitore, Hilfe bitte
Hallo,
wie wäre es mit:
Delphi-Quellcode:
Ich habe zwei Bildschirme nebeneinander stehen, und es funktioniert.
procedure TForm1.FormCreate(Sender: TObject);
begin Self.Left := 0; Self.Top := 0; Self.Height := Screen.DesktopHeight; Self.Width := Screen.DesktopWidth; end; |
AW: Ein Formular für alle Monitore, Hilfe bitte
Ich hab' den Bildschirm 1 rechts stehen (den mit der Taskbar) und Bildschirm 2 links. Passt das dann auch noch?
Die Admins haben den Bildschirm 1 in der Mitte, Bildschirm 2 steht links und Bildschirm 3 steht rechts. Klappt das dann auch noch? Die Lösungssuche läuft letztlich auf die gleiche Problematik hinaus, die auch hier beim ![]() |
AW: Ein Formular für alle Monitore, Hilfe bitte
Liste der Anhänge anzeigen (Anzahl: 2)
Zitat:
Da Bilder mehr sagen als Worte, im Anhang ist eine GIF Animation die ich als Vorlage für mein Projekt nahm. (tut mir leid, ich musste es komprimieren da: Die Datei, die du anhängen möchtest, ist zu groß. Die maximale Dateigröße für diesen Dateityp beträgt 32,0 KB. Deine Datei ist 148,4 KB groß) Desweiteren ist mein momentaner Stand der Dinge in Binärform angehangen. |
AW: Ein Formular für alle Monitore, Hilfe bitte
Hallo,
@Delphi.Narium Ja, das funktioniert (zumindest hier bei mir). Ich habe das mal folgendermaßen getestet:
Delphi-Quellcode:
HauptMonitor links: Left=0, Top=0, Height=1200, Width=3200
procedure TForm1.FormCreate(Sender: TObject);
begin Left:=Screen.DesktopLeft; Top:=Screen.DesktopTop; Height:=Screen.DesktopHeight; Width:=Screen.DesktopWidth; FormStyle:=fsStayOnTop; end; procedure TForm1.FormPaint(Sender: TObject); begin Label1.Caption:='Left: ' + IntToStr(Left); Label2.Caption:='Top: ' + IntToStr(Top); Label3.Caption:='Height; ' + IntToStr(Height); Label4.Caption:='Width: ' + IntToStr(Width); end; HauptMonitor rechts: Left= -1600, Top=0, Height=1200, Width=3200 |
AW: Ein Formular für alle Monitore, Hilfe bitte
@Kodezwerg
Da das Formular transparent ist, sieht man es ja auch nicht. Damit wäre es doch wurscht, wenn es größer als alle Bildschirme ist. Mit der Maus kann man nur in dem Bereich navigieren, der sichtbar ist. (ok, nicht ganz, man kann die Maus auch aus dem Bildschirm rausschieben. Für den Fall würd' ich noch 'ne Action, 'nen ShortCut oder so einbauen, mit dem man den Cursor (ohne die Maus zu betätigen) in die Desktopmitte setzen kann, da weiß der User immer, wo die ist und kann sich von dort aus neu orientieren.) Wäre es ein Ansatz in 'ner Schleife nach dem höchsten Bildschirm zu suchen und Self.Height auf den höchsten der gefundenen Werte zu setzen und desgleichen auch für die Breite:
Delphi-Quellcode:
Guck aml hier
Self.Height := 0;
for i := 0 to Screen.MonitorCount -1 do Self.Height := Max(Self.Height,Screen.Monitors[i].Height); Self.Width := 0; for i := 0 to Screen.MonitorCount -1 do Self.Width := Max(Self.Width,Screen.Monitors[i].Width); ![]() Und dann mal mit der Suchmaschine Deiner Wahl: delphi screen.left multi monitor Da scheint es noch etliches zu geben, was eventuell hilfreich sein könnte. Wobei: Die Idee von ghubi01, statt Self.Left, Self.Width ... Screen.DesktopLeft ... zu nehmen, erscheint mir die deutlich intelligentere Variante zu sein. Da nimmt einem wohl das Betriebsystem das ganze "Bildschirmanordnungsgewusel" ab. Screen.DesktopLeft ist halt immer links, Screen.DesktopWidth ist immer die Breite. Am Ende müsste das FormCreate von ghubi01 für die Problemlösung ausreichen. @ghubi01 Danke für's testen. |
AW: Ein Formular für alle Monitore, Hilfe bitte
Ist dein Fenster Vollbild, über dem Screen und vor der/den Taskleisten,
oder nur maximiert im "Arbeitsbereich" (WorkArea) ? Drum gibt es auch mehrere Positionen auszulesen.
Delphi-Quellcode:
Siehe das Bild vom schönen Günther.
procedure TForm1.FormCreate(Sender: TObject);
begin Screen.DesktopRect // Alles und bei unterschiedlich großen oder verschobenen Screens inkl. der schwarzen nicht sichtbaren Bereiche Screen.Monitors[0].BoundsRect // der gesamte Screen Screen.Monitors[0].WorkareaRect // der Screen ohne Taskbar und ahnliche ToolBars Self.Monitor.BoundsRect // dieser Monitor ist jener, wo die Form ihren Mittelpunkt drauf hat Self.Monitor.WorkareaRect Self.Position := poDesktopCenter poScreenCenter poMainFormCenter poOwnerFormCenter ... end; Oben rechts und unten links gehört mit zum Desktop, auch wenn da nichts ist. Bei Einem Fenster über Allem muß man auch aufpassen wo die Titelleiste hängt und ob rechts das [X] oder links das [Icon/Menü] außerhalb eines Bildschirms sind, denn Windows verschiebt gern die Fenster, damit das nicht passiert. Zitat:
![]() Position 0:0 :roll: Bei mir geht es nicht, da der Hauptbildschirm rechts steht und nicht links. (0:0 ist in der Mitte) Und der Linke eine zwar gleichgroße Auflösung hat, aber durch höhere DPI um ein viertel tiefer steht. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:22 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