Einzelnen Beitrag anzeigen

Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.682 Beiträge
 
Delphi 5 Professional
 
#8

AW: [D2009] MainMenu Hotkey/Unterstriche immer Sichtbar

  Alt 27. Aug 2018, 00:21
Zustimmung für die Ansicht, sich ans OS zu halten. Dennoch ein möglicher Lösungsvorschlag, weil ich da bei Delphi 5 eingreifen musste, weil sich damit geschriebene Programme eben nicht an die Systemeinstellung halten/hielten und die Dinger nie anzeigten (auch wenn die Systemeinstellung aktiviert war, wie es bei mir immer der Fall ist).

Lange Rede und dennoch ein Sinn. Der Eingriff muss im TMenuItem.AdvancedDrawItem erfolgen:
Delphi-Quellcode:
type TMyMenuItem = class(TMenuItem)
  protected
     procedure AdvancedDrawItem(ACanvas: TCanvas; ARect: TRect;
      State: TOwnerDrawState; TopLevel: Boolean); override;
  end;

implementation

var
  ShowAccel : BOOL;

procedure TMyMenuItem.AdvancedDrawItem(ACanvas: TCanvas; ARect: TRect;
      State: TOwnerDrawState; TopLevel: Boolean);
begin
    if ShowAccel then
        State:= State - [odNoAccel];
    inherited;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
    ShowAccel:= True; // if SystemParametersInfo fails, assume that accelerators should be shown
    SystemParametersInfo(SPI_GETMENUUNDERLINES, 0, @ShowAccel, 0);
end;
Das Belegen der Variable ShowAccel kann z.B. im FormCreate/FormShow oder sowas erfolgen wie in obigem Beispiel, oder vielleicht eignet sich dafür auch der initialization -Abschnitt (hab ich nicht getestet).

Der obige Code umgeht (behebt) wie gesagt nur den Bug bei Delphi 5. Um die Accelerators dauerhaft anzuzeigen, müsste das Flag odNoAccel einfach pauschal entfernt werden aus dem State (und man könnte sich dann auch die Variable ShowAccel sparen). Ich rate dennoch wie himitsu davon ab, Systemeinstellungen zu überstimmen; allenfalls als Option im Programm wäre das (für mich) akzeptabel.

Grüße
Dalai
  Mit Zitat antworten Zitat