Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   TMainMenu: Änderung der Schriftgröße ändert nicht den Abstand der Einträge (https://www.delphipraxis.net/217372-tmainmenu-aenderung-der-schriftgroesse-aendert-nicht-den-abstand-der-eintraege.html)

KHJ 18. Jun 2025 17:58

TMainMenu: Änderung der Schriftgröße ändert nicht den Abstand der Einträge
 
Liste der Anhänge anzeigen (Anzahl: 2)
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

Uwe Raabe 18. Jun 2025 22:31

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

Zitat von KHJ (Beitrag 1549531)
Ist das ein Bug?

Nein.

Zitat:

Zitat von KHJ (Beitrag 1549531)
Und wie kann ich das beheben?

In dem du die OnMeasureItem-Events der jeweiligen MenuItems sinnvoll implementierst.

DaCoda 19. Jun 2025 17:16

AW: TMainMenu: Änderung der Schriftgröße ändert nicht den Abstand der Einträge
 
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;

jaenicke 19. Jun 2025 22:46

AW: TMainMenu: Änderung der Schriftgröße ändert nicht den Abstand der Einträge
 
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;

KHJ 20. Jun 2025 09:18

AW: TMainMenu: Änderung der Schriftgröße ändert nicht den Abstand der Einträge
 
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;

KHJ 20. Jun 2025 10:41

AW: TMainMenu: Änderung der Schriftgröße ändert nicht den Abstand der Einträge
 
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;

Uwe Raabe 20. Jun 2025 18:54

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

Zitat von jaenicke (Beitrag 1549560)
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.

jaenicke 20. Jun 2025 22:34

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

Zitat von Uwe Raabe (Beitrag 1549572)
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?

Uwe Raabe 21. Jun 2025 08:56

AW: TMainMenu: Änderung der Schriftgröße ändert nicht den Abstand der Einträge
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ist es in der Tat (Delphi 12.3 latest Patches, Windows 10 22H2).

KHJ 21. Jun 2025 09:23

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

Zitat von Uwe Raabe (Beitrag 1549575)
Ist es in der Tat (Delphi 12.3 latest Patches, Windows 10 22H2).

On start up of the form yes, but not after a change of Screen.MenuFont.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
 if FontDialog1.Execute then
 begin
   Self.Caption := Fontdialog1.Font.Name;
   Screen.MenuFont.Assign(FontDialog1.Font);
 end;
end;

procedure TForm1.File1MeasureItem(Sender: TObject; ACanvas: TCanvas; var Width,
    Height: Integer);
begin
//
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:40 Uhr.
Seite 1 von 2  1 2      

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