Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проверка клавиш [D7]


Elec3C ©   (2007-12-15 20:58:00) 

На форме есть 4 CheckBox'a и EditBox. В каждом CheckBox'е список выглядит так: Ctrl, Win, Alt, Shift. В EditBox юзер указывает клавишу, а программка сохраняет эту клавишу в переменную типа Byte, так же и с CheckBox'ами(Если, например, 1'ом CheckBox = Ctrl, то в переменной типа Byte, сохранятся код VK_CONTROL). Затем с помощь GetAsyncKeyState я проверяю указанные юзеров клавиши и выпоняю какое-либо действие. Проблема состоит как раз в проверке клавиш, которые указал юзер.

Т.Б. Допустим, что юзер указал в 1'ом CheckBox'е = Ctrl, в 3'ем = Alt, а в EditBox = 'F', я должен проверить следующее:

...
var Key : array[0..4] of Byte;
...

if (GetAsyncKeyState(Key[0]) <> 0)
and
  (GetAsyncKeyState(Key[2]) <> 0)
and
  (GetAsyncKeyState(Key[4]) <> 0)
then
  { Выполняю какое-либо действие }

)

P.S. Ну не проверять же мне тупо все возможные варианты(Если Key[0] = 0 и Key[1] = 0; Если Key[0] = 0 и Key[1] = 0 и Key[2] = 0 и Key[3] = 0...).
P.P.S. Думаю, понятно объяснил.


Германн   (2007-12-16 03:08:00) [1]


> Германн ©   (16.12.07 02:14) [6]

Позор мне, позор! Я сделал очепятку в названии одной из моих самых любимых песен Битлз.
:(


guav   (2007-12-16 02:20:00) [2]


> Допустим, если клавиша установлена в CheckBox1, а в остальных
> нет, то я пишу такой код:
> if (GetAsyncKeyState(Key[0]) <> 0) then
>  { Выполняю како-либо действие }
>
> Если клавиша установлена в CheckBox1 и CheckBox3 и в EditBox,
> то я пишу:
> if (GetAsyncKeyState(Key[0]) <> 0) and
>  (GetAsyncKeyState(Key[2]) <> 0) and
>  (GetAsyncKeyState(Key[4]) <> 0) then
> { Выполняю какое-либо действие }

Ну это можно записать так:

if (not checkbox1.checked or (GetAsyncKeyState(Key[0]) <> 0)) and
 (not checkbox2.checked or (GetAsyncKeyState(Key[2]) <> 0)) and
 (not checkbox3.checked or (GetAsyncKeyState(Key[4]) <> 0)) then


Elec3C   (2007-12-16 02:19:00) [3]

Всем спасибо.


Германн   (2007-12-16 02:14:00) [4]


> Elec3C ©   (16.12.07 00:29) [2]
>
> Да, видать, не поняли.
>

Ну а как тут понять? Задача-то не поставлена. Есть только "дурной" вопрос по "некоему решению". А вот чего следует решить - темный лес. (Norwegin wood :)


Servelat   (2007-12-16 01:12:00) [5]

Под

if Key[I] <> 0 then

Понималась проверка, что соответствующий CheckBox/Edit включен/заполнен.


Servelat   (2007-12-16 01:09:00) [6]

> Если клавиша установлена в CheckBox1 и CheckBox3 и в EditBox,
> то я пишу:
> if (GetAsyncKeyState(Key[0]) <> 0) and
>  (GetAsyncKeyState(Key[2]) <> 0) and
>  (GetAsyncKeyState(Key[4]) <> 0) then
> { Выполняю какое-либо действие }


var
 B: Boolean;

...

 B := True;

 for I := 0 to KeyCount - 1 do
   if Key[I] <> 0 then
     B := B and (GetAsyncKeyState(Key[I]) <> 0));

 if B then
 begin
   // нажата нужная комбинация...
 end;


Германн   (2007-12-16 00:51:00) [7]


> P.S. Нужно создать некое множество, в него добавлять, то
> что установлено(из CheckBox'ов и EditBox'а) и проверять
> это множество.

Ну так и создай его.

type
 TAsyncKey = (kCtrl, kWin, kAlt, kShift);
 TAsyncKeys = set of TAsyncKey;
var
 AsyncKeys = TAsyncKeys;

 if AsyncKeys <> [] then


Elec3C   (2007-12-16 00:29:00) [8]

Да, видать, не поняли.

Допустим, если клавиша установлена в CheckBox1, а в остальных нет, то я пишу такой код:
if (GetAsyncKeyState(Key[0]) <> 0) then
  { Выполняю како-либо действие }

Если клавиша установлена в CheckBox1 и CheckBox3 и в EditBox, то я пишу:
if (GetAsyncKeyState(Key[0]) <> 0) and
  (GetAsyncKeyState(Key[2]) <> 0) and
  (GetAsyncKeyState(Key[4]) <> 0) then
 { Выполняю какое-либо действие }

P.S. Нужно создать некое множество, в него добавлять, то что установлено(из CheckBox'ов и EditBox'а) и проверять это множество. Или как-то по-другому?


guav   (2007-12-15 23:05:00) [9]

> Проблема состоит как раз в проверке клавиш, которые указал
> юзер.

В чём проблема ?


> я должен проверить следующее:


Где происходит проверка ?
Почему Get AsyncKeyState ?

Почему не применить TShortCut ?

Может, вообще стоит применить THotKey


Наверх

Титульная страница Поиск, карта сайта Написать письмо