Delphi + Skróty w akcjach

0

Mam problem ze skrótami.. Pododawałem skróty do akcji podstawoych jak Dodaj, Edytuj w Captionie.. czyli "&Dodaj", "&Edytuj".
Byłem pewien że te skróty mają działać z ALTem.. tymczasem wykonują się nawet bez niego.. da się na to coś zaradzić?

0

Jeżeli dobrze zrozumiałem, to chcesz dla TAction przypisać skrót klawiszowy. Jeżeli tak, to akcje mają własnośc ShortCut. Żeby nie rozwijać listy ze skrótami i ich szukać, wystarczy w inspektorze obiektów napisać Alt+E i wcisnąć Enter, a skrót się zatwierdzi. A jeśli nie o to chodzi to nie wiem, bo ja tak zrozumiałem. Może ktoś inny coś jeszcze lepszego Tobie tutaj doradzi.

0

no właśnie nie.. skrót to ja dodałem poprzez dodanie & w captionie.. ale zamiast działać dla ALT+E działa również dla samego E... z tego co czytam na necie to to jest problem delphi.. ale może ma ktoś rozwiązanie.
Jeśli doda sie skrót w Shortcut.. to działa niby dobrze.. dla ALT+E i prawidłowo nie włącza się dla samego E.. natomiast traci się podkreślenie litery skrótu.

0

Faktycznie, to wygląda tak jakby TAction było tak skonstruowane, co nie oznacza, że taka konstrukcja jest do końca prawidłowa i intuicyjna. No cóż, może ktoś inny coś jeszcze lepszego wymyśli i tutaj Tobie podpowie.

EDIT: jedyne na co wpadłem to takie rozwiązanie jak poniżej, trochę przekombinowane, ale działa i nic lepszego nie wymyślę - kod Unit1.pas:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ActnList;

type
  TForm1 = class(TForm)
    Button1 : TButton;
    ActionList1 : TActionList;
    Action1 : TAction;
    procedure Button1Click(Sender : TObject);
    procedure Button1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
  public
    BtnClicked : boolean;
  end;

var
  Form1 : TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender : TObject);
var
  State : TKeyboardState;
begin
  GetKeyboardState(State);
  if (State[VK_MENU] and 128 <> 0) or (BtnClicked = True) then
  begin
    ShowMessage('Wciśnięto Alt + E lub kliknięto myszką.');
  end;
end;

procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  State : TKeyboardState;
begin
  GetKeyboardState(State);
  BtnClicked := (Shift = [ssLeft]) and (State[Ord('E')] and 128 = 0);
end;

end.

Właściwości Unit1.dfm (Alt+F12 przy widocznej na pierwszym planie formatce TForm1):

object Form1: TForm1
  Left = 273
  Top = 182
  BorderIcons = [biSystemMenu, biMinimize]
  BorderStyle = bsSingle
  Caption = 'Form1'
  ClientHeight = 174
  ClientWidth = 263
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -12
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  Position = poScreenCenter
  PrintScale = poNone
  PixelsPerInch = 107
  TextHeight = 13
  object Button1: TButton
    Left = 96
    Top = 80
    Width = 75
    Height = 25
    Action = Action1
    TabOrder = 0
    OnMouseDown = Button1MouseDown
  end
  object ActionList1: TActionList
    Left = 192
    Top = 80
    object Action1: TAction
      Caption = 'T&est'
      OnExecute = Button1Click
    end
  end
end

Niestety nie działa wtedy przyciskanie Enterem. Bo wciśnięcie podkreślonej litery to tak jak naciśnięcie Entera. I ma to również miejsce przy pozycjach menu, także chyba tak musi być.

1 użytkowników online, w tym zalogowanych: 0, gości: 1