AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TMainMenu/TMenuItem problem mit Vcl.Themes

Ein Thema von KodeZwerg · begonnen am 15. Mai 2021 · letzter Beitrag vom 15. Mai 2021
Antwort Antwort
Benutzerbild von KodeZwerg
KodeZwerg

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

AW: TMainMenu/TMenuItem problem mit Vcl.Themes

  Alt 15. Mai 2021, 16:19
Delphi-Quellcode:
unit Unit14;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Menus, Vcl.Themes, System.Generics.Collections;

type
  TForm14 = class(TForm)
    MainMenu1: TMainMenu;
    mnuStyles: TMenuItem;
    procedure FormCreate(Sender: TObject);
  strict private
    FMenuItem: TMenuItem;
  private
    procedure NativeStyleClick(Sender: TObject);
  public
    procedure AddNativeStyle(const AMenuItem: TMenuItem);
  end;

var
  Form14: TForm14;

implementation

{$R *.dfm}

procedure TForm14.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;
    Item.RadioItem := True;
    Item.AutoCheck := True;
    Item.GroupIndex := 1;
    Item.Checked := TStyleManager.ActiveStyle.Name = ACaption;
    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 TForm14.NativeStyleClick(Sender: TObject);
var
  StyleName: String;
begin
  StyleName := StripHotkey(TMenuItem(Sender).Caption);
  TStyleManager.SetStyle(StyleName);
end;

procedure TForm14.FormCreate(Sender: TObject);
begin
  AddNativeStyle(mnuStyles);
end;

end.
Im Anhang das was bei mir passiert.

Und ich werde das NativeStyleClick wieder auf meinen Original-Zustand bringen auch wenn vom Code her falsch ausschaut.
Mit himitsus Verbesserungen funktioniert es, aber noch buggy.
Wählt man nun ein Item aus = alles super.
Wählt man das gleiche nochmal aus = verschwindet der RadioButton. Also es ist nichts visuell selektiert.

Sollte man diesen Bug melden oder ist der bereits bekannt?
Angehängte Grafiken
Dateityp: png Screenshot - vorher.png (27,9 KB, 16x aufgerufen)
Dateityp: png Screenshot - nachher.png (65,5 KB, 17x aufgerufen)
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

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

AW: TMainMenu/TMenuItem problem mit Vcl.Themes

  Alt 15. Mai 2021, 18:09
Danke Delphi.Narium, recht hast Du, wozu ein "If" wenn es auch ohne geht
Bei dem If fehlte aber auch die Else. Checked hätte eigentlich bei allen Items, bei denen das If nicht zutraf, auf false gesetzt werden müssen
Checked und Co. arbeiten nun mal halt als Flipflop. Klick = If Checked then Not Checked else Checked.
Klick <> ich bin nicht gechecked und werde durch Klick gecheckt und damit alle anderen ungechecked
Schau doch mal den Original-Code in Post #1 an, da war es halt an anderer Stelle definiert, nur eben kein FlipFlop sondern ein "es kann nur einen geben" was aber wohl falsch so sei.
Es könnte sein, dass Dir der GroupIndex dort gewaltig zwischenfunkt.
Setze den mal bei allen auf -1 (oder sonstwas < 0) und dann eine Ereignisroutine auf's Klick, die beim Geklickten Checked setzt (und alles damit zusammenhängende veranlasst) und bei allen anderen entfernt.
Werde ich gerne testen! Hand aufs Herz!

Sollte man diesen Bug melden oder ist der bereits bekannt?
Ist kein Bug sondern defniniertes Verhalten.
Damit meinte ich nicht das Verhalten was passiert wenn man im Menu was klickt, darauf habe ich ja mit normalen Bordmitteln Zugriff (zur Zeit halt nicht für mich zufriedenstellend aber daran arbeite ich noch), sondern das was ich die ganze Zeit bereits als Bug empfinde.

Sprich:
Menu malt sich nach einem wechsel des Styles Oberhalb der Form, wenn Oberhalb kein Platz ist schließt sich das Menu automatisch ohne das man es mit der Maus bedienen kann.

Oberhalb des Buttons ist per se nicht "falsch",
aber auch bei normalen Popups wundere ich mich manchmal.
Selbst wenn es nicht abnormal wäre das sich ein MainMenu Oberhalb zeichnet und nicht wie üblich unter dem Menupunkt, so verschiebt die Windows Logik solche Fenster an eine Stelle wo sie Platz haben.
Auch bei Hints geht Windows so vor ohne das ich mich selbst in die Tiefen des Paint-Events(?) rein buddeln muss.

Zum testen des ganzen ist ja der Code da, in Projekt-Optionen einfach alle Styles anhaken, fertig.



Danke schonmal für Euer Feedback Delphi.Narium und himitsu



Und zum Bug melden bin ich absolut ungeeignet falls dies ein Bug sein sollte.
Ich wüsste nicht wie ich es besser beschreiben könnte. Alles sehr laienhaft aber hoffentlich verständlich genug um von Experten verstanden zu werden.



z.B. die Contextmenüs in der Delphi-IDE.
Obwohl rechts noch mehr als genug Platz ist, gehen SubMenüs oftmals links auf. Oder nach oben, obwohl unten noch genug Platz wäre.
Kann das an einer Auflösung <> 100% liegen?
Ich arbeite auf 100%, falls Du mich überhaupt meintest.
Gruß vom KodeZwerg

Geändert von KodeZwerg (15. Mai 2021 um 18:11 Uhr)
  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 22:58 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