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

Вниз

[DelphiX] Как узнать что кнопка отпущена   Найти похожие ветки 

 
mozg   (2003-09-25 14:05) [0]

Вот вообщем-то и вопрос: как определить, что отпущена кнопка и обработать это событие (наподобие OnKeyUp в Delphi)?


 
cyborg ©   (2003-09-25 14:37) [1]

Какая кнопка?


 
pasha_676 ©   (2003-09-25 15:34) [2]

Может мыши? Или на клаве? А может на джойстике? В любом случае придешь к DXInput. Забыл как компонент в DelphiX Называется но он есть...


 
mozg   (2003-09-25 15:48) [3]

Кнопка на клаве...
Да в делфиX есть компонент DXInput.И с помощью него можно определить что кнопка нажата (if isLeft in Form1.DXInput1.States then...) а каким путем(может функция какая-нить) определить что кнопка отпускается...Без этого никак :(((


 
cyborg ©   (2003-09-25 15:54) [4]

if (Key and $80) then нажата else отжата.


 
pasha_676 ©   (2003-09-25 16:14) [5]


> if isLeft in Form1.DXInput1.States then..

Хм... Разобрался бы ты что ли... Это к мыше код вроде


 
mozg   (2003-09-25 16:46) [6]

to Cyborg: спасибо, буду пробывать (останется только это понять :)))

to pasha_676: Совет отличный! Очень хочу разобраться..да блин даже хелпа нету, а все что я нашел в статьях это именно этот код...Кстати этот код для клавы работает :)))

Короче спасибо, народ, за то что есть куда обратиться...без Вас ваще труба....


 
mozg   (2003-09-25 17:11) [7]

>>>if (Key and $80) then нажата else отжата.
2 CYBORG: Это будет обработка через DXinput или это сам Дельфи определит? Просто говорили, что через DXinput быстрее...


 
cyborg ©   (2003-09-25 17:16) [8]

DXInput, при приходе сигналов от клавиатуры они идут к тебе, а что за сигнал пришёл, ты так разбираешься, если восьмой бит "включён", то значит была клавиша нажата, если его нет, то была отжата.


 
mozg   (2003-09-25 17:26) [9]

Я так понимаю, вместо "key" надо вставить код клавиши или что-то еще???

ЗЫ:задолбал я наверное вопросами...но, блин, ХОЧЕТСЯ НАУЧИТЬСЯ!!!


 
Илья   (2003-09-25 17:42) [10]

if key=#80 then


 
mozg   (2003-09-25 18:52) [11]

2 Илья: и так попробую...завтра время появится...попробую...
Но все-таки, мне надо знать что именно !данная! клавиша отпущена...значит вместо "key" нужно вставить код клавиши? Какие это коды (хотя бы для стрелок влево-вправо).


 
cyborg ©   (2003-09-25 20:22) [12]

Данные тебе приходят в буффер состоящий из TDIDEVICEOBJECTDATA.
TDIDEVICEOBJECTDATA.dwOfs - код клавиши
TDIDEVICEOBJECTDATA.dwData - что с ней произошло.

Case TDIDEVICEOBJECTDATA.dwOfs of
DIK_ESCAPE : if TDIDEVICEOBJECTDATA.dwData and $80<>0 then нажата else отжата;
...


 
mozg   (2003-09-26 07:22) [13]

2 cyborg: Спасибо...попробую...
Только кажется мне что это решение через DirectX (а я в него ВООБЩЕ не совался, даже не знаю как его в Дельфи использовать).
Для простоты я использую библиотеку DelphiX, в частности ее компонент DXinput. Если там решение моей проблемы?


 
Sapersky ©   (2003-09-26 11:39) [14]

Если уж такие проблемы с 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 - чтобы выглядело круче, наверное :)


 
cyborg ©   (2003-09-26 12:18) [15]

[14] Sapersky ©   (26.09.03 11:39)
AND не чтобы круче было, а не мешало бы почитать о битовых операциях

