2008-10-15 13 views
17

Existe-t-il un moyen de spécifier sur quel moniteur une application apparaît dans Delphi ou C++ Builder?Démarrer le programme sur un deuxième moniteur?

Je développe un programme simple pour un client, qui affiche les commandes de cuisine sur un moniteur secondaire, généré par un système d'accueil. Actuellement, ils doivent faire glisser manuellement la fenêtre sur le deuxième moniteur après son démarrage.

Répondre

22

Sauvegardez la position de la fenêtre avant l'arrêt du programme et restaurez-la au démarrage. Les écrans Multimonitor augmentent la taille du bureau. les autres surfaces de moniteur ont juste une section différente du même plan X/Y avec son origine en haut à gauche du moniteur principal.

Cela peut être fait automatiquement pour vous par any of several components.

BTW, la variable Ecran dans l'unité Forms a une propriété appelée MonitorCount et une autre propriété indexable, Monitors [Index: Integer]: TMonitor. TMonitor a des propriétés indiquant la gauche, le haut, la largeur, la hauteur, etc., donc toutes les informations dont vous avez besoin sont là.

+0

Merci, j'ai utilisé le Screen.MonitorCount comme vous et Jim suggéré. – stukelly

+6

Vous devez également valider le moniteur enregistré avant d'utiliser les paramètres au démarrage. Sinon, votre fenêtre n'apparaîtra pas du tout sur l'écran si l'utilisateur supprime un moniteur qui était auparavant. – anon6439

+0

Démarrage d'une application sur les coordonnées de l'écran négatif est toujours amusant de regarder les utilisateurs comment obtenir l'application à afficher ... –

-4

Je ne fais pas grand-chose avec les systèmes Windows, donc je suggère un hack comme celui-ci. Saisissez la largeur du bureau visible (les deux moniteurs combinés), divisez-le par deux et faites-en votre position de départ.

Vous pouvez également regarder dans quelle API vous indique les dimensions de monitor2.

+1

Cela ne fonctionnerait que si les deux moniteurs ont le même bureau de taille. – Re0sless

+0

@ReOsless: Ya. Comme je l'ai dit c'est un hack. –

-3

Windows vous permet de spécifier les coordonnées d'une fenêtre dans l'appel API CreateWindow. Je ne connais pas assez Delphi ou C++ Builder pour savoir si vous avez accès à cette partie du processus.

Vous pouvez également déplacer la fenêtre dans un gestionnaire WM_CREATE. EnumDisplayMonitors vous donnera les coordonnées de chaque moniteur dans le système.


Evidemment, Delphi et C++ Builder ont des fonctionnalités qui rendent cette réponse peu pertinente. Je vais le laisser ici au cas où quelqu'un rencontrerait cette question mais aurait besoin d'une réponse pour un environnement différent.

+2

Delphi a des abstractions pour couvrir toutes ces fonctions, depuis la collection Screen.Monitors jusqu'à des événements de pré-construction pour contrôler la position du formulaire. –

1

Pas vraiment la réponse à votre question, mais ne pouvez-vous pas stocker les paramètres de la fenêtre (taille, position, état maximisé) lorsque l'application est fermée, puis les appliquer au démarrage?

+0

Ceci est l'implémentation la plus simple – benPearce

+2

Il y a un problème avec ceci.Que se passe-t-il si le second montor est supprimé de l'ordinateur après que l'application l'a utilisé? (MySql Query Brower a ce problème) –

25

L'objet Ecran global (partie de Formulaires) a le concept de Moniteurs. Je pense que cela a été ajouté vers Delphi 6 ou 7. Le code suivant fonctionnera:

// Put the form in the upper left corner of the 2nd monitor 
// if more then one monitor is present. 
if Screen.MonitorCount > 1 then 
begin 
    Left := Screen.Monitors[1].Left; 
    Top := Screen.Monitors[1].Top; 
end; 

Vous pouvez utiliser compenser tout positif de cette position pour le mettre partout dans ce moniteur. Vous pouvez obtenir la largeur et la hauteur à partir de là aussi pour connaître les dimensions.

+1

Merci pour l'exemple de code, cela a bien fonctionné. – stukelly

-2

je l'ai fait une chose semblable il y a un moment dans Delphi 5:

procedure TForm18.FormCreate(Sender: TObject); 
var 
    Mon: TMonitor; 
    MonitorIdx: Integer; 
begin 
    MonitorIdx := 1; // better read from configuration 
    if (MonitorIdx <> Monitor.MonitorNum) and (MonitorIdx < Screen.MonitorCount) then begin 
    Mon := Screen.Monitors[MonitorIdx]; 
    Left := Left + Mon.Left - Monitor.Left; 
    Top := Top + Mon.Top - Monitor.Top; 
    end; 
end; 
1
procedure TMDIChild.btnShowMonClick(Sender: TObject); 
begin 
    if Screen.MonitorCount > 1 then 
    begin 
     FormShow.Left:=Screen.Monitors[1].Left; 
     FormShow.Top:=Screen.Monitors[1].Top; 
     FormShow.Width:=Screen.Monitors[1].Width; 
     FormShow.Height:=Screen.Monitors[1].Height; 
    end 
    else 
    begin 
     FormShow.Show; 
    end; 
end; 
Questions connexes