![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проверка клавиш [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