AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

MonitorCount im Betrieb aktualisieren?

Ein Thema von Rabe · begonnen am 3. Mär 2011 · letzter Beitrag vom 8. Mär 2011
Antwort Antwort
Seite 1 von 2  1 2      
Rabe

Registriert seit: 20. Apr 2010
12 Beiträge
 
#1

MonitorCount im Betrieb aktualisieren?

  Alt 3. Mär 2011, 15:09
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...
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#2

AW: MonitorCount im Betrieb aktualisieren?

  Alt 3. Mär 2011, 15:16
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;
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#3

AW: MonitorCount im Betrieb aktualisieren?

  Alt 3. Mär 2011, 16:32
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
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#4

AW: MonitorCount im Betrieb aktualisieren?

  Alt 3. Mär 2011, 16:36
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#5

AW: MonitorCount im Betrieb aktualisieren?

  Alt 3. Mär 2011, 16:39
Also wird die Variable, die der Getter zurückgibt, automatisch in dem ihm zugehörigen Feld gespeichert?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#6

AW: MonitorCount im Betrieb aktualisieren?

  Alt 3. Mär 2011, 16:44
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#7

AW: MonitorCount im Betrieb aktualisieren?

  Alt 3. Mär 2011, 16:48
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
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#8

AW: MonitorCount im Betrieb aktualisieren?

  Alt 3. Mär 2011, 16:51
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:
{$IF DEFINED(CLR)}
  EnumDisplayMonitors(0, nil, TMonitorEnumerator.Create(FMonitors).FEnumProc, 0);
{$ELSE}
  EnumDisplayMonitors(0, nil, @EnumMonitorsProc, LongInt(FMonitors));
{$IFEND}
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.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)

Geändert von s.h.a.r.k ( 3. Mär 2011 um 16:59 Uhr)
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#9

AW: MonitorCount im Betrieb aktualisieren?

  Alt 3. Mär 2011, 16:57
In der Klasse TCustomForm habe ich etwas Code aufgespürt, wie die VCL auf Veränderungen der Monitore reagiert:

Delphi-Quellcode:
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));
Das ist natürlich sehr unfein, was da in function TCustomForm.GetMonitor gemacht wird.
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;
Andreas

Geändert von shmia ( 3. Mär 2011 um 17:00 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#10

AW: MonitorCount im Betrieb aktualisieren?

  Alt 3. Mär 2011, 16:58
@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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:17 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz