Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.05.20;
Скачать: CL | DM;

Вниз

Горячие клавиши на форме!   Найти похожие ветки 

 
kyn66 ©   (2007-03-15 15:13) [0]

Не получив ответа, пытаюсь сформулировать вопрос по другому. Каким образом на форме отлавливать разные комбинации горячих клавишь, указанных пользователем в настройках программы и записаных в реестр, к примеру ???. Заношу в реестр посредством THotKey

WriteString("HotKey", "HotBufKey",hortCutToText(HotKey1.HotKey));
WriteString("HotKey", "HotDskKey",hortCutToText(HotKey2.HotKey));


занес две комбинации.
Как теперь на форме мне отлавливать эти комбинации и выполнять то или иное действие в зависимости от того, какая комбинация нажата ?


 
Desdechado ©   (2007-03-15 15:26) [1]

Зачем тебе в реестре клавиши для формы?
Используй TAction, Form.KeyPreview


 
Leonid Troyanovsky ©   (2007-03-15 15:51) [2]


> Desdechado ©   (15.03.07 15:26) [1]

> Используй TAction, Form.KeyPreview

На второе, видимо, имелось ввиду FormShortCut.
Только оно, в данном случае, менее удобно.

--
Regards, LVT.


 
kyn66 ©   (2007-03-15 15:54) [3]

> Desdechado
Я не хочу обсуждать место хранения.... Механизм интересует (см. вопрос) Комбинации горячих клавишь заранее неизвестны.


 
Сергей М. ©   (2007-03-15 15:56) [4]


> kyn66 ©   (15.03.07 15:54) [3]


> не хочу обсуждать место хранения.


Ну и какого же тогда хрена ты упоминаешь реестр, коли "не хочу обсуждать" ?)


> Комбинации горячих клавишь заранее неизвестны


Вот как будут известны, так и вызывай RegisterHotKey()


 
kyn66 ©   (2007-03-15 16:29) [5]


> Ну и какого же тогда хрена ты упоминаешь реестр, коли "не
> хочу обсуждать" ?)

В вопросе внимание акцентировалось на механизме обработки введенной юзером комбинации, а не месте ее хранения !!! По поводу RegisterHotKey() вот ща смотрю, тока здесь загоняются в него уже известные комбинации. А в моем случае я могу получить что ввел юзер : типа "Shift+Ctrl+F12"/ И че дальше? Как мне енто добро прикрутить в RegisterHotKey() а потом на форме отлавливать именно такую комбинацию?


 
Плохиш ©   (2007-03-15 16:37) [6]


> По поводу RegisterHotKey() вот ща смотрю, тока здесь загоняются
> в него уже известные комбинации. А в моем случае я могу
> получить что ввел юзер

Если пользователь что-то ввёл, то это уже становиться известной комбинацией.

> типа "Shift+Ctrl+F12"/ И че дальше?

RegisterHotkey(self.Handle, 2, MOD_CTRL or MOD_SHIFT , VK_F12)


 
Сергей М. ©   (2007-03-15 16:37) [7]


> kyn66 ©   (15.03.07 16:29) [5]


>
> В вопросе внимание акцентировалось на механизме обработки
> введенной юзером комбинации,


Да неужто ?!

Судя по слову "реестр" в твоем вопросе оно как раз и очевидно)


> ввел юзер : типа "Shift+Ctrl+F12"/ И че дальше?


Че, че .. ) .. парсер задействуй, вот "че")

А ты что, заставляешь юзера запомнить и писать потом все эти страшные слова (Shift, Ctrk, F12) ?)

Ну ты и садист, братец)


 
kyn66 ©   (2007-03-15 17:15) [8]

>Плохиш

> > типа "Shift+Ctrl+F12"/ И че дальше?RegisterHotkey(self.
> Handle, 2, MOD_CTRL or MOD_SHIFT , VK_F12)

Это по тексту понятно.... Парсер нужен.

>Сергей М.
Необязательно страшные комбинации. Все зависит от памяти юзверя, можно и "Ctrl+1" приклеить. А к томуже на форме у меня напоминалка ешшо пробегает с этой омбинацией ;-)


 
Сергей М. ©   (2007-03-15 17:19) [9]


> kyn66 ©   (15.03.07 17:15) [8]


> Все зависит от памяти юзверя


Угу, как раз на это и следует уповать)
Память у юзверей следует дрессировать)
Или гнать в шею "бабаклав", не способных воспроизвести на "бабоклавиатуре" страшное слово "Ctrl+1")


 
kyn66 ©   (2007-03-15 17:55) [10]

Вижу обсуждение перешло в флудовское русло


 
GrayFace ©   (2007-03-15 18:36) [11]

В пределах формы - создай PopupMenu, настрой на нее Form.PopupMenu и в OnContextPopup сделай Handled:=false; потом меняй ShortCut-ы пунктов.
Парсер не нужен, в Menus есть TextToShortCut.


 
kyn66 ©   (2007-03-16 09:18) [12]

>GrayFace
Спасибо за предложенный вариант. Пока не проверяя хочу спросить по такому вопросу. Я нашел ешшо один вариант. Но и в предложенном сейчас и в моем приходится прибегать к помощи дополнительных компонентов. В моем примере мне пришлось положить на форму два невидимых THotKey. Вот что из этого получается. Можно-ли этот код как-то упростить, дабы не прибегая к промежуточным компонентам ?

procedure TGenTFrm.FormCreate(Sender: TObject);
Var
 modif  : Integer;
 K : Word;
 SS : TShiftState;
begin
 // Регистрация первой горячей комбинации
 modif := 0;
 HK1.HotKey := TextToShortCut(Opt_A.HotBufStr);
 if (hkCtrl in HK1.Modifiers) then modif := modif + MOD_CONTROL;
 if (hkAlt in HK1.Modifiers) then modif := modif + MOD_ALT;
 if (hkShift in HK1.Modifiers) then modif := modif + MOD_SHIFT;
 ShortCutToKey(HK1.HotKey, K, SS);
 id1 := GlobalAddAtom("HotKey1");
 RegisterHotKey(Handle, id1, Modif, K);

 // Регистрация второй горячей комбинации
 modif := 0;
 HK2.HotKey := TextToShortCut(Opt_A.HotDiskStr);
 if (hkCtrl in HK2.Modifiers) then modif := modif + MOD_CONTROL;
 if (hkAlt in HK2.Modifiers) then modif := modif + MOD_ALT;
 if (hkShift in HK2.Modifiers) then modif := modif + MOD_SHIFT;
 ShortCutToKey(HK2.HotKey, K, SS);
 id2 := GlobalAddAtom("HotKey2");
 RegisterHotKey(Handle, id2, Modif, K);
end;


 
GrayFace ©   (2007-03-16 16:01) [13]

kyn66 ©   (16.03.07 9:18) [12]
Этот код регистрирует "глобальные" горячие клавиши - они будут срабатывать даже когда твое приложение не активно.

kyn66 ©   (16.03.07 9:18) [12]
Можно-ли этот код как-то упростить, дабы не прибегая к промежуточным компонентам ?

Вместо HK1.HotKey использовать переменную тапа THotKey :) И выделить регистрацию 1 гор. клавиши в отдельную функцию.

kyn66 ©   (16.03.07 9:18) [12]
GlobalAddAtom

Это только для dll нужно, в exe можно использовать любые индексы от 0 до $BFFF. Причем в dll названия должны быть не "HotKey1", а уникальные для твоего приложения.


 
kyn66 ©   (2007-03-19 09:42) [14]


> Это только для dll нужно, в exe можно использовать любые
> индексы от 0 до $BFFF. Причем в dll названия должны быть
> не "HotKey1", а уникальные для твоего приложения.

А можно конкретнее про это место? А как узнать, не занято-ли это место уже?


 
kyn66 ©   (2007-03-19 10:32) [15]

>GrayFace
Сделал отдельную процедуру:

procedure TGenTFrm.RegHotKey(UserName, GlobalName : String);
Var
 modif  : Integer;
 K : Word;
 SS : TShiftState;
 HK : THotKey;
begin
 modif := 0;
 HK := THotKey.Create(Self);
 HK.HotKey := TextToShortCut(UserName);
 if (hkCtrl in HK.Modifiers) then modif := modif + MOD_CONTROL;
 if (hkAlt in HK.Modifiers) then modif := modif + MOD_ALT;
 if (hkShift in HK.Modifiers) then modif := modif + MOD_SHIFT;
 ShortCutToKey(HK.HotKey, K, SS);
 id1 := GlobalAddAtom(PAnsiChar(GlobalName));
 RegisterHotKey(Handle, id1, Modif, K);
 HK.Free;
