Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
 Аватар для nnnikotinnn995
7 / 7 / 4
Регистрация: 07.07.2011
Сообщений: 583

одиночные операции

02.08.2011, 21:00. Показов 1571. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Операции записанные в обработчике событий FormKeyDown будут выполняться столько раз, сколько времени держится клавиша. Например, в нижнем листинге имидж будет перемещаться до того момента, пака пользователь не отпустит клавишу. Подскажите пожалуйста, что нужно изменить, чтобы операция выполнялась один раз в течение нажатия клавиши(не зависимо от времени нажатия клавиши)?
C++
1
2
3
4
5
6
7
8
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
if (Key == VK_LEFT) Image1->Left = Image1->Left - 30; //в лево
if (Key == VK_RIGHT)Image1->Left = Image1->Left + 30; //в право
if (Key == VK_UP)   Image1->Top=Image1->Top - 30;     //в верх
if (Key == VK_DOWN) Image1->Top=Image1->Top + 30;     //в низ
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.08.2011, 21:00
Ответы с готовыми решениями:

Одиночные RPG
Привет всем. Решила в свободное от работы время вспомнить молодость:hihi: Посоветуйте какие-нибудь одиночные РПГ. В WoW играла, но что-то...

Одиночные и двойные кавычки
В Питоне строки в одинаковых кавычках - то же самое? Есть ли отличия в "hello" и 'hello'?

Конвертация диапазона в одиночные адреса
Помогите пожалуйста разобратся со следующей задачей. Например есть формула с диапозон "=SUM(A1:A5)" необходимо её конвертировать...

7
 Аватар для pomkalk
365 / 247 / 24
Регистрация: 03.04.2011
Сообщений: 558
Записей в блоге: 1
02.08.2011, 21:09
Делаешь флаг(bool)
и ставишь его true, в OnKeyDown выполняешь свое событие если флаг true, после чего ставишь его на false, а в OnKeyUp снова на true!
2
 Аватар для __bool
288 / 229 / 27
Регистрация: 13.06.2010
Сообщений: 744
03.08.2011, 01:13
Цитата Сообщение от nnnikotinnn995 Посмотреть сообщение
Здравствуйте. Операции записанные в обработчике событий FormKeyDown будут выполняться столько раз, сколько времени держится клавиша. Например, в нижнем листинге имидж будет перемещаться до того момента, пака пользователь не отпустит клавишу. Подскажите пожалуйста, что нужно изменить, чтобы операция выполнялась один раз в течение нажатия клавиши(не зависимо от времени нажатия клавиши)?
C++
1
2
3
4
5
6
7
8
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
if (Key == VK_LEFT) Image1->Left = Image1->Left - 30; //в лево
if (Key == VK_RIGHT)Image1->Left = Image1->Left + 30; //в право
if (Key == VK_UP)   Image1->Top=Image1->Top - 30;     //в верх
if (Key == VK_DOWN) Image1->Top=Image1->Top + 30;     //в низ
}
Вот так к примеру:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
bool pressed = false;
 
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
     if (!pressed) {
          if (Key == VK_LEFT)  { Image1->Left = Image1->Left - 30; pressed = true;} //в лево
          if (Key == VK_RIGHT) { Image1->Left = Image1->Left + 30; pressed = true;} //в право
          if (Key == VK_UP)    { Image1->Top=Image1->Top - 30; pressed = true;}   //в верх
          if (Key == VK_DOWN)  {Image1->Top=Image1->Top + 30; pressed = true;}    //в низ
     }
}
 
void __fastcall TForm1::FormKeyUp(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
      pressed = false;
}
[/QUOTE]
1
 Аватар для nnnikotinnn995
7 / 7 / 4
Регистрация: 07.07.2011
Сообщений: 583
04.08.2011, 09:14  [ТС]
Цитата Сообщение от Fuckall666 Посмотреть сообщение
Вот так к примеру:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
bool pressed = false;
 
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
     if (!pressed) {
          if (Key == VK_LEFT)  { Image1->Left = Image1->Left - 30; pressed = true;} //в лево
          if (Key == VK_RIGHT) { Image1->Left = Image1->Left + 30; pressed = true;} //в право
          if (Key == VK_UP)    { Image1->Top=Image1->Top - 30; pressed = true;}   //в верх
          if (Key == VK_DOWN)  {Image1->Top=Image1->Top + 30; pressed = true;}    //в низ
     }
}
 
void __fastcall TForm1::FormKeyUp(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
      pressed = false;
}
[/QUOTE]

А почему в анимации bool pressed = false; не чего не меняет?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit51.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
bool pressed = false;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Button1->~TButton();
}
//---------------------------------------------------------------------------
 
 
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift)
 
{ if (!pressed) {
  if( Key == VK_SPACE )       //Если зажатая клавиша - Пробел (VK_SPACE)
   {
  for(int i=8;i<30;i++)      // Запускаем цикл, в каждом новом шаге которого будет рисовать новый кадр анимации
          {
          Sleep(15);   // Делаем это для небольших пауз между кадрами
 
          Application->ProcessMessages();       // Ммм... приводим приложение в чувство, чтобы оно могла перерисоваться
                              Repaint();        // Собственно, перерисовываем форму, стирая тем самым старый кадр анимации
  Image1->Picture->LoadFromFile("n"+String(i)+".png");       //Загружаем новый кадр анимации под номером i
          }
  }
  if( Key == 101 )       //Если зажатая клавиша - Пробел (VK_SPACE)
  {
 
          for(int i=2;i<25;i++)      // Запускаем цикл, в каждом новом шаге которого будет рисовать новый кадр анимации
          {
          Sleep(15);   // Делаем это для небольших пауз между кадрами
 
          Application->ProcessMessages();       // Ммм... приводим приложение в чувство, чтобы оно могла перерисоваться
                              Repaint();        // Собственно, перерисовываем форму, стирая тем самым старый кадр анимации
  Image1->Picture->LoadFromFile("n"+String(i)+".png");       //Загружаем новый кадр анимации под номером i
          }
          }
  }
}
//---------------------------------------------------------------------------
 
 
 
 
 
 
 
void __fastcall TForm1::FormKeyUp(TObject *Sender, WORD &Key, TShiftState Shift)
{
 pressed = false;
}
//---------------------------------------------------------------------------
0
 Аватар для __bool
288 / 229 / 27
Регистрация: 13.06.2010
Сообщений: 744
04.08.2011, 12:45
Цитата Сообщение от nnnikotinnn995 Посмотреть сообщение
А почему в анимации bool pressed = false; не чего не меняет?
В какой анимации?
0
 Аватар для nnnikotinnn995
7 / 7 / 4
Регистрация: 07.07.2011
Сообщений: 583
04.08.2011, 14:49  [ТС]
идет речь о загрузки последовательности кадров при нажатие на клавишу -
C++
1
2
3
4
5
6
7
8
9
10
11
 if( Key == VK_SPACE )       //Если зажатая клавиша - Пробел (VK_SPACE)
   {
  for(int i=8;i<30;i++)      // Запускаем цикл, в каждом новом шаге которого будет рисовать новый кадр анимации
                  {
                  Sleep(15);   // Делаем это для небольших пауз между кадрами
 
                  Application->ProcessMessages();       // Ммм... приводим приложение в чувство, чтобы оно могла перерисоваться
                                                          Repaint();        // Собственно, перерисовываем форму, стирая тем самым старый кадр анимации
  Image1->Picture->LoadFromFile("n"+String(i)+".png");       //Загружаем новый кадр анимации под номером i
                  }
  }
как в выше приведенном коде, пака нажата клавиша - цикл будет запускаться постоянно, а надо чтоб он запустился один раз (как с движением).
0
 Аватар для __bool
