IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Téléchargé 1 fois
Vote des utilisateurs
0 
0 
Détails
Licence : Non renseignée
Mise en ligne le 18 juillet 2026
Langue : Anglais
Référencé dans
Navigation

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

Cette unité contient un "Class Helper for TPopupMenu" qui ajoute la propriété "Size" au composant "TPopupMenu" de FireMonkey.
Elle calcule les dimensions (Height & Width) qu'aura le popup menu à l'affichage.

Elle duplique une partie du code de l'unité FMX.Menu de Delphi car celui-ci se trouve dans la partie Implémentation et est donc innaccessible.
Le calcule duplique partie de la méthode TPopupMenu.Popup qui calcule ces valeurs
Avatar de Didier LOZAC'H
Candidat au Club https://www.developpez.com
Le 18/07/2026 à 16:13
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
Avatar de XeGregory
Membre averti https://www.developpez.com
Le 19/07/2026 à 11:39
Code : Sélectionner tout
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
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;
Avatar de SergioMaster
Rédacteur/Modérateur https://www.developpez.com
Le 19/07/2026 à 12:42
@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
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;
Developpez.com décline toute responsabilité quant à l'utilisation des différents éléments téléchargés.