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 — сочетание не обработано и будет передано вложенным компонентам.