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

Codes sources à télécharger Delphi Discussion :

Calcul de la taille (Height & With) d'un TPopupMenu de FireMonkey


Sujet :

Codes sources à télécharger Delphi

  1. #1
    Membre du Club
    Avatar de Didier LOZAC'H
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2012
    Messages : 7
    Par défaut Calcul de la taille (Height & With) d'un TPopupMenu de FireMonkey
    Bonjour,

    Comme plusieurs développeurs, je me suis heurté à l'absence de propriété et/ou de fonction donnant les dimensions (hauteur et largeur) d'un popup menu dans l’environnement FMX.
    Aussi, j'ai crée un "class helper" pour les composants FMX.Menus.TPopupMenu qui présente la propriété "Size" recherchée

    Je vous livre ici l'unité "uMenusHelper.pas" définissant cette classe. Le code reprend une partie du code en implémentation de l'unité FMX.Menus de Delphi car les classes nécessaires ne sont pas accessibles autrement
    Fichiers attachés Fichiers attachés

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 931
    Billets dans le blog
    66
    Par défaut
    Bonjour,

    Je dois avouer ne pas en comprendre l'utilité. Ma faute certaine puisque je n'utilise que rarement voire pas du tout TPopupMenu.
    D'un test (rapide) sous windows et je suppose que sous Mac ou Linux c'est identique, je comprends que le popupmenu se positionne en fonction de la position de la souris et que le questionnement c'est, qu'en cas de "débordement" de la fenêtre, est que cela pose des soucis d'où la necessité d'obtenir la taille du TPopupMenu ?

    Mais quid des mobiles ? Je n'ai jamais fait de tests.

    Un calcul des tailles (somme hauteur des éléments et max largeur des éléments) ne peut-il pas se faire ? Je sais que je l'ai déjà fait pour des TListView avec des éléments de taille variables
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes), D13 (Florence)
    SGBD : Firebird 2.5, 3, 5 et SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  3. #3
    Membre expérimenté
    Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2017
    Messages : 741
    Billets dans le blog
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    function CalcPopupMenuSize(Popup: TPopupMenu; const Canvas: TCanvas): TSizeF;
    var
      Item: TMenuItem;
      MaxWidth, TotalHeight, ItemHeight, TextWidth: Single;
    begin
      MaxWidth := 0;
      TotalHeight := 0;
     
      // Hauteur standard d’un item selon le style FMX
      ItemHeight := Popup.GetDefaultMenuItemHeight;
     
      for Item in Popup.Items do
      begin
        // Mesure du texte
        TextWidth := Canvas.TextWidth(Item.Text);
     
        // Ajout des marges internes du style
        TextWidth := TextWidth + 20; // padding approximatif
     
        if TextWidth > MaxWidth then
          MaxWidth := TextWidth;
     
        TotalHeight := TotalHeight + ItemHeight;
      end;
     
      Result := TSizeF.Create(MaxWidth, TotalHeight);
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var
      Size: TSizeF;
    begin
      Size := CalcPopupMenuSize(PopupMenu1, Form1.Canvas);
      ShowMessage(Format('Width: %.0f - Height: %.0f', [Size.Width, Size.Height]));
    end;
    On ne peut pas faire confiance à un code qu'on n'a pas entièrement écrit soi‑même, et encore moins à celui qu'on a écrit entièrement. :aie:

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 931
    Billets dans le blog
    66
    Par défaut
    @xegregory J'ai essayé ce genre de code (et d'autres à base de TTextLayout) mais n'arrive pas à avoir de bons résultats.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    function TForm1.GetPopupMenuSize(PopupMenu: TPopupMenu; out Width,
      Height: Single): Boolean;
    var
      i: Integer;
      TextSize: TSizeF;
      TextLayout: TTextLayout;
      MaxWidth: Single;
      TotalHeight: Single;
    begin
      Result := PopupMenu.ItemsCount > 0;
      if not Result then Exit;
     
      TextLayout := TTextLayoutManager.DefaultTextLayout.Create;
       try
        MaxWidth := 0;
        TotalHeight := 0;
     
        for i := 0 to PopupMenu.ItemsCount - 1 do
        begin
          TextLayout.Font.Assign(PopupMenu1.Items[i].TextSettings.Font);
          TextLayout.Text := PopupMenu1.Items[i].Text;
          MaxWidth := Max(MaxWidth, TextLayout.Width + 60);    
          totalheight:=totalheight+PopupMenu1.Items[i].Height; 
        end;
      finally
        TextLayout.Free;
      end;
      width:=maxwidth;
      height:=totalheight;
    end;
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes), D13 (Florence)
    SGBD : Firebird 2.5, 3, 5 et SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

Discussions similaires

  1. Calcul de la taille d'un répertoire
    Par fdthierry dans le forum Langage
    Réponses: 5
    Dernier message: 07/07/2008, 15h28
  2. Calcul de la taille d'un répertoire
    Par Jexx dans le forum IIS
    Réponses: 3
    Dernier message: 04/04/2007, 08h22
  3. [ASE]Calcul de la taille de mes tables
    Par arona dans le forum Sybase
    Réponses: 6
    Dernier message: 01/09/2006, 15h36
  4. Calcul de la taille d'une variable
    Par bandit boy dans le forum C++Builder
    Réponses: 8
    Dernier message: 30/06/2006, 04h08
  5. Calcul de la taille d'une future base de données
    Par Kuma25 dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 17/08/2005, 09h54

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