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

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

[DelphiX] Как узнать что кнопка отпущена [Delphi, Windows]


Страницы:   1 2

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: Совет отличный! Очень хочу разобраться..да блин даже хелпа нету, а все что я нашел в статьях это именно этот код...Кстати этот код для клавы работает :)))

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


Страницы:   1 2

Наверх

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