AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls TMainMenu: Änderung der Schriftgröße ändert nicht den Abstand der Einträge
Thema durchsuchen
Ansicht
Themen-Optionen

TMainMenu: Änderung der Schriftgröße ändert nicht den Abstand der Einträge

Ein Thema von KHJ · begonnen am 18. Jun 2025 · letzter Beitrag vom 22. Jun 2025
Antwort Antwort
KHJ

Registriert seit: 15. Dez 2005
41 Beiträge
 
Delphi 12 Athens
 
#1

TMainMenu: Änderung der Schriftgröße ändert nicht den Abstand der Einträge

  Alt 18. Jun 2025, 17:58
Wenn ich die Schriftgröße des TMainMenu während der Laufzeit ändern will, dann muss ich das über Screen.MenuFont.Assign(EinFont) machen.
Das erfordert auch, dass IM Objektinspektor die Eigenschaft OwnerDraw := true setze.
Das funktioniert auch so weit.

Aber der Abstand zwischen den Menüeinträgen verändert sich nicht und dadurch sieht es unschön aus oder ist nicht mehr vollständig lesbar.

Ist das ein Bug?
Und wie kann ich das beheben?

Karlheinz
Angehängte Grafiken
Dateityp: jpg TMainMenu_NachÄnderung_Size12.jpg (42,8 KB, 40x aufgerufen)
Dateityp: jpg TMainMenu_NachStart_Size9.jpg (29,1 KB, 41x aufgerufen)
Karlheinz Jansen
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.715 Beiträge
 
Delphi 12 Athens
 
#2

AW: TMainMenu: Änderung der Schriftgröße ändert nicht den Abstand der Einträge

  Alt 18. Jun 2025, 22:31
Ist das ein Bug?
Nein.

Und wie kann ich das beheben?
In dem du die OnMeasureItem-Events der jeweiligen MenuItems sinnvoll implementierst.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
DaCoda

Registriert seit: 21. Jul 2006
Ort: Hamburg
181 Beiträge
 
Delphi 12 Athens
 
#3

AW: TMainMenu: Änderung der Schriftgröße ändert nicht den Abstand der Einträge

  Alt 19. Jun 2025, 17:16
So wie von Uwe schon angedeutet. Etwa so:

Code:
procedure TForm1.MainMenu1MeasureItem(Sender: TObject; ACanvas: TCanvas; var Width, Height: Integer);
begin
  // Weite und Höhe vom MenuItem
  Width := ACanvas.TextWidth('Custom Menu Item Text') + 20; // 20px Padding
  Height := ACanvas.TextHeight('Custom Menu Item Text') + 10; // 10px Padding
end;
Debuggers don’t remove bugs, they only show them in slow-motion.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
10.014 Beiträge
 
Delphi 12 Athens
 
#4

AW: TMainMenu: Änderung der Schriftgröße ändert nicht den Abstand der Einträge

  Alt 19. Jun 2025, 22:46
Leider wird das alles nicht aufgerufen. Es kommt gar nicht erst WM_MEASUREITEM, so dass es keinerlei Unterschied macht, ob die Events zugewiesen sind oder nicht.

Auch DrawMenuBar usw. bringt nichts. Und die Möglichkeiten zur Neuerstellung des Handles sind so eingekapselt, dass man da nicht so einfach herankommt. So funktioniert es korrekt (zum Testen einfach die Typdeklaration über das Formular schreiben, damit unser TMenuItem statt dem aus Vcl.Menus verwendet wird):
Delphi-Quellcode:
type
  TMenuItem = class(Vcl.Menus.TMenuItem)
  public
    procedure Rebuild;
  end;

procedure CallByAddress(Instance: TObject; Address: Pointer);
type
  TRebuildHandleProc = procedure of object;
var
  Method: TMethod;
  Proc: TRebuildHandleProc;
begin
  Method.Code := Address;
  Method.Data := Instance;
  Proc := TRebuildHandleProc(Method);
  Proc;
end;

procedure TMenuItem.Rebuild;
begin
{$if CompilerVersion = 36}
  CallByAddress(Self, Pointer(NativeUInt(@TMenuItem.Insert) - $34B4));
{$else}
  {$message error 'Die Adresse muss für diese Delphiversion ggf. angepasst werden!'}
{$ifend}
  MenuChanged(True);
