Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2007.05.20;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.034 c
2-1178190219
allucard
2007-05-03 15:03
2007.05.20
Повторный вызов Print криво печатает компоненты Shape


2-1177754230
=Teddy=
2007-04-28 13:57
2007.05.20
Не могу справиться с FastReport ом


2-1178288335
Inna_Z
2007-05-04 18:18
2007.05.20
Как узнать версию Oracle к которой подключились?


15-1177063531
маршал
2007-04-20 14:05
2007.05.20
как этого достичь


6-1163400550
NovaC
2006-11-13 09:49
2007.05.20
Атрибут файла через Indy->IdFTP SOS!!!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский