Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > управления передвижения компонента при помощи клав


Автор: Nikosss 13.1.2007, 13:15
Вопрос по поводу управления передвижения компонента при помощи клавиш клавиатуры (вверх, вниз, вправо, влево).  Существуют ли какие-то константы управления этими клавишами? Как это можно реализовать?

К примеру

switch (Key) {

case ... :MoveUp();
case ... :MoveDown();
case ... :MoveRight();
case ... :MoveLeft();
}

Автор: CatOleg 13.1.2007, 14:26
VK_LEFT 
VK_UP
VK_RIGHT
VK_DOWN

Автор: Nikosss 13.1.2007, 17:51
Описал вот так функцию, но компонент не реагирует на нажатие клавиш.
Или надо делать вызов функции? Что здесь нетак?
Код

int x=340;
int y=380;

void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
   if (Key == VK_UP)   { y=y-48;
                         Image54->Top=y; }
   if (Key == VK_DOWN) { y=y+48;
                         Image54->Top=y; }
   if (Key == VK_LEFT) { x=x-48;
                         Image54->Left=x;   }
   if (Key == VK_RIGHT) {  x=x+48;
                           Image54->Left=x;   }
}

Автор: codelord 13.1.2007, 19:28
А где находится фокус ввода?.
Пиши это в событии компонента на котором находится фокус ввода.
Если это кнопка значит в ней и т.д.

Автор: Nikosss 13.1.2007, 20:15
В данной ситуации есть Form1 по которой должен двигаться Image54.
Цитата(codelord @  13.1.2007,  19:28 Найти цитируемый пост)
Пиши это в событии компонента на котором находится фокус ввода.


Я понимаю нужно написать Form1->SetFocus(); 
Это, как я понимаю, Form1 будет настроена на ввод с клавиатуры. В функции
Код

__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)


или нет?

Автор: Link90 14.1.2007, 09:07
Надо у формы поставить свойство KeyPreview=true !!!

Автор: Nikosss 14.1.2007, 14:11
Цитата(Link90 @  14.1.2007,  09:07 Найти цитируемый пост)
Надо у формы поставить свойство KeyPreview=true !!! 


То есть Form1->KeyPreview=true; Пробовал закидывать эту строчку в функцию 
Код

__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
 , а также в 
Код

void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)

, но тем не менее компонент не реагирует на нажатие клавиш. 

Автор: Nikosss 14.1.2007, 14:30
Разобрался с Form1->KeyPreview=true; , но с этой опцией получается сделать только управление через Numpad клавиши. Для стрелок она не действует. 

Автор: segmentation_fault 14.1.2007, 16:53
Попробуй так:

Код

void __fastcall TfrmMain::FormKeyPress(TObject *Sender, char &Key)
{
   try
   {
      int key = (int)Key;
      //Application->MessageBox(IntToStr(key).c_str(), "", MB_OK);
         switch(key)
        {
             case 97:
             {
                   //твой код
             } break;
             case 113:
        }

 и.т.д. 

стрелка вверх вроде бы 97, вниз 113, влево-вправо не помню, разкомментируй строчку:
Код

Application->MessageBox(IntToStr(key).c_str(), "", MB_OK);

в коде, тогда узнаешь. 


Автор: Nikosss 14.1.2007, 18:10
Попробовал раскоментировать, показывает коды клавиш с цифрами, буквами, но стрелок как и ентера не показывает.

Автор: segmentation_fault 14.1.2007, 18:19
Цитата(Nikosss @ 14.1.2007,  18:10)
Попробовал раскоментировать, показывает коды клавиш с цифрами, буквами, но стрелок как и ентера не показывает.

странно, у меня показывал. Щас посмотрю, может быть еще какие-то настройки нужны.

Добавлено @ 18:30 
Прошу прощения, забыл, у меня там управление было через буквы A и Q (вниз и вверх соотв.), стрелок действительно не ловит. 

Автор: segmentation_fault 14.1.2007, 18:47
В общем посмотрел, твой первоначальный код:
Код

int x=340;
int y=380;

void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
   if (Key == VK_UP)   { y=y-48;
                         Image54->Top=y; }
   if (Key == VK_DOWN) { y=y+48;
                         Image54->Top=y; }
   if (Key == VK_LEFT) { x=x-48;
                         Image54->Left=x;   }
   if (Key == VK_RIGHT) {  x=x+48;
                           Image54->Left=x;   }
}



 должен работать нормально, только как тут другие советовали, поставь KeyPreview = true, и еще включи NumLock на своей клавиатуре.

Автор: Nikosss 14.1.2007, 23:42
да работает! Спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)