Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Mehrer Monitore ansteuern....


Cain - Mo 17.10.05 11:19
Titel: Mehrer Monitore ansteuern....
Und zwar habe ich folgendes Problem.
Ich habe zwei Grafikkarten und möchte unter Delphi drei Monitore ansteuern, wo auch jeweils was anderes drauf sein soll.
Eine GraKa hat nur den normalen VGA Ausgang. Die Andere DVI und VGA.
Nun meine Frage. Das mit TMOnitor und TScreen habe ich noch nicht so recht verstanden.
Wie steuere ich die einzelnen Bildschirme ein...
Nen kleines Stück einfacher Quelltext würde mir als Lösung schon reichen.
Danke schon mal für eure Hilfe.


digi_c - Mo 17.10.05 13:17

Was verstehst du denn unter "ansteuern" ?

Mehr als deine Anwendungsfenster zu verteilen wird mit diesen Objekten nicht drin sein, die ganzen Details kannst du evtl. per WinAPI regeln(aber bestimmt nicht so einfach) und das komplette umschalten gestaltet sich IMHO sehr schwer.


Cain - Mo 17.10.05 13:19

Ich will dem Programm sagen, dass zum Beispiel Fenster 1 auf Monitor 1 angeziegt wird.
Fenster 2 in Monitor 2 etc...
Das muss mit TMonitor und TScreen wohl möglich sein.


retnyg - Mo 17.10.05 13:52
Titel: Re: Mehrer Monitore ansteuern....
user profile iconCain hat folgendes geschrieben:

Nen kleines Stück einfacher Quelltext würde mir als Lösung schon reichen.

Suche in: Delphi-Forum, Delphi-Library RETMONITORTOOLS
Suche in: Delphi-Forum, Delphi-Library OMORPHIA MONITOR


Cain - Mo 17.10.05 14:07

Danke retnyg aber wie in besagten Abschnitten schon erwähnt wird davon abgeraten die retmonitortools zu benutzen und die andere Unit hat mit meinem Problem
nichts zu tun.
Trotzdem danke.


retnyg - Mo 17.10.05 14:09

du siehst aber trotzdem in dem code wie man es machen kann. ausserdem bietet die omorphia monitor unit (ich habe mal einen blick reingeworfen) nahezu die selben funktionen. ob sie auch tut, hab ich aber noch nicht getestet.


Cain - Mo 17.10.05 14:17

Naja...
Das geht alles über verschieben aber das geht auch direkt.
Aber die Frage ist "wie"


hallo - Mo 17.10.05 14:27

Du musst dein Fenster ja nur aus dem 1. rausschieben, um in den 2. zu kommen!
Du kannst mal sowas wie Screen.width bzw. screen.height versuchen, und dann ausrechnen welcher Monitor wieviel hat.

Wie hast du es denn eigenstellt?
_____
|1|2|3|
-------

Oder üebereinander? Oder verstehe ich da was falsch?


Cain - Mo 17.10.05 14:39

Ich will nichts verschieben.
Über TScreen bzw. TMonitor kann man rausfinden welcher der primäre Monitor ist und wieviele Monitore da sind also müßte man auch mit den selben Komponenten setzten können auf welchem Monitor was angezeigt wird.

So a la:

Monitor[1].ShowMessage("1");
Monitor[2].ShowMessage("2");


etc...


hallo - Mo 17.10.05 14:56

Hast du da irgendsoein gestrecktes Bild?
Das beim 1. raus durch den 2. durch und beim 3. reingeht, oder verstehe ich da was nicht recht?


Cain - Mo 17.10.05 15:09

Nichts gestreckt.
auf jedem Bildschirm soll was anderes stehen....

Unter XP wäre das über die Eigeschaften der darstellung leicht zu machen aber unter älteren OS leider nicht


Cain - Mi 19.10.05 11:28

Keiner ne Idee?


wdbee - Mi 19.10.05 14:22

Hallo Cain,

um dir helfen zu können, müssen wir zunächst mal wissen, ob du die drei Monitore unter Windows konfiguriert hast.

Beispiel: Bei meinem Notebook habe ich die Möglichkeit einen externen Monitor anzuschließen. Damit dort etwas angezeigt wird, muss ich in der Systemsteureung auswählen, wie der externe Monitor von Windows bedient werden soll.
[1][1] 1. Möglichkeit: Kopie des internen Displays
[1][2] 2. Möglichkeit: Logisch nebeneinander liegende Abschnitte des Desktops
[2] 3. Möglichkeit: Logisch untereinandner liegende Abschnitte des Desktops
[1]

Bei Möglichkeit 2 läuft die Taskleiste unten auf beiden Monitoren durch, bei Möglichkeit 3 ist sie nur auf dem 1. Monitor zu sehen.

Wenn das mal erledigt ist, dann kannst du dein Formular über LEFT und TOP positionieren.
Bei Möglichkeit 2 sind die X-Koordinaten des ersten Monitors z.B. [0 bis 1023], die des zweiten [1024 bis 2047]. Bei XP kann der zweite Monitor auch eine andere logische Größe haben als der erste. Bei mir z.B. 1: 1400 x 1050 und 2: 1024 x 768.
Dmit sind die X-Koordinaten des externen Displays z.B. 0 bis 1400-1 und 0+1400 bis 1024+1400-1.

Die gültigen Werte hängen dabei nur davon ab, was du in der Systemsteurung [Anzeige] eingestellt hast. TMonitor und TScreen bauen dann darauf auf. Erst muss das mal so gehen.


Cain - Mo 24.10.05 08:30

Ohne das Postionieren muss das auch gehen.
Wenn man nämlich die Auflösung ändert, verschieben sich die Sachen alle.
Außer man man ne Abfrage für jede mögliche Auflösung...


Grishnak - Mo 24.10.05 12:22

wdbee hat folgendes geschrieben:
[1][1] 1. Möglichkeit: Kopie des internen Displays
[1][2] 2. Möglichkeit: Logisch nebeneinander liegende Abschnitte des Desktops
[2] 3. Möglichkeit: Logisch untereinandner liegende Abschnitte des Desktops
[1]

Bei Möglichkeit 2 läuft die Taskleiste unten auf beiden Monitoren durch, bei Möglichkeit 3 ist sie nur auf dem 1. Monitor zu sehen.


Ich habe mom. an meine 9700pro zwei Monitore angeschlossen (15" & 17" TFT). Aber egal welche Auflösung ich bei beiden Monitoren einstelle (1024x768 + 1280x1024 oder beide auf 1024x768) bzw. wie ich sie anordne (gem. "Eigenschaften von Anzeige/Einstellungen", ich bekomme die Taskleiste nur auf dem primären Monitor! Wie bekomme ich eine durchgängige Task-Leiste?


retnyg - Mo 24.10.05 17:46

user profile iconGrishnak hat folgendes geschrieben:
Wie bekomme ich eine durchgängige Task-Leiste?

mit ner matrox-karte


Muetze1 - Mo 24.10.05 20:01

Oder du nutzt UltraMon [http://www.realtimesoft.com/ultramon/] - ich habs mir gekauft und kann es für MultiMon System nur empfehlen.


Cain - Di 25.10.05 10:36

Hat denn keiner ne Unit, die auf mehreren Monitoren was ausgibt?
Bin schon echt am verzweifeln.


digi_c - Di 25.10.05 11:05

Gefunden per Suche bei Google MULTIMONITOR DELPHI:
Zitat:
Dad's Components : TColoredLabel, TWizard, T...., Multi Monitor API,...


http://delphi.icm.edu.pl/ftp/d30free/dadcomp.zip

Zwar von 99 aber sicherlich ein Ansatz. Oder etwa eins von 2002:
http://delphi.icm.edu.pl/ftp/d50free/DW10242.ZIP


Cain - Di 25.10.05 11:58

Die beiden ZIP Archive enthalten nichts, was auch nur annähernd was mit Monitoren zu tun hat.
Trotzdem danke.


Muetze1 - Di 25.10.05 12:32

user profile iconCain hat folgendes geschrieben:
Ohne das Postionieren muss das auch gehen.
Wenn man nämlich die Auflösung ändert, verschieben sich die Sachen alle.
Außer man man ne Abfrage für jede mögliche Auflösung...


Ich verstehe nicht, was dir fehlt. Es gitb soweit keine Unit die etwas auf dem Monitor X ausgibt - positionier dein Fenster da (bzw. nutze die Eigenschaft Monitor der Form) und gebe auf deinem Fenster was aus. Ich verstehe nicht was dein Problem dabei ist.


Cain - Di 25.10.05 13:01

user profile iconMuetze1 hat folgendes geschrieben:
user profile iconCain hat folgendes geschrieben:
Ohne das Postionieren muss das auch gehen.
Wenn man nämlich die Auflösung ändert, verschieben sich die Sachen alle.
Außer man man ne Abfrage für jede mögliche Auflösung...


Ich verstehe nicht, was dir fehlt. Es gitb soweit keine Unit die etwas auf dem Monitor X ausgibt - positionier dein Fenster da (bzw. nutze die Eigenschaft Monitor der Form) und gebe auf deinem Fenster was aus. Ich verstehe nicht was dein Problem dabei ist.


Es gibt keine Eigenschaft Monitor des Formulars.

Wenn das so einfach ist, dann bitte schreib doch bitte hier gerade rein, wie der Quelltext dafür aussieht.


Muetze1 - Di 25.10.05 13:18

user profile iconCain hat folgendes geschrieben:
Es gibt keine Eigenschaft Monitor des Formulars.


Stimmt, war ein anderes "Delphi"...

user profile iconCain hat folgendes geschrieben:
Wenn das so einfach ist, dann bitte schreib doch bitte hier gerade rein, wie der Quelltext dafür aussieht.



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
Var
  i : integer;
Begin
  For i := 0 To Pred(Screen.MonitorCount) Do
    With TForm.Create(Self) Do
    Begin
      Left   := Screen.Monitors[i].Left;
      Top    := Screen.Monitors[i].Top;
      Width  := Screen.Monitors[i].Width;
      Height := Screen.Monitors[i].Height;

      Caption := Format('Monitor %d', [i+1]); 
    End;
End;


digi_c - Di 25.10.05 13:22

Ähm Cain also meine beiden geposteten Units enthalten sehr wohl was zum Thema Monitore.
In der ersten schau mal in die Readme und in der zweiten in die systemworks.pas unter Screen.


Cain - Di 25.10.05 14:35

user profile iconMuetze1 hat folgendes geschrieben:
user profile iconCain hat folgendes geschrieben:
Es gibt keine Eigenschaft Monitor des Formulars.


Stimmt, war ein anderes "Delphi"...

user profile iconCain hat folgendes geschrieben:
Wenn das so einfach ist, dann bitte schreib doch bitte hier gerade rein, wie der Quelltext dafür aussieht.



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
Var
  i : integer;
Begin
  For i := 0 To Pred(Screen.MonitorCount) Do
    With TForm.Create(Self) Do
    Begin
      Left   := Screen.Monitors[i].Left;
      Top    := Screen.Monitors[i].Top;
      Width  := Screen.Monitors[i].Width;
      Height := Screen.Monitors[i].Height;

      Caption := Format('Monitor %d', [i+1]); 
    End;
End;


Nicht schlecht ABER das erzeugt denselben Screen auf allen drei Monitoren...
Auf jedem Monitor soll aber was anderes stehen


Cain - Di 25.10.05 14:36

user profile icondigi_c hat folgendes geschrieben:
Ähm Cain also meine beiden geposteten Units enthalten sehr wohl was zum Thema Monitore.
In der ersten schau mal in die Readme und in der zweiten in die systemworks.pas unter Screen.


Das waren keine zwei geposteten Units sondern zwei ZIP Archive mit Dutzenden von Units.


retnyg - Di 25.10.05 15:39

user profile iconCain hat folgendes geschrieben:

Nicht schlecht ABER das erzeugt denselben Screen auf allen drei Monitoren...
Auf jedem Monitor soll aber was anderes stehen

dann lass halt das create weg :roll:
ein wenig eigeninitiative (denken) wäre nicht schlecht, cain.
naja, so haben wir wenigstens mal einen thread zum thema, mit vielen versch. lösungsansätzen.


Muetze1 - Di 25.10.05 18:31

user profile iconCain hat folgendes geschrieben:
Nicht schlecht ABER das erzeugt denselben Screen auf allen drei Monitoren...
Auf jedem Monitor soll aber was anderes stehen


Aber was der Code bzw. ich da mache ist dir schon bewusst, oder? Anscheinend nicht.


BenBE - Di 25.10.05 18:36

Auch wenn hier bereits ein Verweis auf unsere Unit gemacht wurde, möchte ich den Link dennoch nocheinmal geben.

Für Projekt Omorphia [http://www.omorphia.de/] haben wir in der Unit OIncMonitors.pas [http://viewcvs.omorphia.de/omorphia/library/source/OIncMonitors.pas] eine Sammlung von Funktionen, die den Umgang mit Multimon etwas erleichtern. Ein Update der Unit ist bereits geplant, aus Zeitmangel seiten's Neos aber ATM nicht durchführbar.


Cain - Mi 26.10.05 08:26

user profile iconMuetze1 hat folgendes geschrieben:
user profile iconCain hat folgendes geschrieben:
Nicht schlecht ABER das erzeugt denselben Screen auf allen drei Monitoren...
Auf jedem Monitor soll aber was anderes stehen


Aber was der Code bzw. ich da mache ist dir schon bewusst, oder? Anscheinend nicht.


Natürlich...
Es erzeugt das eigenen Formular auf allen Monitoren....
Deshalb habe ich ja gemeckert...
Klappt aber trotzdem nicht.
Das passt sich nicht an die größe der Bildschirme an, wie beabsichtigt.


Cain - Mi 26.10.05 08:29

user profile iconBenBE hat folgendes geschrieben:
Auch wenn hier bereits ein Verweis auf unsere Unit gemacht wurde, möchte ich den Link dennoch nocheinmal geben.

Für Projekt Omorphia [http://www.omorphia.de/] haben wir in der Unit OIncMonitors.pas [http://viewcvs.omorphia.de/omorphia/library/source/OIncMonitors.pas] eine Sammlung von Funktionen, die den Umgang mit Multimon etwas erleichtern. Ein Update der Unit ist bereits geplant, aus Zeitmangel seiten's Neos aber ATM nicht durchführbar.


Leider viel zu viel Input.
Kann ich nichts mit anfangen.
Kenne mich halt nicht so gut aus.
Ist viel zu kompliziert.


digi_c - Mi 26.10.05 09:46

Ich glaube nicht das du eine wesentlich einfachere Lösung finden wirst als Hilfsunits die dir die Arbeit mit den Koordinaten erleichtern.
Die Koordinaten des Formulars auf die Ecken zu setzen sollte somit kein problem sein.

Vielleicht ist das eher ein Problem deiner Grafikkarte?


Cain - Mi 26.10.05 10:56

Ich brauche halt nur genau den Quelltext womit ich z.B. verschiedene Frames auf verschiedene Bildschirme machen kann....


Muetze1 - Mi 26.10.05 10:59

user profile iconCain hat folgendes geschrieben:
user profile iconMuetze1 hat folgendes geschrieben:
user profile iconCain hat folgendes geschrieben:
Nicht schlecht ABER das erzeugt denselben Screen auf allen drei Monitoren...
Auf jedem Monitor soll aber was anderes stehen


Aber was der Code bzw. ich da mache ist dir schon bewusst, oder? Anscheinend nicht.


Natürlich...
Es erzeugt das eigenen Formular auf allen Monitoren....
Deshalb habe ich ja gemeckert...
Klappt aber trotzdem nicht.
Das passt sich nicht an die größe der Bildschirme an, wie beabsichtigt.


Und zuvor hiess es dazu noch

user profile iconCain hat folgendes geschrieben:
Nicht schlecht ABER das erzeugt denselben Screen auf allen drei Monitoren...
Auf jedem Monitor soll aber was anderes stehen


Erstmal sind deine Beschreibungen was nun nicht klappt echt mies. Weil wenn nicht überall was anderes steht ist was anderes als dass die Forms nicht ordentlich angepasst werden von der Grösse.

Und zum anderen kannst du dir doch die Form befüllen - entweder dynamisch mit anlegen der Elemente oder du baust dir im Designer jeweils eine Form zusammen - oder sogar ganz vorbildlich mit Frames, dann kannste das sogar leichter anpassen an unterschiedliche Monitorkonfigurationen (Anzahl, Grösse).

/EDIT:
user profile iconCain hat folgendes geschrieben:
Ich brauche halt nur genau den Quelltext womit ich z.B. verschiedene Frames auf verschiedene Bildschirme machen kann....


Erzeugt die Forms wie zum Beispiel in meinem unbrauchbaren Codeteil und pack dann abhängig von der Schleifenvariable oder Monitorauflösungen die entpsprechenden Frames raus. Also Frame Createn und Parent entsprechend setzen. Wo ist das Problem?


Cain - Mi 26.10.05 11:50

Es steht überall dasselbe, du Honk.
Lies doch mal richtig.

Ich habe zwei Grafikkarten, drei Monitore und möchte, dass auf jedem Monitor etwas anderes angezeigt wird.
Die letzte angegebene Lösung hatte zwar was, aber das Anpassen an den jeweiligen Monitor hat nicht geklappt. Müßte nämlich, so aus dem Quelltext ersichtlich, den ganzen Monitor füllen.
Dazumal das Stück Script die selbe Form auf allen Bildschirmen anzeigt...

Und welchen deiner Dutzenden Units sollte man da denn auch benutzen, Muetze?
Schreib doch den Quelltext hier rein anstatt ohne jeglichen Beweis hier rum zu meckern.


Stefan.Buchholtz - Mi 26.10.05 12:04

Wenn ich dich richtig verstehe, willst du auf unterschiedlichen Monitoren verschiedene Forms positionieren. Dafür würde ich mir eine Hilfsprozedur schreiben, die das macht, etwas so:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure PlaceFormOnMonitor(AForm: TForm; AMonitorNum: Integer);
var
  r: TRect;
begin
  r := Screen.Monitors[AMonitorNum].WorkareaRect;
  AForm.SetBounds(r);
end;


Das ist jetzt ohne ausprobieren mal schnell eingehackt, sollte aber so oder so ähnlich gehen.

Stefan


Cain - Mi 26.10.05 12:16

Damit kann man nur heraus finden wie groß die einzelnen Bildschirme von den Abmessungen her sind und du kannst AForm die entsprechende Größte geben. Das ist aber nicht, das, was ich will.
Ich will ne Form auf anderen Bildschirmen ausgeben. Nicht herausfinden, wie groß ne Form auf anderen Bildschirmen ist.
Sorry. Trotzdem danke.


Stefan.Buchholtz - Mi 26.10.05 12:35

user profile iconCain hat folgendes geschrieben:
Damit kann man nur heruas finden wie groß die einzelnen Bildschirme von den Abmessungen her sind und du kannst AForm die entsprechende Größte geben. Das ist aber nicht, das, was ich will.
Ich will ne Form auf anderen Bildschirmen ausgeben. Nicht heruasfinden, wie groß ne Form auf anderen Bildschirmen ist.
Sorry. Trotzdem danke.


Hast du das überhaupt ausprobiert?

Okay, die Parameter für SetBounds waren nicht richtig - aber ich habe das jetzt mal korrigiert und getestet. So geht's:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure PlaceFormOnMonitor(AForm: TForm; AMonitorNum: Integer);  
var  
  r: TRect;  
begin  
  r := Screen.Monitors[AMonitorNum].WorkareaRect;  
  AForm.SetBounds(r.Left, r.Top, r.Right - r.Left, r.Bottom - r.Top);
end;


Gerade eben getestet, funktioniert perfekt.

Stefan


Cain - Mi 26.10.05 12:46

Ja. Habe ich probiert.
Habe aber noch nen paar andere Probleme.
Liegt aber mehr am Aufruf des Frames aber das kriege ich hin.
Bin mal gespannt, ob deine Lösung klappt.


Muetze1 - Mi 26.10.05 13:08

user profile iconCain hat folgendes geschrieben:
Es steht überall dasselbe, du Honk.


Also beleidigend war ich bisher nicht - aber richtig gute Fehlerbeschreibungen hast du bisher auch nicht geliefert.

user profile iconCain hat folgendes geschrieben:
Und welchen deiner Dutzenden Units sollte man da denn auch benutzen, Muetze?
Schreib doch den Quelltext hier rein anstatt ohne jeglichen Beweis hier rum zu meckern.


Ich habe hier auf keine einzige Unit verwiesen - also welche dutzend Units meinst du?

Und warum sollte ich Quelltext hier rein schreiben? Gleiches habe ich gemacht und eine Frame wirste wohl auch anlegen können. Biser kamen von dir nur Dinge wie "klappt nicht, geht nicht, ist Müll". Aber anstatt mal genau zu sagen was nicht klappt wird man beleidigt und falsche Anschuldigungen.

Mir ist es jetzt auch wirklich egal mit deinem Problem, weil beleidigen muss ich mich nicht von dir lassen...

Der Code mit dem WordArea macht soweit auch nix anderes als mein Code, ausser das er Left, Top, Width und Height auf einmal setzt.

Ich vermute den Fehler in deinem restlichen Code anstatt bei den Vorschlägen hier...


digi_c - Mi 26.10.05 13:42

Ich denke der Herr meinte die von mir geposteten Units ;)


Cain - Mi 26.10.05 14:26

Herr von und zu Muetze.
Ich muss keine Fehlerbeschreibung abgeben, da ich keine Fehler habe.
Ich brauche halt nur nen Stück Quelltext wo verschiedene Sachen auf verschiedenen Monitoren angezeigt werden.
Und das steht hier schon nen Dutzendmal drin, aber wer nicht lesen kann....

So in der Art müßte das ungefähr aussehen


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
PROCEDURE TMonVerteilen;
VAR
  i : integer;
BEGIN
  FOR i := 0 TO Screen.MonitorCount -1 DO
  BEGIN
    MyFrames[i]:= TMonFrame.Create(Self, 'Monitor ' + IntToStr(i));
    PlaceFormOnMonitor(MyFrames[i], i);
  END;
END;

procedure PlaceFormOnMonitor(MonFrame: TFrame; MonitorNum: Integer);
var
  r: TRect;
begin
  r:= Screen.Monitors[MonitorNum].WorkareaRect;
  MonFrame.SetBounds(r.Left, r.Top, r.Right - r.Left, r.Bottom - r.Top);
end;


Stefan.Buchholtz - Mi 26.10.05 14:40

Mit Frames geht das nicht, du musst schon Forms nehmen. Ein Frame kann immer nur auf einem Form liegen, nicht selbst als Fenster angezeigt werden.

Stefan


Cain - Mi 26.10.05 14:54

Ich bin froh, dass ich Frames dynamisch erzeugen kann.
Geht das bei Forms genauso?


retnyg - Mi 26.10.05 14:55

user profile iconCain hat folgendes geschrieben:
Ich bin froh, dass ich Frames dynamisch erzeugen kann.
Geht das bei Forms genauso?

was glaubst du was der code von mütze1 gemacht hat ?


Cain - Mi 26.10.05 14:57

user profile iconretnyg hat folgendes geschrieben:
user profile iconCain hat folgendes geschrieben:
Ich bin froh, dass ich Frames dynamisch erzeugen kann.
Geht das bei Forms genauso?

was glaubst du was der code von mütze1 gemacht hat ?


Die Original Form auf allen drei Monitoren anzeigen.
Ich will aber auf jedem ne andere.


Stefan.Buchholtz - Mi 26.10.05 14:59

Ja, klar - der Code, den Muetze1 gepostet hat, tut das doch.

Stefan


retnyg - Mi 26.10.05 15:00

user profile iconCain hat folgendes geschrieben:

Die Original Form auf allen drei Monitoren anzeigen.
Ich will aber auf jedem ne andere.

ne, er createt eine form pro schirm.


Cain - Mi 26.10.05 15:02

user profile iconStefan.Buchholtz hat folgendes geschrieben:
Ja, klar - der Code, den Muetze1 gepostet hat, tut das doch.

Stefan


Tut er nicht.
Der Code von Muetze zeigt Form1 auf allen x Monitoren an, aber ich will dynamisch erzeugte Forms haben.

Muetze hätte das ausgegeben:
Monitor[1] zeigt Form1
Monitor[2] zeigt Form1
etc....

Ich will aber das so haben:

Monitor[1] zeigt Form3
Monitor[2] zeigt Form1
Monitor[3] zeigt Form2
oder so....


noidic - Mi 26.10.05 15:05

Ohne auf die meiner Ansicht nach kriminelle with *.Create - Konstruktion einzugehen...

Das Stück Code erzeugt 3 eigenständige TForm-Instanzen auf 3 Monitoren. Die zeigen natürlich bei unverändertem Code das selbe, nämlich nichts, an. Da ist aber deiner Kreativität freien Lauf gelassen, in die Forms was nettes reinzusetzen, wie Frames z.B.


Cain - Mi 26.10.05 15:05

user profile iconretnyg hat folgendes geschrieben:
user profile iconCain hat folgendes geschrieben:

Die Original Form auf allen drei Monitoren anzeigen.
Ich will aber auf jedem ne andere.

ne, er createt eine form pro schirm.


Was glaubst du, was er mit der entsprechenden Zeile kreiert???


Delphi-Quelltext
1:
With TForm.Create(Self) Do                    


Er erstellt das eigentliche Formular (Self) auf allen Monitoren.....
Woher sollte er auch andere Forms haben? Herzaubern?


noidic - Mi 26.10.05 15:08

Besuch mal einen Grundkurs Delphi... Seitwann Generiert man mit TForm.Create( self ) eine neue Instanz von self???


Cain - Mi 26.10.05 15:10

user profile iconnoidic hat folgendes geschrieben:
Besuch mal einen Grundkurs Delphi... Seitwann Generiert man mit TForm.Create( self ) eine neue Instanz von self???


Tut es ja eben nicht.
Das ist ja mein Problem....
Das Programm soll pro Monitor eine neue Form ausgeben....
Der Quelltext von Mütze nützt dafür nichts.
Weder ändert sich die Caption, noch Passt sich das dem Monitor an (müßte ja maximiert sein) noch ist der Index richtig, weil der Counter nur bis eine Zahl unter dem MonCount laufen darf.


Stefan.Buchholtz - Mi 26.10.05 15:13

user profile iconCain hat folgendes geschrieben:
user profile iconStefan.Buchholtz hat folgendes geschrieben:
Ja, klar - der Code, den Muetze1 gepostet hat, tut das doch.

Stefan


Tut er nicht.
Der Code von Muetze zeigt Form1 auf allen x Monitoren an, aber ich will dynamisch erzeugte Forms haben.

Muetze hätte das ausgegeben:
Monitor[1] zeigt Form1
Monitor[2] zeigt Form1
etc....

Ich will aber das so haben:

Monitor[1] zeigt Form3
Monitor[2] zeigt Form1
Monitor[3] zeigt Form2
oder so....


Das sollte mit den ganzen bis jetzt geposteten Beispielen und Erklärungen wirklich kein Problem mehr sein:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
  Form1 := TForm1.create(nil);  
  Form2 := TForm2.Create(nil);
  Form3 := TForm3.Create(nil);
  
  PlaceFormOnMonitor(Form3, 0);
  PlaceFormOnMonitor(Form1, 1);
  PlaceFormOnMonitor(From2, 2);


Nach der ganzen Diskussion würde ich sagen, dir fehlen noch ein paar Delphi-Grundlagen - vielleicht solltest du dir mal einige Tutorials anschauen oder ein gutes Delphi-Buch besorgen.

Stefan


Cain - Mi 26.10.05 15:16

Wir nähern uns der Sache.
Nur leider ist das nicht dynamisch....

Außerdem kann das gar nicht so einfach sein, wenn immer noch keiner von euch, das herausgefunden hat, wie es aussehen sollte.

Auf falsche Fährten bin ich schon von alleine gekommen.
Nur der richtige Weg ist mir, wie keinem von euch, bisher nicht eingefallen.


So klappt es zum Beispiel leider nicht um die Sache dynamisch zu machen:

Delphi-Quelltext
1:
2:
FOR i:= 0 TO Pred(Screen.MonitorCount) DO
  Format('Form%d', [i+1]):= Format('TForm%d', [i+1]).Create(NIL);


Dein PlaceFormOnMonitor war ja sonst ideal


Cain - Mi 26.10.05 15:37

Jetzt habe ich es fast....


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
PROCEDURE TMonVerteilen.FormCreate(Sender: TObject);
VAR
  i : integer;
BEGIN
  FOR i:= 0 TO Pred(Screen.MonitorCount) DO
  BEGIN
     MyForms[i+1]:= TMonitorForm.Create(Self, Format('Form%d', [i+1]));
     PlaceFormOnMonitor(MyForms[i], i);
  END;
END


Der Counter läuft zwar noch über aber das dürfte es gewesen sein....
Oder fällt jemanden noch ein gravierender Fehler auf?

Nun gut.
Danke jedenfalls schonmal für eure tatkräftige Hilfe.
Ich mach jetzt erstmal Feierabend....


Muetze1 - Mi 26.10.05 19:57

user profile iconnoidic hat folgendes geschrieben:
Ohne auf die meiner Ansicht nach kriminelle with *.Create - Konstruktion einzugehen...


War nur als schnelles Beispiel gemacht - wollte da nun nicht noch extra Var's anlegen...


retnyg - Mi 26.10.05 23:09

ich habe die Suche in: Delphi-Forum, Delphi-Library RETMONITORTOOLS gerade anhand der hier gewonnenen erkenntnisse von grund auf neugeschrieben.
wäre nett wenn jemand die unit testen könnte ;)