Einzelnen Beitrag anzeigen

Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#1

TMainMenu/TMenuItem problem mit Vcl.Themes

  Alt 15. Mai 2021, 13:52
Hallo liebe DP!

Ich bin mal wieder auf ein Problem gestoßen, an dem, so hoffe ich jedenfalls, ich keine Schuld habe.

Folgendes mache ich, ich erstelle auf einer Form ein MainMenu, per Designer erstelle ich einen Menupunkt.
Im FormCreate rufe ich dann eine mehode auf die diesen Menupunkt füllt.

Das klappt auch alles sehr gut.

Nun das Problem, wenn ich vom jetzigen in ein anderes Vcl.Theme wechsle wird das Menu immer oberhalb der Form dargestellt.
Das nervt aber ist noch nicht das eigentliche Problem.
Wenn oberhalb der Form kein Platz ist (Monitor begrenzt den Spielraum) schließt sich das Menu automatisch wieder.

Kann man das ändern bzw ist das ein Bug?

Hier der Code wie ich das Menu fülle und das entsprechende OnClick-Event:
Delphi-Quellcode:
procedure kzTheme.AddNativeStyle(const AMenuItem: TMenuItem);
  procedure AddMenuEntry(const ACaption: string; const AValue: Integer);
  var
    Item: TMenuItem;
  begin
    Item := TMenuItem.Create(FMenuItem);
    Item.Caption := ACaption;
    Item.OnClick := NativeStyleClick;
    if TStyleManager.ActiveStyle.Name = ACaption then
      Item.Checked := True;
    if ((AValue) mod 10) = 0 then
      Item.Break := mbBarBreak;
    FMenuItem.Add(Item);
  end;
var
  Arr: TArray<string>;
  SystemStyle: string;
  FoundStyle: String;
  i: Integer;
begin
  FMenuItem := AMenuItem;
  FMenuItem.Clear;
  FMenuItem.AutoLineReduction := maAutomatic;

  arr := TStyleManager.StyleNames;
  TArray.Sort<string>(arr);
  SystemStyle := TStyleManager.SystemStyle.Name;
  AddMenuEntry(SystemStyle, 0);

  i := 1;
  for FoundStyle in arr do
  begin
    if FoundStyle <> SystemStyle then
    begin
      AddMenuEntry(FoundStyle, i);
      Inc(i);
    end;
  end;
end;

procedure kzTheme.NativeStyleClick(Sender: TObject);
var
  StyleName: String;
  i: Integer;
begin
  StyleName := StringReplace(TMenuItem(Sender).Caption, '&', '',
    [rfReplaceAll, rfIgnoreCase]);
  TStyleManager.SetStyle(StyleName);
  (Sender as TMenuItem).Checked := true;
  for i := 0 to Pred(FMenuItem.Count) do
    if (not FMenuItem.Items[i].Equals(Sender)) then
      FMenuItem.Items[i].Checked := false;
end;
Im OnCreate des Hauptformulars steht halt nur MyTheme.AddNativeStyle(mnuVcl); . (mnuVcl ist der von mir per Designer erzeugte Menupunkt)

Danke fürs Lesen!
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat