Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.01.2015, 14:50   #1
octoplar
 
Регистрация: 28.10.2010
Сообщений: 6
По умолчанию Управление VCL формой с клавиатуры

В общем так:
В процессе изучения решил написать простенькую игру на С++ Builder 2007 и выбор пал на тетрис. Написан он в VCL форме, и даже работает, но управляется кнопками типа TButton. Решил сделать управление с клавиатуры(например W A S D), но столкнулся с проблемой - так и не смог найти решение=(

Теперь, собственно, вопрос:
Как обработать нажатие клавиш в VCL?
Я остановился на этапе того, что функция

Код:
void __fastcall  TForm3::OnKeyPress(TObject *Sender, char &Key)
{
  switch (Key).........
}
ничего не делает. Возможно, это связано с тем, что в фокусе всегда находится 1 из элементов самой формы(например TButton).

Помогите(желательно ссылка на исходник или код любой рабочей функции, где, например, при нажатии клавиши "f" вызывается функция My_function(char key) ).
octoplar вне форума Ответить с цитированием
Старый 12.01.2015, 15:13   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
ничего не делает
Для формы поставь KeyPreview = True;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 12.01.2015, 16:37   #3
octoplar
 
Регистрация: 28.10.2010
Сообщений: 6
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Для формы поставь KeyPreview = True;
Не помогло. На данный момент вид такой:

Код:
void __fastcall TForm3::FormCreate(TObject *Sender)
{
KeyPreview = true;
..............
}

void __fastcall  TForm3::OnKeyPress(TObject *Sender, char &Key)
{
  Memo1->Lines->Add("test");
..................
}
По идее при нажатии любой клавиши в Memo1 должна добавляться строка "test", но этого не происходит.
octoplar вне форума Ответить с цитированием
Старый 12.01.2015, 17:07   #4
octoplar
 
Регистрация: 28.10.2010
Сообщений: 6
По умолчанию

Похоже я допер, где косяк:
Я руками добавлял в Unit3.h void __fastcall OnKeyPress(TObject *Sender, char &Key);

попробовал то же самое с кнопками Button1 и Button2:

Код:
void __fastcall TForm7::Button1Click(TObject *Sender)
{
 Memo1->Lines->Add("test");

}
//---------------------------------------------------------------------------
void __fastcall TForm7::Button2Click(TObject *Sender)
{
 Memo1->Lines->Add("test");
}
Функцию Button1Click Написал руками, а функция Button2Click была создана автоматически при двойном клике по Button2 на дизайне формы.
В итоге первая функция, внесенная руками, не работает.

Теперь вопрос: как грамотно вызвать OnKeyPress из дизайна формы, чтобы оно работало, или же как грамотно самому прописывать функции, чтобы они работали?
octoplar вне форума Ответить с цитированием
Старый 13.01.2015, 12:39   #5
octoplar
 
Регистрация: 28.10.2010
Сообщений: 6
По умолчанию

Все, разобрался.
Чтобы все работало надо:

1. Установить свойство формы KeyPreview = true;
Код:
void __fastcall TForm3::FormCreate(TObject *Sender)
{
KeyPreview = true;
}
2. В Object inspector (он в нижнем левом углу) во вкладке Events найти нужное событие и разрешить его (в данном случае OnKeyPress). Дальше функцию OnKeyPress вносить можно вручную в Unit3.h

3. В Unit3.cpp пишем саму функцию
Код:
void __fastcall  TForm3::OnKeyPress(TObject *Sender, char &Key)
{
Memo1->Lines->Add("test");
}

Тему можно закрывать, всем спасибо.
octoplar вне форума Ответить с цитированием
Старый 14.01.2015, 20:06   #6
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию

Цитата:
Помогите(желательно ссылка на исходник или код любой рабочей функции, где, например, при нажатии клавиши "f" вызывается функция My_function(char key) ).
1) Смотрим код клавиша http://articles.org.ru/cn/showdetail.php?cid=8988
2) из событии OnShortCut пишу
Код:
void __fastcall TForm1::FormShortCut(TWMKey &Msg, bool &Handled)
{
 if (Msg.CharCode== 70 ) //  F   70
	{
	 ShowMessage("Вы нажали клавишу F ");
	  Handled = true;
	}
	else
	 if (Msg.CharCode== 71 ) //  G   71
	{
	 ShowMessage("Вы нажали клавишу  G ");
	  Handled = true;
	}
	 else
	 if (Msg.CharCode== 72 ) //  H  72
	{
	 ShowMessage("Вы нажали клавишу H ");
	  Handled = true;
	}
 }
xxbesoxx вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Управление второй формой ? z-wer Общие вопросы Delphi 0 18.04.2013 17:17
управление формой и рисунком [Delphi7] -Jack- Общие вопросы Delphi 5 27.09.2012 19:10
управление с клавиатуры. AntonEew Паскаль, Turbo Pascal, PascalABC.NET 29 28.07.2011 12:19
Управление с клавиатуры kpishnik Помощь студентам 10 27.07.2008 18:38
Управление с клавиатуры PikeIt Общие вопросы Delphi 6 27.12.2006 17:41