end;
Aufruf:
Delphi-Quellcode:
var
  i: Integer;
begin
  Screen.MenuFont.Size := 16;
  for i := 0 to MainMenu1.Items.Count - 1 do
    TMenuItem(MainMenu1.Items[i]).Rebuild;
end;
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
KHJ

Registriert seit: 15. Dez 2005
41 Beiträge
 
Delphi 12 Athens
 
#5

AW: TMainMenu: Änderung der Schriftgröße ändert nicht den Abstand der Einträge

  Alt 20. Jun 2025, 09:18
Danke für die Tips.
Der einfachste Weg, der fast alles abdeckt:

Delphi-Quellcode:
  // set the menu font
  Screen.MenuFont.Assign(Self.Font);

  // push and redraw the menu by inserting and deleting a menu item
  lTempItem := TMenuItem.Create(mmuMainMenu);
  try
    lTempItem.Name := 'tempitem';
    mmuMainMenu.Items.Add(lTempItem);
    mmuMainMenu.Items.Remove(lTempItem);
  finally
    lTempItem.Free;
  end;
Karlheinz Jansen

Geändert von KHJ (20. Jun 2025 um 10:02 Uhr)
  Mit Zitat antworten Zitat
KHJ

Registriert seit: 15. Dez 2005
41 Beiträge
 
Delphi 12 Athens
 
#6

AW: TMainMenu: Änderung der Schriftgröße ändert nicht den Abstand der Einträge

  Alt 20. Jun 2025, 10:41
Um nicht nur den Toplevel zu ändern, sondern auch alle Submenus:

Delphi-Quellcode:
  procedure RefreshMenuItem(aMenuItem: TMenuItem);
  var
    lTempItem: TMenuItem;
    i: Integer;
  begin

    lTempItem := TMenuItem.Create(aMenuItem);
    try
      lTempItem.Caption := 'tempitem';
      aMenuItem.Add(lTempItem);
      aMenuItem.Delete(aMenuItem.Count - 1);
    finally
      lTempItem.Free
    end;

    // and rekursiv through all sub menus of the current menu item
    for i := 0 to aMenuItem.Count - 1 do
    begin
      RefreshMenuItem(aMenuItem.Items[i]);
    end;
  end;

  procedure RefreshMainMenu(aMenu: TMainMenu);
  var
    i: Integer;
    lTempItem: TMenuItem;
  begin

    // toplevel
    lTempItem := TMenuItem.Create(aMenu);
    try
      lTempItem.Name := 'tempitem';
      aMenu.Items.Add(lTempItem);
      aMenu.Items.Remove(lTempItem);
    finally
      lTempItem.Free;
    end;

    // sublevels
    for i := 0 to aMenu.Items.Count - 1 do
    begin
      RefreshMenuItem(aMenu.Items[i]);
    end;
  end;
Karlheinz Jansen

Geändert von KHJ (21. Jun 2025 um 09:07 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.715 Beiträge
 
Delphi 12 Athens
 
#7

AW: TMainMenu: Änderung der Schriftgröße ändert nicht den Abstand der Einträge

  Alt 20. Jun 2025, 18:54
Leider wird das alles nicht aufgerufen.
Das kommt schon, wenn man beim Menü das OwnerDraw auf True stellt. Diese Einstellung wurde auch im Eingangspost erwähnt.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
10.014 Beiträge
 
Delphi 12 Athens
 
#8

AW: TMainMenu: Änderung der Schriftgröße ändert nicht den Abstand der Einträge

  Alt 20. Jun 2025, 22:34
Das kommt schon, wenn man beim Menü das OwnerDraw auf True stellt.
Bei mir nicht, das habe ich schon alles versucht. Vermutlich ist das so, weil die Schriftart keine Änderung ist, die Windows kennt. Dementsprechend besteht systemseitig keine Notwendigkeit für eine erneute Größenberechnung.

Ich habe direkt geschaut, ob die Windows Messages ankommen. Das war nicht der Fall. Und entsprechend wurden auch die Haltepunkte in der Methode, die am Ende das Event aufruft, und an anderen Stellen nicht erreicht.

Ist das bei dir anders?
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:43 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz