Новая система внутренних команд и хоткей система.

Файловый менеджер

Модератор: Модераторы

Новая система внутренних команд и хоткей система.

Сообщение B4rr4cuda » 17.06.2008 03:25:00

Наваял системы внутренних команд и хоткеев.
Начальные сведения описаны в моем блоге Система внутренних команд на основе published методов и Система внутренних команд - THotkeyManager

А здесь собственно обсуждение и некоторая информация по использованию.
Преимущества (похвастаюсь :)):
- Кроссплатформенность: никаких завязок на систему, все на основе LCL.
- Обьектность: Хоткеи подвязываются для конкретных обьектов форм или на сами формы. При этом можно назначать одинаковые хоткеи для разных обьектов на одной форме. По хоткею будет вызвана команда, ассоциированная с обьектом в фокусе, или команда ассоциированная с формой (если этот хоткей не обработан фокусированым обьектом).
- Параметры. Возможно назначение на хоткей команды с параметром.
- Возможность назначить несколько хоткеев на одну команду. Удобно, например, для привязки Del и F8 для команды cm_Delete.

Все команды из ActionList-а перенесенны в класс TActs. Экшены были оставленны для совместимости и удобства назначения команд менюшкам и кнопкам. Для всех экшенов из листа actionList главной формы, назначен один и тот же обработчик вида:
Код: Выделить всё
procedure TfrmMain.actExecute(Sender: TObject);
var cmd:string;
begin
cmd:=(Sender as TAction).Name;
cmd:='cm_'+copy(cmd,4,length(cmd)-3);
Actions.Execute(cmd);
end;


Actions - переменная типа TActs обьявленная в uGlobs.
Вызов команд возможен по имени:
Код: Выделить всё
Actions.Execute(cmd)

Код: Выделить всё
Actions.Execute(cmd,param)

или прямым вызовом:
Код: Выделить всё
Actions.cm_DirHotList;//без параметра

Код: Выделить всё
Actions.cm_DirHotList('some param');//с параметром


Категории команд в TActs:
Код: Выделить всё
function GetCategoriesList(var List:TStrings):integer;
function GetCommandsByCategory(Category:string; var List:TStrings):integer;

Категории получаем обрабатывая имя метода.
Стандартный вид команды-метода:
Код: Выделить всё
procedure cm_SomeFunction (param:string; var Result:integer);
procedure cm_SomeProcedure(param:string);
procedure cm_Category1_SomeProcedure(param:string);
procedure cm_Category2_SomeProcedure(param:string);

Методы без указания категории (например cm_SomeProcedure) считаются входящими в категорию Main
Эти категории отображаются в настройках на форме опций и позволяют назначать хоткеи для нужных контролов ориентируясь на название категории.


Хоткей-система представленна классом THotKeyManager (переменная HotMan в модуле uGlobs).
Два основных элемента - это списки
Код: Выделить всё
    FHotList:TStringList;
    FFormsList:TStringList;

FFormsList - содержит список имен форм и класс TObjInfoClass в обьекте, для каждой формы.

Код: Выделить всё
   TObjInfoClass=class
      AKeyDownProc :TKeyEvent;
      AObject      :TWinControl;
      AChilds:TStringList; //list of form's registered controls. For controls this is nil.
      destructor Destroy; override;
   end;



FHotList - трех-уровневая структура списков вида:
хоткеи ->Список форм ->Список контролов -> THotkeyInfoClass
Например:
-----------------------
Код: Выделить всё
FHotList:
| Хоткей1 ->  Список форм
               |Форма1 -> Список контролов ->   
                             | Контрол1 -> THotkeyInfoClass
                             | Контрол2 -> THotkeyInfoClass
               |Форма2 -> Список контролов ->   
                             | Контрол1 -> THotkeyInfoClass
                             | Контрол2 -> THotkeyInfoClass
                             | Контрол3 -> THotkeyInfoClass
| Хоткей2 ->  Список форм
               |Форма3 -> Список контролов ->   
                              | Контрол1 -> THotkeyInfoClass
                              | Контрол2 -> THotkeyInfoClass
                              | Контрол3 -> THotkeyInfoClass
                              | Контрол4-> THotkeyInfoClass



Код: Выделить всё
THotkeyInfoClass=class
     AShortCut,
     ACommand,
     AParams,
     AObjectName,
     AObjectFormName :string;
   end;   


Код обработки этого добра получился жутковатый, но оно того стоит.

Для регистрации менеджера хоткеев, в OnCreate формы нужно вызвать метод
Код: Выделить всё
  procedure RegisterHotkeyManager(AObject:TWinControl);

и соответственно в OnDestroy:
Код: Выделить всё
procedure UnRegisterHotkeyManager(AObject: TWinControl);


Добавление хоткеев:
Код: Выделить всё
   function AddHotKey(AHotKey,ACommand,AParams:string; AObject:TWinControl):integer;
function AddHotKey(AHotKey,ACommand,AParams,AObjectName,AObjectFormName:string):integer;

Например в OnCreate формы:
Код: Выделить всё
HotMan.AddHotkey('WinKey+A','cm_About',Self)

или
Код: Выделить всё
HotMan.AddHotkey('WinKey+A','cm_About','frmMain','frmMain')

или
Код: Выделить всё
HotMan.AddHotkey('WinKey+A','cm_About',edtCmdLine)

или
Код: Выделить всё
HotMan.AddHotkey('WinKey+A','cm_About','edtCmdLine','frmMain')


Удаление хоткея - аналогично:
Код: Выделить всё
     function DeleteHotKey(AHotKey,AObjectName,AObjectFormName:string):boolean;
     function DeleteHotKey(AHotKey:string; AObject:TWinControl):boolean;       


Например:
Код: Выделить всё
HotMan.DeleteHotkey('WinKey+A',Self)


Теперь о грустном - реализация интерфейса, для выборочной ассоциации хоткеев к контролам, практически нереальна. Только частично - заранее предусмотрев разделы, например, для раздела CmdLine, проводить привязку хоткеев к edtCmdLine, для раздела, Lister проводить привязку хоткеев к форме просмотрщика.
Полноценная выборочная привязка возможна ручной правкой конфига или из кода.
Аватара пользователя
B4rr4cuda
энтузиаст
 
Сообщения: 693
Зарегистрирован: 28.12.2007 07:48:35

Re: Новая система внутренних команд и хоткей система.

Сообщение Alexx2000 » 06.07.2008 16:37:39

Только сейчас заметил, при закрытии программы в консоль пишет вот такую ошибку:
Код: Выделить всё
frmMain.Destroy
[FORMS.PP] ExceptionOccurred
  Sender=EInvalidCast
  Exception=Invalid type cast
  Stack trace:
  $00581294  THOTKEYMANAGER__DESTROY,  line 291 of uhotkeymanger.pas
TApplication.HandleException Invalid type cast
  Stack trace:
  $00581294  THOTKEYMANAGER__DESTROY,  line 291 of uhotkeymanger.pas
Аватара пользователя
Alexx2000
постоялец
 
Сообщения: 473
Зарегистрирован: 25.10.2006 00:22:07
Откуда: Мытищи

Re: Новая система внутренних команд и хоткей система.

Сообщение B4rr4cuda » 07.07.2008 01:36:41

Да, я обратил внимание. Там, в обьекте, каким-то макаром ,в качестве формы родителя, вместо TCustomForm, оказался TWinControl.
Добавлено: Пофиксил.
Аватара пользователя
B4rr4cuda
энтузиаст
 
Сообщения: 693
Зарегистрирован: 28.12.2007 07:48:35


Вернуться в Double Commander

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

Рейтинг@Mail.ru