Перейти к содержанию
Fire Monkey от А до Я
  • 0

ActionList Frame Shortcut


TrueCrypt

Вопрос

Ахой, столкнулся с очередной проблемой Firemonkey, есть Frame, в нем ActionList, на Action есть Shortcut, но почему-то он никак не хочет отрабатывать. В ActionList главной формы Shortcut работают, а на фреймах — ни в какую.

Кто сталкивался, как можно решить проблему?

Ссылка на комментарий

Рекомендуемые сообщения

  • 0
unit Forms.Persistent;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  System.Math, System.Generics.Collections,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs;

type
  TfrmPersistent = class(TForm)
  private
    FShortcuts: TDictionary<Integer, TPredicate<TfrmPersistent>>;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;

    procedure BindShortcut(const AShortcut: string; ACallBack: TPredicate<TfrmPersistent>);
    procedure UnbindShortcut(const AShortcut: string); inline;
    procedure UnbindShortcuts; inline;

    procedure KeyDown(var Key: Word; var KeyChar: Char;
      Shift: TShiftState); override;
  end;

implementation

{$R *.fmx}

{ TfrmPersistent }

constructor TfrmPersistent.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);

  FShortcuts := TDictionary<Integer, TPredicate<TfrmPersistent>>.Create;
end;

destructor TfrmPersistent.Destroy;
begin
  UnbindShortcuts;
  FShortcuts.Free;

  inherited;
end;

procedure TfrmPersistent.BindShortcut(const AShortcut: string;
  ACallBack: TPredicate<TfrmPersistent>);
var
  ms: IFMXMenuService;
begin
  if not AShortcut.IsEmpty and TPlatformServices.Current.SupportsPlatformService(
    IFMXMenuService, ms) then
    FShortcuts.Add(ms.TextToShortCut(AShortcut), ACallBack);
end;

procedure TfrmPersistent.UnbindShortcut(const AShortcut: string);
var
  ms: IFMXMenuService;
begin
  if not AShortcut.IsEmpty and TPlatformServices.Current.SupportsPlatformService(
    IFMXMenuService, ms) then
    FShortcuts.Remove(ms.TextToShortCut(AShortcut));
end;

procedure TfrmPersistent.UnbindShortcuts;
begin
  FShortcuts.Clear;
end;

end.

Пример использования:

      BindShortcut('Ctrl+O', function (AForm: TfrmPersistent): Boolean
      begin
        todo: do something
        Result := True/False;
      end);

True — сочетание обработано.

False — сочетание не обработано и будет передано вложенным компонентам.

Изменено пользователем TrueCrypt
Ссылка на комментарий
  • 0
Цитата

есть Frame, в нем ActionList, на Action есть Shortcut

Какая у вас версия? Сейчас проверил на  RAD Studio 10 — работает. У фрейма Enabled должно быть True.

Ссылка на комментарий
  • 0
В 13.04.2016 в 18:30, RoschinSpb сказал:

Какая у вас версия? Сейчас проверил на  RAD Studio 10 — работает. У фрейма Enabled должно быть True.

Хоткеи работают, но только «системные», т.е. Alt+Enter будет работать, а Shift+O — уже нет. Сначала дельфи посылает нажатие клавиш активному компоненту, а уж потом на всякие экшенлисты и т.д.

Ссылка на комментарий
  • 1

Потому, что Shift-O это не хоткей, а набранная заглавная буква "о". Естественно что набор текста используется только в каком-нибудь редакторе типа TEdit и только в том, который имеет фокус ввода. Т.е. нажатия делятся на две части одни идут только в фокусный контрол, а другие проходят по всем контролам пока кто-то их не обработает.
Иначе если на форме десяток эдитов, то текст должен набираться на всех что ли? 

Есть виртуальный метод TCommonCustomForm.IsDialogKey, который определяет как интерпретировать сочетание клавиш. Его можно перекрыть и использовать по своему усмотрению.

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...