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 himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.372 Beiträge
 
Delphi 12 Athens
 
#1

AW: TMainMenu/TMenuItem problem mit Vcl.Themes

  Alt 15. Mai 2021, 14:08
Man kann auch irgendwie selbst festlegen, wo das Popup auf geht.

Beim manuellen Anzeigen, als Parameter im PopupMenu.Popup(X, Y);,
aber wie das beim auomatischen Öffnen ging, also z.B. im OnPopup, weiß ich grad nicht. (glaub aber das ging auch irgendwie)

Oder im OnMouseUp/OnKeyUp selbst das Popup öffnen.






StringReplace?

Delphi-Referenz durchsuchenStripHotkey



Zitat:
Delphi-Quellcode:
  (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;
?
Delphi-Quellcode:
  for i := 0 to Pred(FMenuItem.Count) do
      FMenuItem.Items[i].Checked := FMenuItem.Items[i].Equals(Sender);
Oder einfach ganz weg damit und die Automatik arbeiten lassen.
Bei all diesen Items AutoCheck:=True; und GroupIndex:=1; (oder welche Gruppe halt noch frei ist)
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (15. Mai 2021 um 14:13 Uhr)
  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, 14:43
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;
    Item.AutoCheck := True;
    Item.GroupIndex := 1;
    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;
begin
  StyleName := StripHotkey(TMenuItem(Sender).Caption);
  TStyleManager.SetStyle(StyleName);
end;
Danke für diese Hinweise, aber nun bleibt der Haken (checked) an, je mehr ich rumspiele um so mehr Haken sind gesetzt?!
StripHotkey kannte ich noch nicht, Danke für diese Perle!

(das hauptmenu besitzt nur die grundeinstellungen die delphi setzt wenn man es auf Form platziert, da habe ich weder fürs menu noch für den menupunkt irgendwas verändert, abgesehen vom Namen.)


Also ist es ein Bug das der das Menu ab einem wechsel oben malt bzw automatisch schließt wenn kein platz über dem Formular frei ist?
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.372 Beiträge
 
Delphi 12 Athens
 
#3

AW: TMainMenu/TMenuItem problem mit Vcl.Themes

  Alt 15. Mai 2021, 14:55
Hmmmm, Items in der selben Gruppe (<>0) da sollte eigentlich nur ein Item aktiv sein.
Wird Einer AutoChecked, müsten die Anderen ausgehn, ähnlich den RadioButton/RadioGroup.

[add]
Ahhh .RadioItem noch auf True.
Mir ist so, als wenn (ganz) früher mal nur das Setzen von GroupIndex für die RadioButton-Funktion ausgereicht hat.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.558 Beiträge
 
Delphi 7 Professional
 
#4

AW: TMainMenu/TMenuItem problem mit Vcl.Themes

  Alt 15. Mai 2021, 14:56
Versteh' ich nicht:
Delphi-Quellcode:
   if TStyleManager.ActiveStyle.Name = ACaption then
      Item.Checked := True;
Warum nicht:   Item.Checked := TStyleManager.ActiveStyle.Name = ACaption;
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

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

AW: TMainMenu/TMenuItem problem mit Vcl.Themes

  Alt 15. Mai 2021, 15:11
Danke Delphi.Narium, recht hast Du, wozu ein "If" wenn es auch ohne geht
Danke himitsu, nun sind es zwar keine Haken mehr sondern Punkte (Radio halt) aber zumindest ist es nur einer

Bleibt der Bug mit der Positionierung.
Ich probiere mal ein kleines Demo-Projekt abzukapseln ob es sich da auch so verhält oder ob in meiner Anwendung irgendwas dazwischen funkt.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

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

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
 
#7

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
Delphi.Narium

Registriert seit: 27. Nov 2017
2.558 Beiträge
 
Delphi 7 Professional
 
#8

AW: TMainMenu/TMenuItem problem mit Vcl.Themes

  Alt 15. Mai 2021, 16:57
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

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.

Ist Checked beim Klick schon gesetzt, passiert genau nix.

Sprich:
Zitat:
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?
Ist kein Bug sondern defniniertes Verhalten.
Delphi-Quellcode:
// Klick auf Item ergibt sinngemäß:
case Item.Checked of
  true : Item.Checked := false;
  false : Item.Checked := true;
end;
Gibt es weitere Abhängigkeiten, muss man die im zugehörigen Ereignis selbst implementieren.

Die an den Itmes erforderlichen Änderungen (Checked := false o. ä.) wird Dir TStyleManager.SetStyle(StyleName); nicht abnehmen. Wie auch, es weiß doch nichtmal, dass es aufgrund eines Menüklicks aufgerufen wurde.

Wird's mit sowas besser?
Delphi-Quellcode:
procedure TForm14.NativeStyleClick(Sender: TObject);
var
  StyleName: String;
  i : Integer;
begin
  for i := 0 to AMenuItem.Count - 1 do AMenuItem.Items[i].Checked := false;
  TMenuItem(Sender).Checked := true;
  StyleName := StripHotkey(TMenuItem(Sender).Caption);
  TStyleManager.SetStyle(StyleName);
end;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.372 Beiträge
 
Delphi 12 Athens
 
#9

AW: TMainMenu/TMenuItem problem mit Vcl.Themes

  Alt 15. Mai 2021, 17:38
Oberhalb des Buttons ist per se nicht "falsch",
aber auch bei normalen Popups wundere ich mich manchmal.

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.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: TMainMenu/TMenuItem problem mit Vcl.Themes

  Alt 15. Mai 2021, 18:06
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?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  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 19:35 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