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      
Benutzerbild von Memnarch
Memnarch

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

AW: MonitorCount im Betrieb aktualisieren?

  Alt 3. Mär 2011, 15: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.661 Beiträge
 
Delphi 12 Athens
 
#2

AW: MonitorCount im Betrieb aktualisieren?

  Alt 3. Mär 2011, 15: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
 
#3

AW: MonitorCount im Betrieb aktualisieren?

  Alt 3. Mär 2011, 15: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
shmia

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

AW: MonitorCount im Betrieb aktualisieren?

  Alt 3. Mär 2011, 15: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 16:00 Uhr)
  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
 
#5

AW: MonitorCount im Betrieb aktualisieren?

  Alt 3. Mär 2011, 15: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 15:59 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

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

AW: MonitorCount im Betrieb aktualisieren?

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

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

AW: MonitorCount im Betrieb aktualisieren?

  Alt 3. Mär 2011, 16:00
Nochmal mein Edit oben lesen! Oder einfach das von shmia lesen. Mein VCL-Source ist nur etwas neuer als der von shmia
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Rabe

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

AW: MonitorCount im Betrieb aktualisieren?

  Alt 4. Mär 2011, 16:24
Mit den Anregungen hier bin ich mal auf Endeckungsreise gegangen und habe an unterschiedlichen Stellen ind forms.pas den Aufruf von "Screen.GetMonitors" entdeckt.

Code:
procedure TScreen.GetMonitors;
begin
  ClearMonitors;
{$IF DEFINED(CLR)}
                                         
  EnumDisplayMonitors(0, nil, TMonitorEnumerator.Create(Screen.FMonitors).FEnumProc, 0);
{$ELSE}
  EnumDisplayMonitors(0, nil, @EnumMonitorsProc, LongInt(Screen.FMonitors));
{$IFEND}
end;
Ich würde das für eine Art "Refresh" halten. Aber - die Methode ist private.

Jetzt wollte ich TScreen in forms.pas um eine öffentliche Methode ergänzen, die GetMonitors aufruft. Es ist mir fast perinlich aber ich bekomme forms.pas nicht übersetzt.

Kann mir mal kurz einer nen Schubs geben? Müsste forms.pas als Bestandteil des Projektes nach Veränderung nicht automatisch übersetzt werden??? In jedem Fall ist forms.pas in dem im Optionen.Suchpfad eingetragegen Verzeichnis $(BDS)\SOURCE\WIN32\VCL vorhanden und lesbar.

Gruß
RaBe


Ups: Posts auf 2. Seite nicht gesehen - pfui über mich.

Geändert von Rabe ( 4. Mär 2011 um 16:57 Uhr) Grund: 2. Seite Posts nicht gesehen...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.399 Beiträge
 
Delphi 12 Athens
 
#9

AW: MonitorCount im Betrieb aktualisieren?

  Alt 4. Mär 2011, 16:59
Die VCL Resourcen ändert man halt nicht.

Delphi nutzt nie die PAS, sondern die entsprechenden vorkompilierten DCUs oder die Units, welche in den BPLs liegen, wenn man Runtimepackages nutzt.

Wenn doch, dann muß man diese DCUs manuell kompilieren und die abhängigen BPLs neu erzeugen.



Screen.FindMonitor(0); führt einen Refresh durch ... man mag es kaum glauben.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Rabe

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

AW: MonitorCount im Betrieb aktualisieren?

  Alt 4. Mär 2011, 17:25
Die VCL Resourcen ändert man halt nicht.
und man geht auch nicht bei rot über die Ampel

Screen.FindMonitor(0); führt einen Refresh durch ... man mag es kaum glauben.
ruft ja auch Screen.GetMonitors auf. Aber beide Methoden sind private deklariert.

Kann mich mal einer aufklären, wie ich da ran komme OHNE die VCL zu ändern?

Anscheinend sehe ich gerade den Wald vor Bäumen nicht...
  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 11:56 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