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ć?
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.
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.
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ć.
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.