Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> использование клавиатуры 
:(
    Опции темы
СЭНСЭЙ
Дата 7.10.2009, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 432
Регистрация: 20.3.2006

Репутация: нет
Всего: нет



Подскажите как наиболее грамотно следить за нажатием клавиш клавиатуры,
если я хочу к примеру сделать простенькую 2д  игру, но что бы можно было задействовать так же
комбинацию клавиш.
Если можно то пример неплохо бы.
PM MAIL   Вверх
Frees
Дата 7.10.2009, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 9
Всего: 54



Taction  ShortCut

WM_KEYUP


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
bems
Дата 7.10.2009, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



А может понадобиться обратный подход (не делать что-то по нажатию, а перед действием проверять нажато ли). Тогда GetAsyncKeyState


--------------------
Обижено школьников: 8
PM MAIL   Вверх
СЭНСЭЙ
Дата 7.10.2009, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 432
Регистрация: 20.3.2006

Репутация: нет
Всего: нет



А что такое Taction  ShortCut?

Я так понял что можно это реализовать с помощью onkeydown и onkeyup ?
Я проверил - вроди работает, но может быть это не корректно и есть способы получше?

Добавлено через 1 минуту и 31 секунду
Да и еще...
мне нужно что бы скажем крутился цикл постоянно , а нажатие определенной клавиши меняло значение какой нибудь переменной при этом. Как такое можно реализовать?
PM MAIL   Вверх
СЭНСЭЙ
Дата 7.10.2009, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 432
Регистрация: 20.3.2006

Репутация: нет
Всего: нет



пробовал в цикл засунуть
GetAsyncKeyState 
Код

procedure TForm1.FormCreate(Sender: TObject);
begin
Form1.Caption:=inttostr(GetAsyncKeyState(27));
repeat
begin
if GetAsyncKeyState(38)<>0 then Form1.Caption:='up' else Form1.Caption:='no';
Form1.Repaint;
end;
until GetAsyncKeyState(27)<>0;
Form1.Caption:='end';
end;


но форма не появляется пока не нажму эскейп, естественно
Может быть крутить цикл в отдельном потоке?
PM MAIL   Вверх
СЭНСЭЙ
Дата 8.10.2009, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 432
Регистрация: 20.3.2006

Репутация: нет
Всего: нет



Сделал цикл в отдельном потоке 
Код

procedure process.proc();
begin
if GetAsyncKeyState(38)<>0 then Form1.Label1.Caption:='up' else Form1.Label1.Caption:='no';
end;

procedure process.Execute;
begin
  { Place thread code here }
  while (Terminated = false) do proc();
end;


ну и на главной форме соответственно:
Код

procedure TForm1.FormCreate(Sender: TObject);
begin
Form1.Caption:=inttostr(GetAsyncKeyState(27));
mainproc:=process.Create(false);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
mainproc.Terminate();
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Form1.Close();
end;


все хорошо, но только верхний border формы как то неестестенно выглядит - глюк какой то
не понятно из за чего это.
Подскажите в чем причина плиз?

Добавлено через 3 минуты и 7 секунд
попробовал выводит сообщение в лейбу и глюк пропал,
но в диспетчере задач программа занимает все свободное время процесора,
хотя комп не тормозит...
PM MAIL   Вверх
СЭНСЭЙ
Дата 8.10.2009, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 432
Регистрация: 20.3.2006

Репутация: нет
Всего: нет



Еще вспомнил про таймер
Вместо процесса запустил таймер
Код

procedure TForm1.keys();
begin
ch:='';
if kup then ch:='up +';
if kdwn then ch:=ch+ 'down +';
ch:=copy(ch,0,length(ch)-2);
Form1.Caption:=ch;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
if (Key=VK_UP) then kup:=true;
if (Key=VK_DOWN) then kdwn:=true;
//if Key in [VK_UP, VK_DOWN] then kud:=true;
keys();
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
ch:='null';
kup:=false;
kdwn:= false;
kud:= false;
end;

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
if (Key=VK_UP) then kup:=false;
if (Key=VK_DOWN) then kdwn:=false;
//if Key in [VK_UP, VK_DOWN] then kud:=false;
keys();
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
Label1.Caption:=DateTimeToStr(Now)+' '+ch;
end;


вроди бы то что нужно...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0438 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.