![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
[DelphiX] Как узнать что кнопка отпущена [Delphi, Windows]
mozg © (2003-09-25 14:05:00)Вот вообщем-то и вопрос: как определить, что отпущена кнопка и обработать это событие (наподобие OnKeyUp в Delphi)?
mozg (2003-09-29 07:12:00) [1]2 Cyborg: Огромное спасибо! Уже качаю.
А инет мож и плохо рыл....новичок я здесь :)))
cyborg (2003-09-28 22:32:00) [2]Как-то плохо ты инет рыл, вот чего-то нашёл:
http://rglider.newmail.ru/downloads/misc.html
cyborg (2003-09-28 22:18:00) [3]На качай примеры к дельфиксу 310 кило
http://cyborg1979.newmail.ru/programs/DelphiXSamples.zip
пока не удалил.
Карлсон (2003-09-28 21:03:00) [4]
> Какой-то кастрированный дельфикс наверное у тебя.
а небось для 6 дельфи, а те пакеты, что обычно лежат на сайтах - без примеров.
cyborg (2003-09-28 15:35:00) [5]Какой-то кастрированный дельфикс наверное у тебя.
mozg (2003-09-28 12:13:00) [6]2 cyborg: Весь яндекс перерыл...и ни одной живой ссылки на эти Sampless и Help нету :(((
2 Sapersky: Спасибо огромное...все заработало! Наконец-то!
Еще раз благодарю!
cyborg (2003-09-26 19:41:00) [7]Если не ошибаюсь, то в дельфиксе есть примеры, которые и следует посмотреть.
mozg (2003-09-26 18:40:00) [8]2 Sapersky:спасибо огромное...но тут опять непонятно: вставляю эти функции и процедуру в код а компилятор выдает ошибки:
[Error] Unit1.pas(25): Illegal character in input file: ' ' ($A0)
И таких ошибок несколько...
Не знаю в чем проблема :(((
Может для испольщования WinApi надо что-то еще сделать?
Не мог бы ты сколотить готовый работающий пример и выслать на мыло...Был бы очень благодарен, т.к. на готовом примере куда легче разобраться...И, если можно, пример реализации этого через DelphiX...
pasha_676 (2003-09-26 15:23:00) [9]
> AND не чтобы круче было, а не мешало бы почитать о битовых
> операциях
Ну не придирайся :) Сам то пишешь далеко не по научному -
> AND - если оба бита взведены, то исход будет еденица, в
> противном случае ноль.
Т.е. бит бывает взведеный, единицей и нулем. Это интересно.
> . И, кстати, работает процентов на 10 быстрее :) (хотя,
> возможно, это погрешность измерения).
Ох. Давно я подзабыл асм... Но в принцыпе
RgA>=const - одна операция
RgA and RgB=0 две операции....
При частом использовании одной и тойже константы (условно говоря не требуется время на занрузку ее, или она прописана прям в коде) - может быть действительно меньше....
Sapersky (2003-09-26 13:48:00) [10]AND не чтобы круче было
Я просто хотел сказать, что Key>=128 выглядит гораздо проще и понятнее, особенно для новичка, которого пугают доллары и and'ы с числами. И, кстати, работает процентов на 10 быстрее :) (хотя, возможно, это погрешность измерения).
cyborg (2003-09-26 12:18:00) [11][14] Sapersky © (26.09.03 11:39)
AND не чтобы круче было, а не мешало бы почитать о битовых операциях
AND - если оба бита взведены, то исход будет еденица, в противном случае ноль.
Операцией Key and $80 узнаётся взведён ли 8 бит, если нет, то на выходе получится 0, в противном случае получится $80.
Sapersky (2003-09-26 11:39:00) [12]Если уж такие проблемы с DX, лучше использовать что-нибудь вроде:
Var KbdBuf, OldBuf : TKeyboardState;
procedure CheckKeys;
function KeyUp(Code : Byte) : Boolean;
begin
Result:=(OldBuf[Code]>=128) and (KbdBuf[Code]<128);
end;
function KeyDown(Code : Byte) : Boolean;
begin
Result:=(OldBuf[Code]<128) and (KbdBuf[Code]>=128);
end;
begin
GetKeyboardState(KbdBuf);
If KeyUp(VK_LEFT) then Label1.Caption:='Left arrow is up';
If KeyDown(VK_RIGHT) then Label1.Caption:='Right arrow is down';
// для примера проверим правую и левую стрелки...
// константы VK_xxx - те же самые, что и в стандартном OnKeyDown
OldBuf:=KbdBuf;
end;
Это WinAPI, безо всякого DirectX. Но работает достаточно быстро.
А сакральный смысл выражения (Key and $80)=$80 (или, если условие тут же, (Key and $80)) состоит в проверке состояния старшего бита числа. Т.е. при нажатии значение возвращаемого значения будет (в двоичной форме) 10000000 (= $80 = 128). Просто сравнить (Key=128) можно, но лучше не, т.к. у некоторых кнопок есть ещё состояние "включена /выключена" (00000001/00000000 соответственно). Поэтому выполняем операцию AND : Key and 10000000 = 10000000 (или <>0 = True) только в том случае, если Key=1xxxxxxx, где x - любое (ага, большой выбор - 0 или 1 :)). Аналогичного эффекта можно добиться условием Key>=128 (т.к. 1xxxxxxx>=10000000), но почему-то все пишут AND - чтобы выглядело круче, наверное :)
mozg (2003-09-26 07:22:00) [13]2 cyborg: Спасибо...попробую...
Только кажется мне что это решение через DirectX (а я в него ВООБЩЕ не совался, даже не знаю как его в Дельфи использовать).
Для простоты я использую библиотеку DelphiX, в частности ее компонент DXinput. Если там решение моей проблемы?
cyborg (2003-09-25 20:22:00) [14]Данные тебе приходят в буффер состоящий из TDIDEVICEOBJECTDATA.
TDIDEVICEOBJECTDATA.dwOfs - код клавиши
TDIDEVICEOBJECTDATA.dwData - что с ней произошло.
Case TDIDEVICEOBJECTDATA.dwOfs of
DIK_ESCAPE : if TDIDEVICEOBJECTDATA.dwData and $80<>0 then нажата else отжата;
...
mozg (2003-09-25 18:52:00) [15]2 Илья: и так попробую...завтра время появится...попробую...
Но все-таки, мне надо знать что именно !данная! клавиша отпущена...значит вместо "key" нужно вставить код клавиши? Какие это коды (хотя бы для стрелок влево-вправо).
Илья (2003-09-25 17:42:00) [16]if key=#80 then
mozg (2003-09-25 17:26:00) [17]Я так понимаю, вместо "key" надо вставить код клавиши или что-то еще???
ЗЫ:задолбал я наверное вопросами...но, блин, ХОЧЕТСЯ НАУЧИТЬСЯ!!!
cyborg (2003-09-25 17:16:00) [18]DXInput, при приходе сигналов от клавиатуры они идут к тебе, а что за сигнал пришёл, ты так разбираешься, если восьмой бит "включён", то значит была клавиша нажата, если его нет, то была отжата.
mozg (2003-09-25 17:11:00) [19]>>>if (Key and $80) then нажата else отжата.
2 CYBORG: Это будет обработка через DXinput или это сам Дельфи определит? Просто говорили, что через DXinput быстрее...
mozg (2003-09-25 16:46:00) [20]to Cyborg: спасибо, буду пробывать (останется только это понять :)))
to pasha_676: Совет отличный! Очень хочу разобраться..да блин даже хелпа нету, а все что я нашел в статьях это именно этот код...Кстати этот код для клавы работает :)))
Короче спасибо, народ, за то что есть куда обратиться...без Вас ваще труба....