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