Plein écran avec wsMaximized mal ajusté

[Résolu]
Signaler
Messages postés
146
Date d'inscription
jeudi 22 novembre 2007
Statut
Membre
Dernière intervention
21 mars 2016
-
Messages postés
5
Date d'inscription
jeudi 5 février 2009
Statut
Membre
Dernière intervention
14 octobre 2011
-
Bonjour à tous,

Malgré les nombreuses questions déjà posées à ce sujet, je reste sans réponse pour ce qui me concerne.

Quand je bascule l'affichage en plein écran de ma fiche, par le code suivant:
procedure TFormPerso.AfficherPleinEcran (Sender: TObject);
begin
  FFicheParente := Parent; { mémorise la fiche parente dans une variable globale, de type TWinControl }
  Parent := nil;
  BorderStyle := bsDialog;
  Caption := Application.MainForm.Caption;
  WindowState := wsMaximized;
end;

la fenêtre ainsi obtenue est bien agrandie, mal cadrée par rapport aux bords de l'écran affiché et par rapport à la barre des tâches Windows. L'écart est minime, mais suffit pour que mes boutons, alignés en bas de la fenêtre, débordent sous la barre des tâches.

Pour avoir un cadrage parfait, il faut alors que je double-clique sur la bordure titre de la fenêtre, ou que je change un attribut d'affichage de la barre des tâches du bureau.

Tout indice sera le bienvenu.
Cordialement

9 réponses

Messages postés
418
Date d'inscription
mardi 3 janvier 2006
Statut
Membre
Dernière intervention
26 novembre 2013
3
Salut,

Je crois que ton problème provient de BorderStyle := bsDialog;

Après essai (Delphi7 sous XP pro):
- BorderStyle := bsDialog -> la form occupe tout l'écran en cachant même la barre des tâches(mais ok pour le bouton).
- borderstyle:= bsSizeToolWin : là j'ai ton problème de bouton caché par la barre des tâches.
- BorderStyle:= bsSingle (ou autre) -> pas de problèmes avec la barre des tâches.

A +
Thierry
Messages postés
418
Date d'inscription
mardi 3 janvier 2006
Statut
Membre
Dernière intervention
26 novembre 2013
3
Re-salut,

De fait, lorsqu'on enlève le biMaximize de BorderIcons, on retrouve le problème... Ah, Windows, tu nous surprendras toujours !

Si tu tiens à utiliser le borderStyle bsDialog, n'utilise pas WindowState := wsMaximized mais une fonction de maximisation du genre :

procedure TFormPerso.AfficherPleinEcran (Sender: TObject);
begin
...
// on récupère la hauteur de l'écran - la barre des tâches
SystemParametersInfo(SPI_GETWORKAREA, 0, @R, 0);
// on change la taille de FormPerso
SetBounds(0, 0, Screen.Width, R.Bottom);
end;

La seule différence avec wsMaximized est que l'on voit encore les contours de la fenêtre.

"la fenêtre maximisée se barre derrière la fenêtre du programme." : utilise BringToFront pour ramener à l'avant-plan une fenêtre.

Un dernier truc : pq mettre Parent:= nil !???

A +
Thierry
Messages postés
139
Date d'inscription
mardi 27 novembre 2007
Statut
Membre
Dernière intervention
10 mai 2010
2
Salut,

Malheureusement je ne peux pas faire grand chose pour toi, mais sache que je compatis!

Moi aussi j'ai déjà eu le souci avec des TLabel qui remontaient de 4 pixels à chaque nouvelle exécution...

En désespoir de cause, après avoir galéré sans en trouver la raison, j'ai réglé le pb comme un sagouin en positionnant mes contrôles dans le FormCreate!

J'espère que tu vas trouver ta réponse... en tout cas je reste à l'affût parce qu'elle m'intéresse aussi!


Si l'envie te prend de travailler, assied-toi et attend qu'elle te passe! (vieux -et faux!- dicton corse)
Messages postés
146
Date d'inscription
jeudi 22 novembre 2007
Statut
Membre
Dernière intervention
21 mars 2016

Merci Jérémy, ta compassion m'a permis de tenir... jusqu'à la réponse de Thierry.

Mon problème semble effectivement pouvoir se résoudre en attribuant BorderStyle := bsSingle; lors de l'agrandissement.

C'est dommage car les avec BorderStyle := bsDialog; je n'avais que la croix [X]
, ce qui est déjà trop vu que j'ai un bouton pour réduire l'affichage plein écran à la normale.

Si l'on clique sur les autres icônes de la fenêtre maximisée [_]
ou [| |]
, la fenêtre maximisée se barre derrière la fenêtre du programme.

