![]() |
MonitorCount im Betrieb aktualisieren?
Hi all,
ich schreibe einen PDF-Presenter. Die PDF soll natürlich auf einem Beamer angezeigt werden - die Steuerung am Liebsten auf einem separatem Monitor. Das funktioniert sowohl im 1-Monitor(nur Beamer)- als auch im 2-Monitor(Monitor + Beamer)-Betrieb. ABER - wird der Beamer nach Start des Präsenters an- oder abgestöpselt, so wird diese Änderung nicht registriert. Screen.MonitorCount bleibt auf dem Initialisierungswert. Wie kann ich vor dem form.show des Beamer-Bildschirms Screen.MonitorCount "aktualisieren" lassen? Viele Grüße RaBe... |
AW: MonitorCount im Betrieb aktualisieren?
Das hier steckt hinter der Getter-Methode von Screen.MonitorCount:
Delphi-Quellcode:
function TScreen.GetMonitorCount: Integer;
begin if FMonitors.Count = 0 then Result := GetSystemMetrics(SM_CMONITORS) else Result := FMonitors.Count; end; |
AW: MonitorCount im Betrieb aktualisieren?
Schlag mich, aber bedeutet der getetr nicht, das FMonitors.count nach einem frischen auslesen nicht gesetzt wird o.O. Dan bleibt FMonitors.count ja 0.(Also nur erste IF)
MFG Memnarch |
AW: MonitorCount im Betrieb aktualisieren?
Wenn der Getter zum ersten Mal aufgerufen wird, fragt er beim OS nach, danach gibt er diese ermittelte Zahl bei jedem weiteren Aufruf zurück.
|
AW: MonitorCount im Betrieb aktualisieren?
Also wird die Variable, die der Getter zurückgibt, automatisch in dem ihm zugehörigen Feld gespeichert?
|
AW: MonitorCount im Betrieb aktualisieren?
Ich habe leider gerade kein Delphi zur Hand, weiß daher nicht, wie, wann und wie oft FMonitors befüllt bzw. refreshed wird. Laut Beschreibung im Ausgangspost scheint es aber so zu sein, dass das nur einmal geschieht.
|
AW: MonitorCount im Betrieb aktualisieren?
Die frage ist nicht wie OFT, sondern WO. Der getter gibt in meinen augen nur die Anfrage zurück, schreibt das Ergebnis aber fürs nächste mal(zweite if anweisung wäre dass) nicht in die Feldvariable. Die Feldvariable selbst müsste also 0 bleiben(wird dann auch nie zurückgegeben) Muss ich mal eben testen wie sich das verhält o.O.
MFG Memnarch |
AW: MonitorCount im Betrieb aktualisieren?
Jup. Der Wert wird somit nur einmal via Windows-API-Call ausgelesen und intern gespeichert. Das Problem dabei ist, dass wenn während der Laufzeit des Programms sich die Anzahl der Monitore ändert, der Wert falsch ist und falsch bleibt.
Hab hier totalen Käse geschrieben. Die Zeile mit der Windows-API-Aufruf ist nur eine Fallback-Methode, wenn beim Konstrutor von TScreen das hier wohl nicht geklappt hat:
Delphi-Quellcode:
FMonitors ist vom Typ TList und beinhaltet TMonitor-Instanzen. TMonitorEnumerator ist eine "Hilfs"-Klasse mit einer Callback-Methode, die von der Windows-API aufgerufen wird, eine TMonitor-Instanz erzeugt und diese in FMonitors wirft.
{$IF DEFINED(CLR)}
EnumDisplayMonitors(0, nil, TMonitorEnumerator.Create(FMonitors).FEnumProc, 0); {$ELSE} EnumDisplayMonitors(0, nil, @EnumMonitorsProc, LongInt(FMonitors)); {$IFEND} |
AW: MonitorCount im Betrieb aktualisieren?
In der Klasse TCustomForm habe ich etwas Code aufgespürt, wie die VCL auf Veränderungen der Monitore reagiert:
Delphi-Quellcode:
Das ist natürlich sehr unfein, was da in
for i := 0 to Screen.MonitorCount-1 do
TMonitor(Screen.FMonitors[i]).Free; Screen.FMonitors.Clear; // EnumDisplayMonitors ist ein Funktionszeiger in Unit MultiMon EnumDisplayMonitors(0, nil, @EnumMonitorsProc, LongInt(Screen.FMonitors));
Delphi-Quellcode:
gemacht wird.
function TCustomForm.GetMonitor
Borland hätte der TScreen-Klasse eine "RefreshMonitors"-Methode spendieren sollen. PS: Ahhh..es fehlt natürlich auch noch lokaler Code aus Unit Forms:
Delphi-Quellcode:
function EnumMonitorsProc(hm: HMONITOR; dc: HDC; r: PRect; Data: Pointer): Boolean; stdcall;
var L: TList; M: TMonitor; begin L := TList(Data); M := TMonitor.Create; M.FHandle := hm; M.FMonitorNum := L.Count; L.Add(M); Result := True; end; |
AW: MonitorCount im Betrieb aktualisieren?
@Shark:Okay, das heißt aber, das die variable erst gegetted wird, und dan manuel gespeichert wird(z.B im Create()). Automatisch wird da zumindest nichts gespeichert.
MFG Memnarch |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:47 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