Einzelnen Beitrag anzeigen

delnu
(Gast)

n/a Beiträge
 
#21

AW: Positionierung einer Form in Multimonitorumgebung

  Alt 16. Nov 2015, 03:55
Zitat:
Na dann viel Erfolg dafür!
Danke, das kann ich brauchen.

Zitat:
Dann lass mal hören. Vor allem würde mich interessieren, wie du das bei ShowModal machen würdest.
Mit ShowModal habe ich sowas noch nie probiert. Aber weil Du wissen wolltest, wie die Umschaltung auch ohne viele Verrenkungen möglich ist, habe ich mal ein altes Delphi 1-Projekt (wie sich vielleicht erkennen läßt) abgespeckt. Wahrscheinlich sind noch Reste von Teilen drin, die für das Beispiel nicht mehr benutzt werden.

Das eigentliche Umschalten ist sehr simpel. Was das angehängte Beispiel aufbläht ist nur der Rest.

Hier zum Verständnis paar Auszüge:
Delphi-Quellcode:
...
    f_left, f_top : integer;
    MyMonitor : TMonitor;
    DefaultMonitor : integer;
    procedure GetMonitors;
...
procedure TBaseForm.GetMonitors;
VAR
 cnt : INTEGER;
BEGIN
 RadioGroup1.Items.Clear;

  FOR cnt:=0 TO Screen.MonitorCount-1 DO
  WITH Screen.Monitors[cnt]
  DO BEGIN
   RadioGroup1.Items.Add(
             ' Monitor '+IntToStr(MonitorNum)+' : '+
                IntToStr(width)+' *'+IntToStr(Height));
  END;

END; { procedure TBaseForm.GetMonitors }

procedure TBaseForm.FormCreate(Sender: TObject);
begin
  f_left := left;
  f_top := top;
  DefaultMonitor:=0; { sicherheitshalber }
end;

procedure TBaseForm.FormShow(Sender: TObject);
begin
 MyMonitor:=TMonitor.Create;
 GetMonitors;
   RadioGroup1.ItemIndex:=0; // sicherheitshalber erster Monitor ?
// RadioGroup1.ItemIndex:=Screen.MonitorCount-1; //letzter Monitor
   IF Screen.MonitorCount>1 THEN if askuser // global
   THEN Start_Mon; // = Benutzer wählen lassen !
   RadioGroup2.visible:=Screen.MonitorCount>1;
   Caption:=IntToStr(Screen.MonitorCount)+' Monitore';
   Form2.Show;
end;

procedure TBaseForm.FormDestroy(Sender: TObject);
begin
 MyMonitor.Free;
end;
Im innerhalb von "FormShow" (na gut, das könnte vielleicht woanders geschehen) dynamisch erzeugten und in "FormDestroy" freigebenen "MyMonitor" des Typs "TMonitor" wird alles Wesentliche erfaßt. Je nach Anzahl vorhandener Monitore wird in "GetMonitors" für jeden dynamisch ein Eintrag in "RadioGroup1" erzeugt.

Das Umschalten, wo Form1 ("BaseForm") gezeigt werden soll (mit mehr als 2 Monitoren habe ich es auf die Schnelle nicht umgesetzt) erfolgt über "RadioGroup1", entsprechend für "Form2" über "RadioGroup2". Wie Du siehst, besteht in meinem Beispiel der Hauptaufwand woanders.

Nun ja, wenn Du TC-Plugins schreibst (wäre nett, wenn Du an anderer Stelle mal ein Tutorial dafür erstellen könntest) wäre in dem Fall natürlich das Hauptformular der TC selbst. Aber trotzdem wird der von Dir betriebene Aufwand unnötig sein.

Vielleicht bringt Dir das angehängte Beispiel neue Denkanstöße.

So, jetzt bin ich aber wirklich mal für eine Weile weg.

EDIT: Die Hardware für die Netzwerke ist noch nicht vollständig angekommen. Darum hatte ich Zeit, das Beispiel etwas zu optimieren. Jetzt werden (DESKTEST-NEU.ZIP) für beide Forms alle vorhandenen Monitore (bis zur erlaubten Maximalzahl) möglich. Außerdem eine dritte Radiogroup, mit der beide Forms synchron auf jeden der vorhandenen Monitore gesetzt werden können. Die Auswertung habe ich vereinfacht. Hier nur das Wesentliche. Alles andere im angehängten kompletten Source.
Delphi-Quellcode:
procedure TBaseForm.GetMonitors;
VAR
 cnt : INTEGER;
BEGIN
 RadioGroup1.Items.Clear;
 RadioGroup2.Items.Clear;
 RadioGroup3.Items.Clear;

  FOR cnt:=0 TO Screen.MonitorCount-1 DO
  WITH Screen.Monitors[cnt]
  DO BEGIN
   RadioGroup1.Items.Add(
             ' Monitor '+IntToStr(MonitorNum)+' : '+
                IntToStr(width)+' *'+IntToStr(Height));
   RadioGroup2.Items.Add(
             ' Monitor '+IntToStr(MonitorNum)+' : '+
                IntToStr(width)+' *'+IntToStr(Height));
   RadioGroup3.Items.Add(
             ' Monitor '+IntToStr(MonitorNum)+' : '+
                IntToStr(width)+' *'+IntToStr(Height));
  END;

END; { procedure TBaseForm.GetMonitors }
...
procedure TBaseForm.RadioGroup3Click(Sender: TObject);
var
 m: integer;
begin
 m:= RadioGroup3.ItemIndex;
 BaseForm.left:= Screen.Monitors[m].left+f_left;
 BaseForm.top := Screen.Monitors[m].top+f_top;
 Form2.left:= Screen.Monitors[m].left+Form2.baseleft;
 Form2.top := Screen.Monitors[m].top+Form2.basetop;
end;
Angehängte Dateien
Dateityp: zip DESKTEST.ZIP (3,4 KB, 4x aufgerufen)
Dateityp: zip DESKTEST-NEU.ZIP (3,4 KB, 8x aufgerufen)

Geändert von delnu (16. Nov 2015 um 12:42 Uhr) Grund: Überarbeitung/Verbesserung des Beispiels
  Mit Zitat antworten Zitat