Frage

Ich habe mein Bestes versucht und kann nicht herausfinden, was hier passiert ist. Es funktionierte gut in Delphi 4. Nach dem Upgrade auf Delphi 2009, ich weiß nicht, ob dies der richtige Weg ist es funktionieren soll, oder wenn es ein Problem:

Dies ist, was Menü meines Programms sieht aus wie im Design-Modus unter Delphi 2009:

Beachten Sie, dass jedes Wort im Hauptmenü und die Datei-Untermenü einen Buchstaben unterstrichen haben. Es soll so sein. Diese unterstrichenen Buchstaben werden der Zugriffsschlüssel genannt und ist Standard in Windows-Anwendungen, so dass Sie die Alt-Taste und den Brief schnell verwenden können, um den Menüpunkt auszuwählen und dann Untermenüpunkt mit der Tastatur anstatt mit der Maus.

Sie sie auf diese Weise erhalten, indem das Zeichen „&“ als Teil der Beschriftung des Elements verwendet wird, zum Beispiel: Save & As ...

Wenn ich meine Anwendung ausführen, und verwenden Sie die Maus, um das Menü Datei zu öffnen, sieht es wie folgt aus:

Die Zeichen werden im Hauptmenü unterstreicht, sind aber nicht im Datei-Menü unterstrichen.

Wenn stattdessen verwende ich die Alt-Taste F das Untermenü Datei zu öffnen, dann sieht es richtig wie folgt aus:

und alle Accelerator Key Buchstaben sind unterstrichen richtig.

Ich habe mit der AutoHotKeys Option gespielt, aber das ist nicht das Problem.

Hat jemand vor diesem Problem begegnet? Ist das Beispiel in der 2. Bild richtige Verhalten, dass ich nicht weiß? Oder gibt es eine Option oder Codierung Fehler, dass ich vielleicht verpasst haben?


November 2009 (ein Jahr später): mghie scheint die Wurzel dieses bekommen zu haben und das Problem gelöst. Siehe seine akzeptierte Antwort unten.

War es hilfreich?

Lösung

Es gibt eine Standard-Einstellung von Windows (unter Anzeigeeigenschaften), die normalerweise auf solche Beschleuniger verstecken, wenn die Alt-Taste gedrückt gehalten wird. Das würde erklären, warum das Menü mit Alt + F10 Öffnen zeigt sie für Sie. Vielleicht ist die Ursache?

[EDIT]: Nein, es ist nicht. Ich habe gerade versucht, und ein einfaches TForm mit einem Menüpunkt zeigt das Gaspedal, aber sobald ich einen TImageList und stellen Sie den Imageindex des einzelnen Menüpunktes oder einfach eingestellt OwnerDraw auf true hinzufügen, dann dem Gaspedal unterstrichen verschwindet. Ich denke, das ist wirklich ein Fehler in der VCL ist.

BTW, ist dies unter Windows XP.

Umgehung:

Ich habe diese mit Delphi 2009 auf Windows XP debuggt 64 und die Ursache für die fehlende Beschleuniger scheint zu sein, dass Windows WM_DRAWITEM Nachrichten mit dem ODS_NOACCEL-Flag sendet, die es soll nicht, wenn das System eingestellt ist Beschleuniger zeigen jederzeit. So könnte man sagen, dass es keinen VCL Bug, sondern ein Windows-Problem, das die VCL um nicht funktioniert.

Sie können aber um es in Ihrem eigenen Code arbeiten, müssen Sie nur das Flag zurücksetzen, bevor die Nachricht an die VCL vorbei. Überschreiben Sie die Fenster proc

protected
  procedure WndProc(var Message: TMessage); override;

wie folgt:

procedure TYourForm.WndProc(var Message: TMessage);
const
  ODS_NOACCEL = $100;
var
  pDIS: PDrawItemStruct;
  ShowAccel: BOOL;
begin
  if (Message.Msg = WM_DRAWITEM) then begin
    pDIS := PDrawItemStruct(Message.LParam);
    if (pDIS^.CtlType = ODT_MENU)
      and SystemParametersInfo(SPI_GETKEYBOARDCUES, 0, @ShowAccel, 0)
    then begin
      if ShowAccel then
        pDIS^.itemState := pDIS^.itemState and not ODS_NOACCEL;
    end;
  end;
  inherited;
end;

Dies ist nur Demonstration Code ist, sollten Sie nicht nennen SystemParametersInfo() wird jedes Mal eine WM_DRAWITEM Nachricht empfangen, aber einmal beim Programmstart und dann eine WM_SETTINGCHANGE Nachricht jedes Mal, wenn Ihr Programm empfängt.

Andere Tipps

Es ist ein "Feature" eingeführt mit Windows 2000:

The Old New Thing: Warum funktioniert Windows verstecken Tastatur Beschleuniger und Fokusrechtecke standardmäßig?

Es scheint, dass Delphi 4 nicht diese Windows-Funktion unterstützt hat.

2000 haben und XP-Menüs zeigen Zugriffstasten rechten Maustaste auf eine leere Stelle auf dem Desktop, wählen Sie Eigenschaften, klicken Sie auf die Registerkarte Darstellung, und unter Effekte, deaktivieren Sie Verstecken unterstrichene Buchstaben für Tastaturnavigation bis ich die ALT Key . Klicken Sie auf OK zweimal.

Nicht sicher, wie es in Vista zu tun.

Ich glaube nicht, es ist ein Delphi erzeugt Fehler, wie Sie das gleiche Verhalten mit Notepad auf Vista haben. Auch in Delphi selbst BTW ...
Ich muss gestehen, dass ich nicht die Aufmerksamkeit vor Ihrer Frage bezahlt haben. Vielen Dank für den Hinweis it out.

Wie Jim McKeeth oben (richtig) erwähnt, ist dieses "by design" Verhalten. Wenn die Menüs über die Tastatur Aktion ausgelöst werden, sollten die Beschleuniger gezeigt werden, sondern durch die Maus dann ausgelöst, wenn die Beschleuniger sind absichtlich nicht gezeigt.

ich meine XP konfiguriert Beschleuniger jederzeit zu zeigen, aber ein schneller Test mit dieser Option geändert wird bestätigt, dass die Menüs nicht Streichungen zeigen sollten entweder (Visual Studio reagiert, wie ich erwartet hatte, keine Unterstreichungen, wenn mit der Maus). Jedoch ignoriert Microsoft Office diese Einstellung und zeigt immer die Unterstreichungen. So ist es wie ein Fehler in aussieht, wie die Menüs in Delphi gezogen werden (ich habe keine Erfahrung mit Delphi selbst).

fand ich die Option für Vista auch: http://www.vistax64.com/vista-general/42125-always-show-menu-underline-keyboard-accelerators.html

  

Sie können dies einschalten im neuen Center für erleichterte Bedienung (gehen Sie zu steuern   Konsole auf die erleichterte Bedienung und dann Center für erleichterte Bedienung klicken). Im   Machen Sie die Tastatur einfacher das Center für erleichterte Bedienung, klicken Sie zu verwenden, und   zuunterst wählen Sie die Unterstrichen Tastaturkürzel und Zugang   Tasten Kontrollkästchen.

Während die weitere Forschung zu tun fand ich diesen verwandten Fehler auf Delphi-Foren: http: //qc.codegear.com/wc/qcmain.aspx?d=37403

Es sieht aus wie das Kind Fenster in Ihrem Fall (die gezogenen Menüs) nicht bekommen oder Handhabung nicht WM_UIUPDATESTATE Nachricht von ihrem übergeordneten Fenster, das ist es, was die mit Beschleunigern neu zeichnen verursacht.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top