Перейти к содержанию

Вопросы

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

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

Поделиться сообщением


Ссылка на сообщение

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

  • 0
30 минут назад, TrueCrypt сказал:

Нашел, в каком-то плане, красивое решение. Публиковать?

Конечно

Поделиться сообщением


Ссылка на сообщение
  • 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 эмодзи.

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

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

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


  • Похожий контент

    • От FREEFAR
      Друзья, помогите-таки расставить точки над "И".
      Как же все таки правильно уничтожать динамически создаваемые компоненты TFrame
      Сейчас делаю так:
                        mapFrame.DisposeOf;
                        mapFrame.Parent := nil;
                        mapFrame := nil;
      Вроде удаляется и новый создается.
      Но вот беда.
      Если я создам функцию типа FreeFrame(Frame: TFrame);
      то как бы я ее не вызывал с входным параметром "mapFrame"
      фрейм все равно живет...
      Что не так? Куда копать?
    • От david_yusupov
      Cтолкнулся с не большой проблемой. Разрабатываю фрейм, использованием событие OnResize. Суть проблемы создаем динамически очень много объектов, и в зависимости от размера фрейма, обсчитываем положение и обновление размеры обетов.
      Приводит к зависанию всего приложения.
    • От ramir
      В модальном окне срабатывает Action по ShortCut- у другого окна
      Наткнулся на неожиданную проблему.
      В диалоговом окне по ShortCut срабатывает Action другой формы. Например, вызвал окно по ShowModal, случайно (или не очень) нажал Ctrl-O и на тебе - окно выбора файла из главного окна.
      Изучение метода TCommonCustomForm.KeyDown привело к такому коду
      ... // 5. perform key in all ActionLists in Childrens TraverseChildren(self); // 6. perform key in all main menus and ActionLists in other forms OtherForms(True); OtherForms(False); ... procedure OtherForms(IsMain: boolean); var I, J: integer; F: TCommonCustomForm; begin if Done then Exit; for I := 0 to Screen.FormCount - 1 do if (Screen.Forms[I] <> self) and (Screen.Forms[I].Visible) and (IsMain xor (Screen.Forms[I] <> Application.MainForm)) then begin F := Screen.Forms[I]; for J := F.ChildrenCount - 1 downto 0 do begin if F.Children[J] is TMainMenu then TMainMenu(F.Children[J]).DialogKey(Key, Shift); if Key = 0 then begin Done := True; Exit; end; end; TraverseChildren(F); if Done then Exit; end; end; т.е. если ShortCut в активном оокне не отработал ищется по всем другим формам.
      Не знаю, для чего это нужно, но в модальном окне такое поведение вызывает мягко говоря недоумение.
      Решить проблему напрямую простыми способами пока не получилось, пока пришлось дизайблить все ActionList-ы перед вызовом диалога.
      Может всетаки есть какой то нормальный споcоб обойти проблему?
      PS. В Berline похоже такаяже хрень.
    • От Cody71727172
      Здравствуйте!
       
      В приложении используется стандартное действие из ActionList - MediaLibrary - TTakePhotoFromLibrary/CameraAction
      Открываем галерею, выбираем изображение - приложение перезапускается
      Пытаемся сделать снимок с камеры - то же самое
       
      XE10, тестировалось на Asus Zenfone 2 (Intel Atom)
    • От yura371
      Здравствуйте. Я для получения фото с камеры использую TakePhotoFromCameraAction. При сохранении фотографии в разрешении 8МП, у меня выходит ошибка "Out Of Memory". При уменьшении разрешения ошибка исчезает. Также ошибка исчезает при переключении в настройках проекта "LargeHeap" на "true", но появляется другая: приложение при каждом втором запуске(после полной выгрузки из памяти) виснет на логотипе. 
      Вопрос: Можно ли это как то исправить? Ошибка происходит до выполнения процедуры TakePhotoFromCameraAction1DidFinishTaking(Image: TBitmap)-делал её пустой. 
      Еще заметил что ошибки нету при выполнении программы в debug режиме.
      Спасибо.
    • От To_LED
      Добрый день столкнулся с такой проблемой при использовании ActionList-Media library-TakePhotoFromCameraAction пропадают все компоненты на форме в Run time с чем это может быть связано?
    • От Николай Ряполов
      Доброго дня.
      Решил попробовать начать работу с фреймами, но столкнулся со следующей ситуацией.
      При отображении фрейма на главной форме своевременно не отрисовываются события и перемещения курсора по компонентам фрейма.
      Фрейм добавляю с палитры компонентов.
      Плолучается примерно следующий вид:
         
      Как избавиться от этого?
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

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