J'ai alors essayé de mettre:
[i]BorderStyle : = bsSingle;
BorderIcons := [biSystemMenu];/i
Mais mon bouton de type TBitBtn se positionne mal lors de l'agrandissement, comme avant.

Il me reste donc à récupérer les évènements déclenché lorsque l'on clique sur les trois boutons de la barre windows de l'application [_][| |][X]
. Je connais déjà OnClose...

En tout cas, merci beaucoup Thierry et Jérémy.
Messages postés
418
Date d'inscription
mardi 3 janvier 2006
Statut
Membre
Dernière intervention
26 novembre 2013
3
J'ai oublié de préciser que pour revenir à l'état non maximisé, tu dois avoir sauvegardé dans des variables la taille et l'emplacement de la fenêtre normale.
Messages postés
146
Date d'inscription
jeudi 22 novembre 2007
Statut
Membre
Dernière intervention
21 mars 2016

Merci encore Thierry,

J'affecte le parent de la fiche maximisée à nil parce qu'à sa création, elle est imbriquée, sans bordure, à l'intérieur d'une autre fiche.

Avec ton aide, ma fonction d'affichage en plein écran marche à merveille. Je précise pour les éventuels relecteurs que la variable R est de type TRect, puis je poste la solution complète:
procedure TPetiteFicheDansGrande.AgrandirPleinEcran (Sender: TObject);
var
  rZoneTravail: TRect;
begin
  { on mémorise le parent de la fiche }
  FFicheParente := Parent;
  { on sort la forme de sa fiche parente }
  Parent := nil;
  BorderStyle := bsDialog;
  Caption := Application.MainForm.Caption;
  OnClose := FermerPleinEcranMaximise;
  { on agrandit la fenêtre après avoir récupéré la hauteur de la barre des tâches windows }
  { WindowState := wsMaximized; ne fonctionne pas bien avec BorderStyle := bsDialog; il faudrait bsSingle }
  SystemParametersInfo (SPI_GETWORKAREA, 0, @rZoneTravail, 0);
  SetBounds (0, 0, Screen.Width, rZoneTravail.Bottom);
end; { AgrandirPleinEcran }

procedure TPetiteFicheDansGrande.FermerPleinEcranMaximise (Sender: TObject; var Action: TCloseAction);
begin
  Action := caNone; { on évite la fermeture de la fenêtre }
  ReduirePleinEcran (Sender); { on réduit la fenêtre }
end; { FermerPleinEcranMaximise }

procedure TPetiteFicheDansGrande.ReduirePleinEcran (Sender: TObject);
begin
  { on rétablit la fenêtre dans sa fiche parente originelle }
  WindoWState := wsNormal;
  BorderStyle := bsNone;
  Parent := FFicheParente;
end; { ReduirePleinEcran }

La variable d'instance FFicheParente étant de type TWinControl.
Messages postés
418
Date d'inscription
mardi 3 janvier 2006
Statut
Membre
Dernière intervention
26 novembre 2013
3
Bonjour,

2 petites remarques :

1) J'ai horreur de Vista, donc je continue en XP. Sous Vista, il y a moyen de mettre une barre d'outils système en haut de l'écran. Je ne sais pas si cela réduit l'espace de travail (Workarea), mais par précaution je remplacerais la ligne SetBounds par :
with rZoneTravail do SetBounds (Left, Top, Right, Bottom);

2) Dans ta procedure ReduirePleinEcran, WindoWState := wsNormal ne sert à rien puisque tu n'as jamais changé l'état. En principe, les dimensions de ta fenêtre devraient rester les mêmes que celles de la fenêtre agrandie. Ne devrais-tu pas, dans AgrandirPleinEcran mémoriser la taille de la fenêtre non maximisée afin de rétablir cette taille dans ReduirePleinEcran ?

A +
Thierry
Messages postés
5
Date d'inscription
jeudi 5 février 2009
Statut
Membre
Dernière intervention
14 octobre 2011

je suis a la recherche d'un moniteur sql, vb
Messages postés
5
Date d'inscription
jeudi 5 février 2009
Statut
Membre
Dernière intervention
14 octobre 2011

Bonjours, je suis un débutant en delphi7 depuis le Burkina Faso. Je cherche un parrain ou un professeur si vous voulez, qui va m'assister dans la programmation avec delphi/interbase. j'ai trouvé que c'est très passionnant et depuis je ne peux plus m'en défaire. Mon e-mail c'est tuinanarcisse@yahoo.fr. Merci d'avance.