288 / 229 / 27
Регистрация: 13.06.2010
Сообщений: 744
05.08.2011, 00:28
Как на счет создать еще одну bool-переменную? инициализировать ее false
Если цикл прогнали, сразу true;
Перед циклом проверка, если false то прогонять цикл

Добавлено через 2 минуты
C++
1
2
//до процедуры нажатия
bool done = false;
C++
1
2
3
4
5
6
7
8
9
10
11
12
 if( (Key == VK_SPACE) && (!done) )       //Если зажатая клавиша - Пробел (VK_SPACE)
   {
  for(int i=8;i<30;i++)      // Запускаем цикл, в каждом новом шаге которого будет рисовать новый кадр анимации
                  {
                  Sleep(15);   // Делаем это для небольших пауз между кадрами
 
                  Application->ProcessMessages();       // Ммм... приводим приложение в чувство, чтобы оно могла перерисоваться
                                                          Repaint();        // Собственно, перерисовываем форму, стирая тем самым старый кадр анимации
  Image1->Picture->LoadFromFile("n"+String(i)+".png");       //Загружаем новый кадр анимации под номером i
done = true;
                  }
  }
1
 Аватар для nnnikotinnn995
7 / 7 / 4
Регистрация: 07.07.2011
Сообщений: 583
05.08.2011, 08:56  [ТС]
Цитата Сообщение от Fuckall666 Посмотреть сообщение
Как на счет создать еще одну bool-переменную? инициализировать ее false
Если цикл прогнали, сразу true;
Перед циклом проверка, если false то прогонять цикл
Сейчас работает, но если клавиша держится меньше (примерно) 0,5 секунд, то при повторном нажатие цикл не запускается (он запускается при третьем нажатие клавиши), наверно done = true; долго включается, можно ли как ни будь ускорить выполнение этого оператора или тут дело в чем то другом?
Вот код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit51.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
bool done = false;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
 
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Button1->~TButton();
}
//---------------------------------------------------------------------------
 
 
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift)
 
{
  if ((Key == VK_SPACE) && (!done))        //Если зажатая клавиша - Пробел (VK_SPACE)
  {
  for(int i=8;i<30;i++)      // Запускаем цикл, в каждом новом шаге которого будет рисовать новый кадр анимации
          {
          Sleep(15);   // Делаем это для небольших пауз между кадрами
 
          Application->ProcessMessages();       // Ммм... приводим приложение в чувство, чтобы оно могла перерисоваться
                              Repaint();        // Собственно, перерисовываем форму, стирая тем самым старый кадр анимации
  Image1->Picture->LoadFromFile("C:\\Users\\User\\Documents\\RAD Studio\\Projects\\Debug\\n"+String(i)+".png");       //Загружаем новый кадр анимации под номером i
   done = true;       }
  }
 
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormKeyUp(TObject *Sender, WORD &Key, TShiftState Shift)
{
done = false;
}
//---------------------------------------------------------------------------
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.08.2011, 08:56
Помогаю со студенческими работами здесь

Одиночные замены в строке по функции
Здравствуйте, у меня есть строка и мне в ней нужно заменить заменить одни и теже слова но на разные которые генерируются с помощью функции.

Замена двойных пробелов на одиночные
Написать программу, считывающую произвольные предложения и выводящую их в форматированном виде, в котором все группы идущих подряд пробелов...

Заменить в строке двойные символы на одиночные
Ввести строчку длиной до 30 символов, заменить в ней двойные символы на одиночные, пробелы - на знак подчёркивания, сочетания ** на...

Как спарсить одиночные xml теги?
using System; using System.Xml; namespace ConsoleApplication2 { class Program { static void Main(string...

Стек: хранить не одиночные символы, а слова
Проблема в том, что в стек записывается ссылка на переменную, чтоли ( не знаю как это правильно назвать). Т.е. ввожу в цикле через...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru