2010-07-01 21 views
4

Windows dans mon application surgissent du bord de l'écran, et c'est bien sûr un problème car certaines des fenêtres sont modales et ne peuvent pas être rejetées (vous ne faites pas Je ne sais même pas qu'ils sont là). J'utilise le composant TurboPower Orpheus qui se souvient de l'emplacement et de la taille de chaque formulaire, puis le restaure lorsque le formulaire est à nouveau affiché. Il enregistre la taille et l'emplacement dans un fichier INI.Fenêtres apparaissant hors de l'écran (Delphi)

Que puis-je faire pour empêcher les fenêtres de s'afficher sur le côté de l'écran?

+0

. (M comme dans Move.Je n'ai jamais utilisé un Windows en anglais, donc je ne sais pas avec certitude si c'est le bon raccourci.) –

+0

@Andreas Rejbrand - Cela peut fonctionner si j'étais le seul avec le problème, mais je ne peut pas demander aux utilisateurs de le savoir ou passer par plusieurs combinaisons de touches. Merci encore pour l'idée, cela me sera probablement utile à l'avenir. – Daisetsu

+0

Bien sûr. Je viens de l'écrire au cas où vous ne le sauriez pas. Cela aiderait à déboguer si rien d'autre ... –

Répondre

9

Il est courant que ce genre de chose se produise si vous utilisez plusieurs moniteurs, puis que vous en déconnectez un, comme lorsque vous déconnectez un ordinateur portable. Ou si vous amarrez un ordinateur portable à un écran avec une résolution plus élevée. Ou utilisez le bureau à distance, etc .. Le remède est de remplacer le comportement "se souvenir de ma position" avec un contrôle de santé mentale, pour voir si la gauche + largeur dépasse la largeur de l'écran (tableau Screen.Monitors, en fait - merci les gars) , et vice versa pour le haut + haut.

Idéalement, vous "bump" en soustrayant la différence, de sorte que vous êtes en butte contre le bord que la fenêtre voulait chevaucher.

De même, vérifiez s'il existe des mises à jour d'Orpheus pour résoudre ce problème. Si ce n'est pas le cas, vous pouvez obtenir la source, effectuer la correction (facultative) et la renvoyer au projet. C'est OSS, si je me souviens bien.

+0

Cette logique peut devenir assez complexe si vous traitez avec 2+ moniteurs. J'espérais qu'il y avait un composant ou une bibliothèque qui traitait ce genre de choses. Je pourrais l'écrire moi-même si nécessaire. – Daisetsu

+2

@Daisetsu: Ce n'est pas si compliqué, même avec plus de 2 moniteurs. Ce que je fais est 1) en boucle à travers tous les moniteurs actuellement attachés pour voir si le point central de la fenêtre à placer est dans la zone de l'un des moniteurs. Si tel est le cas, les coordonnées de la fenêtre peuvent être ajustées de manière à ce qu'elles n'intersectent pas les bordures du moniteur (ce n'est pas optimal, car un utilisateur aurait pu laisser la fenêtre partiellement hors écran intentionnellement). 2) Si 1) échoue, la fenêtre est placée sur le moniteur dont le centre est le plus proche du centre de la fenêtre à placer. – mghie

+1

@Daisetsu, traitant de plusieurs moniteurs n'est pas si mauvais: Jetez un oeil à Screen.Monitors et Screen.MonitorFromPoint; Chaque objet TMonitor possède une propriété "WorkareaRect" que vous pouvez utiliser. –

2

Vous pouvez jeter un oeil à leur propriété DefaultMonitor et lire le code de TCustomForm.SetWindowToMonitor pour voir comment faire face à la position relative à Screen.Monitors.

Use DefaultMonitor to associate a form with a particular monitor in a multi-monitor application. The following table lists the possible values: 

Value  Meaning 
dmDesktop No attempt is made to position the form on a specific monitor. 
dmPrimary The form is positioned on the first monitor listed in the global screen object's Monitors property. 
dmMainForm The form appears on the same monitor as the application's main form. 
dmActiveForm The form appears on the same monitor as the currently active form. 

Note: DefaultMonitor has no effect if the application does not have a main form. 
2

Pour rappeler la position précédente d'une forme, sans l'avoir tout à coup dans une zone qui est plus disponible (en raison d'un écran ou une résolution changé enfiché off), vous appelez simplement

TForm.MakeFullyVisible; 

C'est tout. Voir le documentation. Alt + Espace, M, Touches fléchées