Plein écran avec wsMaximized mal ajusté [Résolu]

Messages postés
152
Date d'inscription
jeudi 22 novembre 2007
Dernière intervention
21 mars 2016
- - Dernière réponse : tuina77
Messages postés
5
Date d'inscription
jeudi 5 février 2009
Dernière intervention
14 octobre 2011
- 14 oct. 2011 à 19:10
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
Afficher la suite 

Votre réponse

10 réponses

Meilleure réponse
Messages postés
424
Date d'inscription
mardi 3 janvier 2006
Dernière intervention
26 novembre 2013
3
Merci
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

Merci ThWilliam 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de ThWilliam
Messages postés
424
Date d'inscription
mardi 3 janvier 2006
Dernière intervention
26 novembre 2013
3
Merci
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

Merci ThWilliam 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de ThWilliam
Messages postés
152
Date d'inscription
jeudi 22 novembre 2007
Dernière intervention
21 mars 2016
0
Merci
Bon, à en croire le message déjà posté http://www.delphifr.com/forum/sujet-PLEIN-ECRAN-BARRE-TACHES_121343.aspx, le problème viendrait plutôt des propriétés d'affichage de la barre des tâches Windows.

Mais ce qui m'intrigue cependant, c'est que sur les trois boutons de type TBitBtn, positionnés de la même manière, en bas à droite de ma fiche, un seul se place n'importe comment quand on bascule l'affichage en plein écran. Quand on rétablit l'affichage, il revient bien placé, puis, quand on bascule une nouvelle fois en plein écran, il est encore plus mal placé que la première fois; tandis que les deux autres boutons suivent bien leur position.

Voici les attributs de ces trois boutons presque identiques (j'ai omis les glyphes):
object FormPerso: TFormPerso
  Left = 353
  Top = 266
  Width = 812
  Height = 603
  Caption = 'FormPerso'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  DesignSize = (
    804
    569)
  PixelsPerInch = 96
  TextHeight = 13
  object Btn1: TBitBtn
    Left = 489
    Top = 539
    Width = 100
    Height = 25
    Anchors = [akRight, akBottom]
    Caption = 'bouton 1'
    TabOrder = 0
    Glyph.Data = {...}
  end
  object Btn2: TBitBtn
    Left = 594
    Top = 539
    Width = 100
    Height = 25
    Anchors = [akRight, akBottom]
    Caption = 'bouton 2'
    TabOrder = 1
    Glyph.Data = {...}
  end
  object Btn3: TBitBtn
    Left = 699
    Top = 539
    Width = 100
    Height = 25
    Anchors = [akRight, akBottom]
    Caption = 'bouton 3'
    TabOrder = 2
    Glyph.Data = {...}
  end
end
Commenter la réponse de zwyx
Messages postés
142
Date d'inscription
mardi 27 novembre 2007
Dernière intervention
10 mai 2010
0
Merci
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)
Commenter la réponse de JeremyLecouvert
Messages postés
152
Date d'inscription
jeudi 22 novembre 2007
Dernière intervention
21 mars 2016
0
Merci
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.
Commenter la réponse de zwyx
Messages postés
424
Date d'inscription
mardi 3 janvier 2006
Dernière intervention
26 novembre 2013
0
Merci
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.
Commenter la réponse de ThWilliam
Messages postés
152
Date d'inscription
jeudi 22 novembre 2007
Dernière intervention
21 mars 2016
0
Merci
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.
Commenter la réponse de zwyx
Messages postés
424
Date d'inscription
mardi 3 janvier 2006
Dernière intervention
26 novembre 2013
0
Merci
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
Commenter la réponse de ThWilliam
Messages postés
5
Date d'inscription
jeudi 5 février 2009
Dernière intervention
14 octobre 2011
0
Merci
je suis a la recherche d'un moniteur sql, vb
Commenter la réponse de tuina77
Messages postés
5
Date d'inscription
jeudi 5 février 2009
Dernière intervention
14 octobre 2011
0
Merci
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.
Commenter la réponse de tuina77

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.