end;
...
Вызов :
 // Регистрация первой горячей комбинации
 RegHotKey(Opt_A.HotBufStr, "HotKey1");
 // Регистрация второй горячей комбинации
 RegHotKey(Opt_A.HotDiskStr, "HotKey2");
...


но вываливать стала ошибка странная, не пойму в чем дело
ОШИБКА --> http://yurec66.narod.ru/Vopros/Error.jpg


 
GrayFace ©   (2007-03-19 20:09) [16]

kyn66 ©   (19.03.07 9:42) [14]
А можно конкретнее про это место? А как узнать, не занято-ли это место уже?

Этим диапазоном твоя программа может распоряжаться как хочет. Если у тебя 2 горячих клавиши, то и давай им 0 и 1, например. Потом в TGenTFrm.WMHotKey их по id"ам различай.

procedure TGenTFrm.RegHotKey(const UserName : String; Id: Integer);
var
  modif : UINT;
  K : Word;
  SS : TShiftState;
  HK : TShortCut;
begin
  modif := 0;
  HK := TextToShortCut(UserName);
  if HK and scCtrl <> 0 then modif := modif + MOD_CONTROL;
  if HK and scAlt <> 0 then modif := modif + MOD_ALT;
  if HK and scShift <> 0 then modif := modif + MOD_SHIFT;
  RegisterHotKey(Handle, Id, Modif, Byte(HK));
end;

Оставил UserName, хотя очень странное имя для строки с горячей клавишей.

kyn66 ©   (19.03.07 10:32) [15]
Вызов :
// Регистрация первой горячей комбинации
RegHotKey(Opt_A.HotBufStr, "HotKey1");
// Регистрация второй горячей комбинации
RegHotKey(Opt_A.HotDiskStr, "HotKey2");

Тут строки "HotKey1" и "HotKey2" должны быть уникальными. Хотя в данном случае это вообще не нужно:
  RegHotKey(Opt_A.HotBufStr, 0);
  RegHotKey(Opt_A.HotDiskStr, 1);


А откуда ты THotKey этот взял?


 
kyn66 ©   (2007-03-23 09:59) [17]


> А откуда ты THotKey этот взял?

Ну как, вместо компонента, ты-ж сам предлагал такой вариант, чтобы не использовать промежуточный компонент


 
GrayFace ©   (2007-03-23 21:33) [18]

Я перепутал с TShortCut. У меня класса THotKey вообще нету.


 
Dismember ©   (2007-03-24 08:24) [19]

А можно мне небольшой вопрос? :)
Как научить стандартный THotKey отлавливать мультимедийные кнопки на клавиатуре наподобие того, как это сделано в винампе? Обычные сочетания клавиш работают, но хотелось бы еще привлечь мультимедиа кнопки.


 
GrayFace ©   (2007-03-24 17:30) [20]

Вот их коды:

mute    173
gromk-  174
gromk+  175
->      176
<-      177
[]      178
>       179


 
Dismember ©   (2007-03-24 18:27) [21]

Коды это конечно хорошо, но в самом компоненте HotKey при задании любой клавиши печатаются буквы латинского алфавита, а хотелось бы что-нибудь типа "Next Track", наподобие того, как это сделано в Winamp 5x. Да, и существует ли код для клавиши play/pause?


 
GrayFace ©   (2007-03-24 20:48) [22]

Dismember ©   (24.03.07 18:27) [21]
Коды это конечно хорошо, но в самом компоненте HotKey при задании любой клавиши печатаются буквы латинского алфавита, а хотелось бы что-нибудь типа "Next Track", наподобие того, как это сделано в Winamp 5x.

А, теперь вспомнил, что такое THotKey. Не знаю, не пробовал.

Dismember ©   (24.03.07 18:27) [21]
Да, и существует ли код для клавиши play/pause?

>       179



Страницы: 1 вся ветка

Текущий архив: 2007.05.20;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.063 c
8-1154874180
.ruslan
2006-08-06 18:23
2007.05.20
Тень от формы


2-1178053453
Riply
2007-05-02 01:04
2007.05.20
Время вызова колбэка FileIOCompletionRoutine


8-1157428625
Irinka
2006-09-05 07:57
2007.05.20
Как загрузить png в Image без дополнительных компонент?


3-1172908676
Бабенко Олег
2007-03-03 10:57
2007.05.20
Перевод базы формата Firebird 2.0 в Firebird 1.5


2-1178367762
MRAk
2007-05-05 16:22
2007.05.20
Сервисы