![]() |
AW: Positionierung einer Form in Multimonitorumgebung
Liste der Anhänge anzeigen (Anzahl: 1)
zunächst fehlt hinter TfmSvcProperties = class(TTotalCmdWfxForm)ein Semikolon.:lol:
Unit "TotalCmdGUI" : {$Include Compiler.inc} habe ich keine ... procedure PluginShowForm :
Delphi-Quellcode:
:shock:
procedure PluginShowForm(const AhParent: HWND);
var fmSvcProperties: TfmSvcProperties; Lmon: TFormMonitor; begin fmSvcProperties:= TfmSvcProperties.Create(nil, AhParent); try case IniFile.Monitor of // -> Undefinierter Bezeichner: 'IniFile' // -> ',' oder ':' erwartet, aber 'OF' gefunden 0..4: Lmon:= TFormMonitor(IniFile.Monitor); // -> ')' erwartet, aber Bezeichner 'Monitor' gefunden else Lmon:= fmActive; end; // EXCEPT oder FINALLY erwartet fmSvcProperties.ShowModal(Lmon); finally // 'END' erwartet, aber 'FINALLY' gefunden FreeAndNil(fmSvcProperties); end; // '.' erwartet, aber ';' gefunden end; Aber mal noch was anderes: Betrifft die Sache auch das Starten von Progs vom TC aus oder ist das nur speziell für TC-Plugins ? Gehst Du in der Unit "TotalCmdGUI" von 4 Monitoren aus ? Soviel ich weiß, sind bis zu 9 möglich. Die vorhandene Menge findet man über "Screen.MonitorCount" Vor weit mehr als 10 Jahren hatte ich sogar mal was mit Delphi 1 gemacht, das immerhin schon 2 Monitore verwalten konnte. Dazu hatte ich wesentliche Teile der Unit "Multimon" in eine eigene Unit "MMM" gepackt. Der eigentliche Anlaß dazu war aber dies: Die ab Delphi 4 standardmäßig vorhandene Multimonitor-Erkennung wird nur beim Programmstart vorgenommen und verläßt sich später fälschlich auf gültige "Handles", die nicht mehr stimmen, wenn die Zahl der aktivierten Monitore während des Programm-Ablaufs geändert wird. Werden Monitore abgeschaltet, so ist das weniger dramatisch. Neu hinzukommende werden allerdings nicht erkannt ! Ich habe mal meine damalige Unit und ein einfachen Testprogramm kurz getestet, neu gespeichert und hier (nur Sourcen, keine EXE) angehängt. Vielleicht ist manches davon brauchbar, zumal es auch teilweise ab Delphi 1 funktioniert. Das Problem, auf welchem Monitor gestartet wird, hatte ich aber damit NICHT gelöst. Könntest Du bitte mal ein KOMPLETTES und FUNKTIONIERENDES Beispiel Deiner Lösung bringen ? |
AW: Positionierung einer Form in Multimonitorumgebung
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Delphi-Quellcode:
erst abgeschlossen wird.
end;
Zitat:
Delphi-Quellcode:
s, damit der Compiler eine bedingte Kompilierung machen kann.
$DEFINE
Zitat:
Zitat:
Wobei es bei eigenständigen Programmen eh schwieriger wird, an den Parent zu kommen, denn der existiert ja erstmal nicht. Im momentanen Zustand ist die Unit für solche Programme nicht wirklich zu gebrauchen, denn dafür müsste man CreateParams entfernen (was den Parent des erzeugten Forms setzt). Naja, dafür müsste man wohl die Unit noch etwas umbauen :). Da es mir darum aber nicht ging, überlasse ich das anderen, Quellcode ist ja offen :wink:. Zitat:
Zitat:
Zitat:
Zitat:
MfG Dalai |
AW: Positionierung einer Form in Multimonitorumgebung
Liste der Anhänge anzeigen (Anzahl: 1)
Die Compiler-Optionen sind insofern interessant, daß ich dadurch jetzt erstmals einen Überblick über die Definitionen der Versionen nach Delphi 7 habe. :lol:
Klar, daß IniFile.Monitor ein integer sein müßte, ist logisch. Aber der Name läßt vermuten, daß Du dessen Wert aus einer (mir unbekannten) Ini-Datei liest. Darum meine Bitte nach einem kompletten Quellcode. Tatsächlich ging ich davon aus, das wäre NICHT NUR für Plugins geeignet. Weil ich nicht weiß, wie man die schreibt, hat sich das dann wohl leider für mich erledigt. Also müßte ich einen Weg finden, auf andere Weise erstmal zu prüfen, auf welchem Monitor sich der TC (bzw. das aufrufende Programm) befindet und dann das aufgerufene Programm auf diesen setzen. Aber das ist mir momentan dann doch zu viel, zumal meine aktiven Jahre mit Delphi schon länger zurückliegen und ich mich erst wieder einarbeiten muß. Das grundsätzliche Problem sind "DefaultMonitor" und "Position", die durch ihre Festlegung in der Unit "Forms" eher ein Hindernis darstellen. Ausserdem sind deren Original-Berechnungen falsch. Wird "Position" auf "poDesktopCenter" gesetzt, erscheint das Compilat am rechten Rand meines Default-Monitors. Den zweiten habe ich nämlich links und eben nicht rechts davon. Die in Unit "Forms" benutzte Berechnung
Delphi-Quellcode:
berücksichtigt nur Höhe und Breite des Desktops, aber nicht links und oben. Zur korrekten Auswertung müssen die einbezogen werden. Leider lassen sich Standardunits nicht problemlos durch eigene ersetzen, sonst sähe nicht nur "Forms" bei mir anders aus.
else if FPosition = poDesktopCenter then
begin if FormStyle = fsMDIChild then begin X := (Application.MainForm.ClientWidth - Width) div 2; Y := (Application.MainForm.ClientHeight - Height) div 2; end else begin X := (Screen.DesktopWidth - Width) div 2; Y := (Screen.DesktopHeight - Height) div 2; end; if X < 0 then X := 0; if Y < 0 then Y := 0; SetBounds(X, Y, Width, Height); end; Momentan nutze ich an den meisten meiner Computer auch nur 2 Monitore, aber an einem 3 und da sollen es auch maximal 4 werden. Nur aus Gründen der Universalität bzw. Vollständigkeit wäre meiner Meinung nach besser, dem Anwender die maximal nutzbare Menge zu ermöglichen. Das kann durchaus auch durch dynamische statt statische Zuweisung erfolgen. Anbei ein Screenshot eines Screenshot-Programms, das (statisch) von maximal 9 möglichen Monitoren ausgeht. Die nicht vorhandenen sind ausgegraut und es ist möglich, den gesamten Desktop zu snappen. Den Quelltext kann ich momentan nicht liefern, weil für die diversen möglichen Grafikformate Fremdunits benutzt werden und ich die zum einen suchen müßte und zum anderen nicht aus dem Kopf weiß, welche davon nicht direkt nutzbar sind, sondern evtl. installiert werden müssen. |
AW: Positionierung einer Form in Multimonitorumgebung
Zitat:
Delphi-Quellcode:
nun setzen muss, seit wann es ein Feature gibt oder ein Fehler korrigiert wurde...
$IFDEF
Zitat:
Zitat:
![]() ![]() Zitat:
Zitat:
Zitat:
MfG Dalai |
AW: Positionierung einer Form in Multimonitorumgebung
zur maximalen Monitormenge:
Als Maximum gilt (ab Windows 98) 9. Ich habe auch keine Informationen, daß es irgendwann mal mehr geworden wären, aber das würde dann wahrscheinlich über übliche Standards hinausgehen. Bei den von mir benutzten Windows-Versionen 98 SE und XP sind jedenfalls 9 das Maximum. Anhand des benutzten Betriebssystems läßt sich ggf. auswerten, wieviel tatsächlich möglich sind - falls mit neueren Versionen (oder durch Zusatztreiber oder wodurch auch immer) mehr als 9 erlaubt wären. Vielleicht sind hier mehr Informationen versteckt : ![]() Das wirkliche Problem sind wohl in der Regel eher die verfügbaren Steckplätze. Im Zuge der Sparsamkeit am falschen Platz gibt es kaum noch IBM-kompatible Boards mit der üblichen Maximalzahl von 8 Steckplätzen. Mir waren bisher als Maximum integrierter Grafikprozessoren pro Karte 4 bekannt, und diese Karten sind (neu) ziemlich teuer. In der Wikipedia heißt es allerdings Zitat:
![]() ![]() |
AW: Positionierung einer Form in Multimonitorumgebung
Liste der Anhänge anzeigen (Anzahl: 1)
So, ich hab die Klassen TTotalCmdWfxForm und TFormEx nun besser voneinander getrennt, so dass man auch direkt von TFormEx ableiten kann, ohne dass WndParent durch den Aufruf von CreateParams gesetzt wird. Das heißt, die Klasse TFormEx ist nun prinzipiell auch für eigenständige Programme nutzbar. Ich kann aber keinerlei Aussage darüber treffen, ob das in dem Bereich auch für das erste/primäre Formular der Anwendung funktioniert, denn das wird ja in der .dpr mittels
Delphi-Quellcode:
erzeugt...
Application.CreateForm()
Im Anhang findet sich ein komplettes Demo-Projekt (nur Source) mit allen benötigten Dateien (hoffentlich), also auch eine aktualisierte Unit TotalCmdGUI. Dabei sind zwei Formulare, von der das zweite beim Klick auf das erste erzeugt und dann nacheinander auf verschiedenen Monitoren (primär, sekundär, aktiv) angezeigt wird. Ich hoffe, es funktioniert alles :cyclops:. MfG Dalai |
AW: Positionierung einer Form in Multimonitorumgebung
Hallo ! Ich kam erst heute dazu, mir das runterzuladen. Seltsam, daß sich die Zahl der Downloads dadurch nicht erhöht hat. :roll:
Gewohnheitsmäßig starte ich Beispiele erstmal sowie sie sind. Erst als ich dann lediglich ein leeres Formular vorfand, guckte ich in den Quelltext und habe den fehlenden Button ergänzt. Leider ergibt sich nicht die erwünscht Funktionalität. Gestartet und geendet wird immer auf dem primären Monitor. Zwischendurch geht es dann auf den zweiten. Wahrscheinlich werde ich es nun so machen, Programme, von denen ich weiß, daß ich sie über den TC starte, grundsätzlich auf dem zweiten Monitor erscheinen lasse (falls einer da ist) ... Obwohl: Wenn der nicht angeschaltet ist (was sich wohl nicht softwaremäßig prüfen läßt) wird das nix und es bringts auch nicht, wenn man den TC selbst auf demm zweiten Monitor startet. Trotzdem danke ich Dir für Deine Mühe :thumb: und werde mir mal irgendwann (wenn ich dafür mehr Zeit finde) Deine Quelltexte sorgfältig durchsehen und prüfen, ob ich es damit doch irgendwie hinbekomme, das aufgerufene Programm auf dem jeweils anderen Bildschirm starten zu lassen. |
AW: Positionierung einer Form in Multimonitorumgebung
Zitat:
Zitat:
Zitat:
MfG Dalai |
AW: Positionierung einer Form in Multimonitorumgebung
Zitat:
Ging es nicht eigentlich um das Haupt-Formular ? Aber lassen wir das, weil weitere Diskussionen nichts bringen. Ich bin jetzt erstmal eine Weile raus aus dem Forum, weil ich paar neue Netzwerke einrichten muß. |
AW: Positionierung einer Form in Multimonitorumgebung
Zitat:
Zitat:
Zitat:
MfG Dalai |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:07 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-2025 by Thomas Breitkreuz