Einzelnen Beitrag anzeigen

taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.990 Beiträge
 
Delphi 7 Professional
 
#1

Vollständige Sichtbarkeit eines Forms

  Alt 4. Apr 2008, 21:46
Moin, Moin.

Ich arbeite abwechselnd mit einem Notebook und einem PC(mit 2 Monitoren). Da hat es genervt, dass die Wiederherstellung der letzten Fensterposition beim Wechsel von PC auf Notebook immer problematisch war - das hat ja nun mal leider keine 2 Bildschirme eingebaut

Nun habe ich mich mal an einer endgültige Problemlösung versucht. Das Ergebnis sorgt nach erstem Test dafür, dass das Programmfenster vollständig sichtbar angezeigt wird, auch wenn aus der INI-Datei Koordinaten zur Positionierung gelesen wurden, mit der das Fenster in der aktuellen Monitorumgebung eigentlich nicht oder nicht vollständig sichtbar dargestellt werden könnte.

1 - Auf welchem Monitor wird Form dargestellt?

Ermittelt, auf welchem Monitor das Form angezeigt wird. Bildet das Form auf Multi-Monitorsystemen Schnittflächen mit mehreren Monitoren, wird derjenige Monitor zurückgeliefert, der die größte Schnittfläche mit dem Form hat. Ist das Form aufgrund einer völlig abweichenden Monitorkonfiguration auf keinem aktuell verfügbaren Monitor sichtbar, wird als Ergebnis der Primärmonitor zurückgeliefert.

Delphi-Quellcode:
function GetCurrentMonitor(Form:TForm):Integer;
var Rect : TRect;
    i,A,maxA : Integer;
begin
  Result:=0;
  maxA :=0;
  for i:=0 to Screen.MonitorCount-1 do
    if IntersectRect(Rect,Screen.Monitors[i].BoundsRect,Form.BoundsRect) then begin
      A:=(Rect.Right-Rect.Left)*(Rect.Bottom-Rect.Top);
      if A>maxA then begin maxA :=A;
                           Result:=i;
                           end
      end
end;
2 - Ist Form auf Monitor vollständig sichtbar?

Die Funktion prüft, ob das übergebene Form aktuell vollständig angezeigt wird.

Delphi-Quellcode:
function FormFullInView(Form:TForm):Boolean;
var MonNo,
    MonL,MonW,
    MonT,MonH : Integer;
begin

  MonNo:=GetCurrentMonitor(Form);
 
  MonL :=Screen.Monitors[MonNo].Left;
  MonW :=Screen.Monitors[MonNo].Width;
  MonT :=Screen.Monitors[MonNo].Top;
  MonH :=Screen.Monitors[MonNo].Height;

  Result:=(Form.Left >=MonL) and
          (Form.Top >=MonT) and
          (Form.Left+Form.Width <=MonL+MonW) and
          (Form.Top +Form.Height<=MonT+MonH)
end;
3 - Vollständige Anzeige des Forms erzwingen

Die Prozedur erzwingt die vollständige Anzeige (zentriert) des Forms auf dem Monitor der mit dem Formular die größte Schnittfläche besitzt. Hat das Form in der aktuellen Konfiguration mit keinem vorhandenen Monitor eine Schnittfläche, wird der primäre Monitor verwendet. Der Aufruf kann (natürlich) erst erfolgen, nachdem Left, Top, Width und Height des Forms festgelegt wurden.

Delphi-Quellcode:
procedure FitFormFullInView(Form:TForm);
var MonNo,
    MonL,MonW,
    MonT,MonH : Integer;
begin
  if not(FormFullInView(Form)) then begin

    MonNo:=GetCurrentMonitor(Form);
    MonL :=Screen.Monitors[MonNo].Left;
    MonW :=Screen.Monitors[MonNo].Width;
    MonT :=Screen.Monitors[MonNo].Top;
    MonH :=Screen.Monitors[MonNo].Height;

    with Form do begin
      Left:=MonL+(MonW-Width ) div 2;
      Top :=MonT+(MonH-Height) div 2;
      end

   end
end;
Nach Setzen der in der INI-Datei gespeicherten letzten Fensterkoordinaten wird die zuletzt gezeigte Prozedur aufgerufen. Damit wird dann sichergestellt, dass das Form unter jeder Monitorkonfiguration immer vollständig angezeigt wird - hoffe ich jedenfalls

Warum poste ich das Ganze nun?

Ich würde das gern noch mal von einer weiteren Person testen lassen.
Vielleicht gibt es sogar in der DP-Gemeinde ein Mitglied mit 3, 4 oder noch mehr Monitoren.

// edit : Rechtschreibfehler beseitigt
Ralph
  Mit Zitat antworten Zitat