IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Lazarus Pascal Discussion :

Ajuster la hauteur d'une fenêtre contenant une barre de menu [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 102
    Points : 15 587
    Points
    15 587
    Billets dans le blog
    9
    Par défaut Ajuster la hauteur d'une fenêtre contenant une barre de menu
    Bonjour !

    Je me décide à vous soumettre un problème que je cherche en vain à résoudre à chaque nouveau projet.

    Mettons que j'ai une fenêtre avec une barre de menu. Je veux mettre dans cette fenêtre un bouton de 300 pixels sur 200, avec une marge de 2 pixels tout autour. Quelle sera la hauteur de la fenêtre ? Sur l'ordinateur sur lequel je suis en train de travailler, j'ai trouvé empiriquement que je devais régler la propriété Height de ma fenêtre (TForm) à 233.
    Nom : capture.png
Affichages : 235
Taille : 14,0 Ko
    Mais si je change d'environnement, ça risque de ne plus fonctionner, n'est-ce pas ?

    233 - (200 + 2 * 2) = 29

    Il correspond à quoi ce 29 ?

    Connaîtriez-vous une stratégie permettant de régler ce problème ?
    Fichiers attachés Fichiers attachés

  2. #2
    Membre habitué

    Homme Profil pro
    retraité
    Inscrit en
    Septembre 2006
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 65
    Points : 133
    Points
    133
    Par défaut
    Bonjour,

    Et en utilisant la propriété Screen.Height ?

  3. #3
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 355
    Points
    4 355
    Billets dans le blog
    2
    Par défaut
    Salut Roland

    Citation Envoyé par Roland Chastain Voir le message
    Bonjour !

    Je me décide à vous soumettre un problème que je cherche en vain à résoudre à chaque nouveau projet.

    Mettons que j'ai une fenêtre avec une barre de menu. Je veux mettre dans cette fenêtre un bouton de 300 pixels sur 200, avec une marge de 2 pixels tout autour. Quelle sera la hauteur de la fenêtre ? Sur l'ordinateur sur lequel je suis en train de travailler, j'ai trouvé empiriquement que je devais régler la propriété Height de ma fenêtre (TForm) à 233.


    Mais si je change d'environnement, ça risque de ne plus fonctionner, n'est-ce pas ?

    233 - (200 + 2 * 2) = 29

    Il correspond à quoi ce 29 ?

    Connaîtriez-vous une stratégie permettant de régler ce problème ?
    Salut Roland, ton problème est en fait assez simple. Mais il faut prendre en compte que la hauteur de la barre de titre n'est pas prise en compte lorsque tu règles les dimensions de ta fenêtre. En effet la hauteur de la barre de titre peut varier d'un OS à l'autre, suivant le thème de l'OS et suivant le style choisi dans Lazarus (QT, GTK, Natif, Cocoa etc...)

    La hauteur du menu = TMenu.Height;

    La Largeur optimale pour ta fenêtre sera donc : 300 (Largeur du bouton) + 4 (Les marges à gauche et droite du bouton = 2 + 2 ) = 304
    La hauteur optimale pour ta fenêtre sera donc : 200 (Hauteur du bouton) + 4 (Les marges en haut et bas du bouton = 2 + 2) + 20 (Hauteur du menu) = 224

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      Self.Width := BTQuit.Width + 4;
      Self.Height := BTQuit.Height + 4 + MMMenu.Height;
    Sinon, pourquoi ne pas mettre Les propriétés de BTQuit : align := alClient et BorderSpacing.Around := 2 ?

    Tu peux également restreindre les dimensions de ta form à l'aide de la propriété Constraints
    Ou tu peux encore utiliser la propriété AutoSize de ta form (sauf qu'avec celle-ci dans l'IDE la form ne se met pas à jour automatiquement) qui redimensionnera alors automatiquement celle-ci en fonction des dimensions de ton bouton. (des contrôles visible dans ta form)

    Bref à toi de voir si tu veux jouer avec les propriétés de la form et/ou du bouton, et comment. Il y a plusieurs solutions. Ou si tu veux tout faire par code.

    Bonne soirée

    A+

    Jérôme

  4. #4
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 102
    Points : 15 587
    Points
    15 587
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par microb Voir le message
    Bonjour,

    Et en utilisant la propriété Screen.Height ?
    Merci pour votre réponse, qui pourra me servir une autre fois, mais en l'occurrence je crois que ça ne correspond pas à mon problème (que je n'ai peut-être pas expliqué assez clairement).

  5. #5
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 102
    Points : 15 587
    Points
    15 587
    Billets dans le blog
    9
    Par défaut
    Merci Jérôme pour ta réponse. Je ne connaissais pas TMenu.Height; donc c'est déjà ça de gagné.

    Citation Envoyé par BeanzMaster Voir le message
    La hauteur optimale pour ta fenêtre sera donc : 200 (Hauteur du bouton) + 4 (Les marges en haut et bas du bouton = 2 + 2) + 20 (Hauteur du menu) = 224

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      Self.Width := BTQuit.Width + 4;
      Self.Height := BTQuit.Height + 4 + MMMenu.Height;
    Désolé, mais chez moi (enfin, sur l'un de mes ordinateurs, car sur l'autre c'est différent) c'est 233. Et ton code ne me donne pas le résultat attendu. Je ne me fatigue pas à faire une capture d'écran : je suppose que tu me croiras sur parole.

    Citation Envoyé par BeanzMaster Voir le message
    Sinon, pourquoi ne pas mettre Les propriétés de BTQuit : align := alClient et BorderSpacing.Around := 2 ?

    Tu peux également restreindre les dimensions de ta form à l'aide de la propriété Constraints
    Ou tu peux encore utiliser la propriété AutoSize de ta form (sauf qu'avec celle-ci dans l'IDE la form ne se met pas à jour automatiquement) qui redimensionnera alors automatiquement celle-ci en fonction des dimensions de ton bouton. (des contrôles visible dans ta form)
    Tout ça est intéressant. Je vais explorer ces différentes pistes.

    Mais comme tu t'en doutes, ma fenêtre avec un seul bouton n'était qu'un exemple. Le projet pour lequel j'essaie de résoudre ce problème est celui-ci.

    https://github.com/rchastain/velena

    Je voudrais que le bas de la zone client coïncide exactement avec le bas du label (comme sur la capture d'écran). Mais dès que je passe d'un environnement à un autre (à savoir de Mageia à Manjaro), le résultat n'est plus le même.

  6. #6
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 355
    Points
    4 355
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Roland Chastain Voir le message
    Merci Jérôme pour ta réponse. Je ne connaissais pas TMenu.Height; donc c'est déjà ça de gagné.

    Désolé, mais chez moi (enfin, sur l'un de mes ordinateurs, car sur l'autre c'est différent) c'est 233. Et ton code ne me donne pas le résultat attendu. Je ne me fatigue pas à faire une capture d'écran : je suppose que tu me croiras sur parole.
    Ok donc la valeur de TMenu.Height; est différente ? non ? car elle dépend de la taille de la police de caractères utilisée.


    Citation Envoyé par Roland Chastain Voir le message
    Tout ça est intéressant. Je vais explorer ces différentes pistes.

    Mais comme tu t'en doutes, ma fenêtre avec un seul bouton n'était qu'un exemple. Le projet pour lequel j'essaie de résoudre ce problème est celui-ci.

    https://github.com/rchastain/velena

    Je voudrais que le bas de la zone client coïncide exactement avec le bas du label (comme sur la capture d'écran). Mais dès que je passe d'un environnement à un autre (à savoir de Mageia à Manjaro), le résultat n'est plus le même.
    Je vais y jeter un oeil

    A+

  7. #7
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 102
    Points : 15 587
    Points
    15 587
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    Ok donc la valeur de TMenu.Height; est différente ? non ? car elle dépend de la taille de la police de caractères utilisée.
    Voici ce que j'ai essayé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      ShowMessage(Format('MMMenu.Height=%d', [MMMenu.Height]));
      Self.Height := BTQuit.Height + 4 + MMMenu.Height;
    end;
    Et le résultat :

    Nom : capture1.png
Affichages : 217
Taille : 13,4 Ko

    Nom : capture2.png
Affichages : 208
Taille : 14,0 Ko

    Manifestement la valeur de TMenu.Height; est fausse.

  8. #8
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 355
    Points
    4 355
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Roland Chastain Voir le message
    Voici ce que j'ai essayé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      ShowMessage(Format('MMMenu.Height=%d', [MMMenu.Height]));
      Self.Height := BTQuit.Height + 4 + MMMenu.Height;
    end;
    Et le résultat :

    Manifestement la valeur de TMenu.Height; est fausse.
    Effectivement la valeur renvoyée par TMenu.Height; est fausse. En regardant ta capture de plus près la hauteur du menu = 29px et il y a bien 8px en trop en bas. Il y a bel et bien un problème sous Linux. Cela serait un bug à reporter sur le forum anglais. Je testerai demain avec Manjaro et avec mon Mac pour comparer.

  9. #9
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 147
    Points : 9 724
    Points
    9 724
    Par défaut
    hello,
    une astuce consiste à ajuster la taille de la fenêtre en calculant la hauteur du menu de la manière suivante :

    hauteurMenu = hauteur actuelle de la fenêtre - hauteur actuelle de la zone cliente.

    et voici le code qui ajuste la hauteur de la fenêtre à sa création :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TForm1.FormActivate(Sender: TObject);
    var hauteurMenu: integer;
    begin
       hauteurMenu := Self.Height - Self.ClientHeight;
       Self.Height := BtQuit.height + 4 + hauteurMenu;
    end;
    Ami calmant, J.P

  10. #10
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 102
    Points : 15 587
    Points
    15 587
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    Sinon, pourquoi ne pas mettre Les propriétés de BTQuit : align := alClient et BorderSpacing.Around := 2 ?
    Je viens d'essayer. Oui, ça fonctionne, et ça me paraît être une piste intéressante.

  11. #11
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 102
    Points : 15 587
    Points
    15 587
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par jurassic pork Voir le message
    une astuce consiste à ajuster la taille de la fenêtre en calculant la hauteur du menu de la manière suivante :

    hauteurMenu = hauteur actuelle de la fenêtre - hauteur actuelle de la zone cliente.

    et voici le code qui ajuste la hauteur de la fenêtre à sa création :
    Oui, ça fonctionne.

    P.-S. Pas sûr de bien comprendre à quoi cette valeur correspond. Elle me paraît trop grande pour être la hauteur du menu, et trop petite pour être la hauteur du menu plus la hauteur du titre. Mais peu importe puisque ça marche...

  12. #12
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 355
    Points
    4 355
    Billets dans le blog
    2
    Par défaut
    Bonjour
    Citation Envoyé par jurassic pork Voir le message
    hello,
    une astuce consiste à ajuster la taille de la fenêtre en calculant la hauteur du menu de la manière suivante :

    hauteurMenu = hauteur actuelle de la fenêtre - hauteur actuelle de la zone cliente.

    et voici le code qui ajuste la hauteur de la fenêtre à sa création :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TForm1.FormActivate(Sender: TObject);
    var hauteurMenu: integer;
    begin
       hauteurMenu := Self.Height - Self.ClientHeight;
       Self.Height := BtQuit.height + 4 + hauteurMenu;
    end;
    Ami calmant, J.P
    Oui le calcul de JP, peut marcher, mais à la condition qu'aucun autre contrôle ne soit présent sur la "form" et aligner sur "alTop" ou "alBottom"

    Citation Envoyé par Roland Chastain Voir le message
    Oui, ça fonctionne.

    P.-S. Pas sûr de bien comprendre à quoi cette valeur correspond. Elle me paraît trop grande pour être la hauteur du menu, et trop petite pour être la hauteur du menu plus la hauteur du titre. Mais peu importe puisque ça marche...
    Normalement le "HauteurMenu" avec la fonction de JP devrait te renvoyer 29px chez toi. Si c'est pas le cas, c'est qu'il y a vraiment un bug de taille avec Linux.

    Citation Envoyé par Roland Chastain Voir le message
    Je viens d'essayer. Oui, ça fonctionne, et ça me paraît être une piste intéressante.
    Oui et cela fonctionnera quelque soit la dimension de ta "form", c'est le bouton qui s'ajustera à celle-ci

    A+

  13. #13
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 355
    Points
    4 355
    Billets dans le blog
    2
    Par défaut
    Je viens de tester sous Mac, le menu se plaçant en haut de l'écran, TMenu.Height renverra toujours 0. Le Self.Height = Self.ClientHeight.
    Petit problème quand même, impossible de redimensionner le TButton en hauteur, il se place au milieu. Il faut donc utiliser un TSpeedButton à la place.

  14. #14
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 102
    Points : 15 587
    Points
    15 587
    Billets dans le blog
    9
    Par défaut
    Je clique sur "résolu". Il me semble que la proposition de JP répond bien au problème. On pourrait peut-être l'ajouter dans la FAQ ?

    @Jérôme

    Il y a des pistes intéressantes dans tes réponses. Je vais creuser tout ça.

    Citation Envoyé par BeanzMaster Voir le message
    Normalement le "HauteurMenu" avec la fonction de JP devrait te renvoyer 29px chez toi. Si c'est pas le cas, c'est qu'il y a vraiment un bug de taille avec Linux.
    Oui, c'est bien le résultat que j'obtiens.

  15. #15
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 102
    Points : 15 587
    Points
    15 587
    Billets dans le blog
    9
    Par défaut
    La solution proposée par Jérôme fonctionne aussi. Un TPanel, avec la propriété BorderSpacing.Around = 2 (par exemple), et TForm.AutoSize = True. Puis placer les autres composants sur le TPanel.

    Nom : capture.png
Affichages : 208
Taille : 12,7 Ko

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 29/05/2014, 15h43
  2. JTable: ajuster la hauteur d'une cellule automatiquement
    Par cisnake dans le forum Composants
    Réponses: 0
    Dernier message: 08/11/2012, 13h41
  3. Ajuster la hauteur d'une ligne
    Par progpro dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 20/09/2007, 08h53
  4. Clignotement d'une fenêtre dans la barre de menu
    Par RR instinct dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 12/12/2006, 11h26
  5. Comment faire une Barre de Menu?
    Par gamerome dans le forum OpenGL
    Réponses: 5
    Dernier message: 18/02/2005, 15h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo