Announcement

Collapse
No announcement yet.

Probleme mit Hotkeys von Buttons

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Probleme mit Hotkeys von Buttons

    Hallo,

    wie kann man verhindern, daß ein einfacher Tastendruck im Formular das Klick-Ereignis eines Schalters ausführt?
    Beispiel: Ich habe einen Drucken-Schalter. Drücke ich nun die Taste "D" (Hotkey des Schalters) wird sofort das Ereignis ausgeführt.
    Was muß ich tun, daß dies nur bei gedrückter ALT-Taste geschieht? Hängt das mit der Einstellung KeyPreview = True in meinem
    Formular zusammen?

    Vielen Dank im voraus

    Svenja

  • #2
    Hallo Svenja,

    das Problem hatte ich auch. Ich habe einige privat-Prozeduren von TButton in einer neuen Klasse überschrieben. Hier mein Vorschlag:

    TNeuButton = class(TButton)
    private
    FCharCode: word;
    procedure CMDialogKey(var Message: TCMDialogKey); message CM_DIALOGKEY;
    procedure CMDialogChar(var Message: TCMDialogChar); message CM_DIALOGCHAR;
    { Private-Deklarationen }
    protected
    { Protected-Deklarationen }
    public
    { Public-Deklarationen }
    constructor Create(AOwner: TComponent); override;
    published
    { Published-Deklarationen }
    end;

    procedure TNeuButton.CMDialogKey(var Message: TCMDialogKey);
    begin
    {Falls Message.CharCode eine Steuertaste, Wert in FCharCode speichern}
    if Message.CharCode in [0..31, 127..159] then FCharCode := Message.CharCode;

    {Ab hier übernommen von der Vorgängerklasse, die Prozedur CMDialogKey ist dort
    privat deklariert.}
    with Message do
    if (((CharCode = VK_RETURN) and Default) or
    ((CharCode = VK_ESCAPE) and Cancel)) and
    (KeyDataToShiftState(Message.KeyData) = []) and CanFocus then
    begin
    Click;
    Result := 1;
    end else
    inherited;
    end;

    procedure TNeuButton.CMDialogChar(var Message: TCMDialogChar);
    begin
    {Siehe auch Prozedur CMDialogChar der Vorgängerklasse}
    if IsAccel(Message.CharCode, Caption) and CanFocus then
    begin
    { Unterscheidung zur Vorgängerklasse}
    if (FCharCode = VK_Menu) then
    begin
    Click;
    Message.Result := 1;
    end {hier nicht "else inherited" verwenden!!!};
    end else inherited;
    end;

    constructor TNeuButton.Create(AOwner: TComponent);
    begin
    FCharCode := 0;
    inherited;
    end;

    Viel Erfolg Uw

    Comment

    Working...
    X