AND - если оба бита взведены, то исход будет еденица, в противном случае ноль.

Операцией Key and $80 узнаётся взведён ли 8 бит, если нет, то на выходе получится 0, в противном случае получится $80.


 
Sapersky ©   (2003-09-26 13:48) [16]

AND не чтобы круче было

Я просто хотел сказать, что Key>=128 выглядит гораздо проще и понятнее, особенно для новичка, которого пугают доллары и and"ы с числами. И, кстати, работает процентов на 10 быстрее :) (хотя, возможно, это погрешность измерения).


 
pasha_676 ©   (2003-09-26 15:23) [17]


> AND не чтобы круче было, а не мешало бы почитать о битовых
> операциях

Ну не придирайся :) Сам то пишешь далеко не по научному -
> AND - если оба бита взведены, то исход будет еденица, в
> противном случае ноль.

Т.е. бит бывает взведеный, единицей и нулем. Это интересно.


> . И, кстати, работает процентов на 10 быстрее :) (хотя,
> возможно, это погрешность измерения).

Ох. Давно я подзабыл асм... Но в принцыпе
RgA>=const - одна операция

RgA and RgB=0 две операции....

При частом использовании одной и тойже константы (условно говоря не требуется время на занрузку ее, или она прописана прям в коде) - может быть действительно меньше....


 
mozg   (2003-09-26 18:40) [18]

2 Sapersky:спасибо огромное...но тут опять непонятно: вставляю эти функции и процедуру в код а компилятор выдает ошибки:
[Error] Unit1.pas(25): Illegal character in input file: " " ($A0)
И таких ошибок несколько...
Не знаю в чем проблема :(((
Может для испольщования WinApi надо что-то еще сделать?

Не мог бы ты сколотить готовый работающий пример и выслать на мыло...Был бы очень благодарен, т.к. на готовом примере куда легче разобраться...И, если можно, пример реализации этого через DelphiX...


 
cyborg ©   (2003-09-26 19:41) [19]

Если не ошибаюсь, то в дельфиксе есть примеры, которые и следует посмотреть.


 
mozg   (2003-09-28 12:13) [20]

2 cyborg: Весь яндекс перерыл...и ни одной живой ссылки на эти Sampless и Help нету :(((

2 Sapersky: Спасибо огромное...все заработало! Наконец-то!
Еще раз благодарю!


 
cyborg ©   (2003-09-28 15:35) [21]

Какой-то кастрированный дельфикс наверное у тебя.


 
Карлсон ©   (2003-09-28 21:03) [22]


> Какой-то кастрированный дельфикс наверное у тебя.

а небось для 6 дельфи, а те пакеты, что обычно лежат на сайтах - без примеров.


 
cyborg ©   (2003-09-28 22:18) [23]

На качай примеры к дельфиксу 310 кило

http://cyborg1979.newmail.ru/programs/DelphiXSamples.zip

пока не удалил.


 
cyborg ©   (2003-09-28 22:32) [24]

Как-то плохо ты инет рыл, вот чего-то нашёл:
http://rglider.newmail.ru/downloads/misc.html


 
mozg   (2003-09-29 07:12) [25]

2 Cyborg: Огромное спасибо! Уже качаю.
А инет мож и плохо рыл....новичок я здесь :)))



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

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

Наверх




Память: 0.53 MB
Время: 0.04 c
7-1079349256
dr Tr0jan
2004-03-15 14:14
2004.04.11
Voice функции модема


11-1067946243
Nert
2003-11-04 14:44
2004.04.11
Как сделать прозрачность формы как в VCL


14-1078800394
mfender
2004-03-09 05:46
2004.04.11
70 лет первому космонавту!


1-1082575028
ещё раз Я...
2004-04-21 23:17
2004.04.11
опять StringGrid и его события...


9-1068311603
MrAngel
2003-11-08 20:13
2004.04.11
glVertexPointerExt в OpenGL.pas отсутствует...