35 / 35 / 6
Регистрация: 29.08.2009
Сообщений: 183
1

Отклик button с клавиатуры, переменные др. формы, MediaPlayer, SND_SUNC, Rand... Вопросы

29.08.2009, 15:42. Показов 2955. Ответов 14
Метки нет (Все метки)

Смотрел по форуму, не нашел:

1) Как сделать так, чтобы компонент формы button, запускал событие OnClick при нажатии определенной клавиши с клавиатуры?

2) Очень глупый вопрос, но все же задам . Есть одна форма и в ней прописано:
float A;
A=0:
Есть вторая форма, каторая должна изменять значение переменной "А" на другое. Но вот проблемма, как задавать значение переменной другой формы? Пишу:
Form1->A= (Form1->A)+10; (во второй форме)
И мне выдает ошибку что "А" не является компонентом "Form1" ... впринципе логично , но как тогда задавать значение переменной другой формы ? (две книги обчитал, не где не написано )

3) Как компоненту MediaPlayer, автоматически при загрузки открывающей звуковой файл, задать "повтор", чтобы после проигрывания мелодии, она повторялась? (думал как то осуществить с помощью Timer но, решил что еще есть надежда )

4) Есть кнопка button, при нажатие на нее (OnClick), воспроизводится звук при помощи PlaySound(sound.wav,0,SND_SYNC); вроде синхронно все должно работать, но всеровно .... происходит следующее: кнопка нажимается, начинает воспроизводится звук и в этот моент программа останавливается, звук заканчивает воспроизведение, нопка отжимается и программа продолжает работать Вопрос: Как сделать так, чтобы звук не мешал работе программы?

5) Возникла проблема с (rand()% ) , Есть компонент Timer, при OnTime происходит следующее:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
gmob= (rand()%399);
if (gmob <= 99) {
        if[] ((Battle->Cel->Top) < 160 ){
                Battle->Cel->Top = (Battle->Cel->Top)+1;
                }}
if (gmob <= 199) {
        if((Battle->Cel->Left) < 600){
                Battle->Cel->Left =  (Battle->Cel->Left)+1;
                }}
if(gmob <= 299) {
        if ((Battle->Cel->Top) > 0){
 
                Battle->Cel->Top = (Battle->Cel->Top)-1;
                }}
if (gmob <=399) {
        if((Battle->Cel->Left) > 300){
                Battle->Cel->Left =  (Battle->Cel->Left)-1;
                }}
По идеи Cel (картинка) должна передвигаться в разные стороны, но я заметил что после некаторого времени (примерно ~10секунд) Картинка зажимается в угол и там дергается)))))) Это глюк Timer или rand дает не равные шансы ? )))))

Добавлено через 22 минуты
По поводу 5-ого вопроса, нашел у себя ошибку:

C++
1
if ((gmob>=0) && (gmob<=99)) { ... }
написал все в таком духе.. но "чубзик" всеровно "прыгает" )))) добавил шанс на рандомное присвоение "чубзику" параметров Top и Left ... стало более интереснее , но мение реалистичней .... буду рад услышать предложения
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.08.2009, 15:42
Ответы с готовыми решениями:

Отклик от динамически созданной button?
private void Form2_Load(object sender, EventArgs e) { ... for (int i =...

Отклик свернутой программы при нажатии на клавишу с клавиатуры
возможно ли сделать так чтобы программа в момент когда находится в свернутом состоянии откликалась...

Вопросы вместо символов в button->caption
Доброго всем вечера, а у тех у кого утро с добрым утром! :) Перевожу программу на Эстонский язык и...

Как связать Button'ы c TextBox'ами или вопросы с ответами?
Здравствуйте! У меня имеется несколько кнопок Button и несколько Textbox. Texbox накладываю друг на...

14
Автор FAQ
3145 / 365 / 3
Регистрация: 08.08.2009
Сообщений: 1,126
29.08.2009, 15:57 2
4) Попробуйте PlaySound(sound.wav,0,SND_ASYNC); //Наоборот надо ассинхронно
2) Напишите в модуле второй формы #include "Unit.h"
Form1->A= (Form1->A)+10; (во второй форме)
Если вы написали переменную A внутри класса формы , то процитированное верно. Если не внутри класса формы то попробуйте A=A+10;
1
35 / 35 / 6
Регистрация: 29.08.2009
Сообщений: 183
29.08.2009, 16:36  [ТС] 3
Цитата Сообщение от RNT Посмотреть сообщение
4) Попробуйте PlaySound(sound.wav,0,SND_ASYNC); //Наоборот надо ассинхронно
2) Напишите в модуле второй формы #include "Unit.h"

Если вы написали переменную A внутри класса формы , то процитированное верно. Если не внутри класса формы то попробуйте A=A+10;

4) Помогло .... хотя не понятно почему ...вроде написано что SND_ASYNC возвращяет работу программы только после воспроизведения звука ... in shock!


2) Не помогло... на этот раз пишет что это "неопознаный символ"
0
Автор FAQ
3145 / 365 / 3
Регистрация: 08.08.2009
Сообщений: 1,126
29.08.2009, 16:45 4
Архангельский C++ Builder

SND_ASYNC-Звук воспроизводится асинхронно и функция PlaySound воз-
вращается немедленно после начала воспроизведения. Чтобы
прекратить асинхронное воспроизведение волнового файла,
надо вызвать PlaySound с параметром pszSound, равным 0.

SND_SYNC-Синхронное воспроизведение звука события. Функция PlaySound
возвращается только после окончания воспроизведения.
2) Не помогло... на этот раз пишет что это "неопознаный символ"
Подробнее
1
Программист TH
290 / 145 / 12
Регистрация: 06.01.2009
Сообщений: 537
29.08.2009, 16:51 5
на первый вопрос кстати:
В событие формы OnKeyDown прописываем просто Button1Click(Sender); например, причём у формы KeyPreview=true;
2
35 / 35 / 6
Регистрация: 29.08.2009
Сообщений: 183
29.08.2009, 17:10  [ТС] 6
RNT, Цитата из "C++ Builder 2-е издание" автор, Никита Культин:

Если задан асинхронный режим, то программа, вызвавшая функцию PlaySound, продолжит работу только после того, как завершится воспроизведение звукового файла.

2)
Form1: fault A;
Form2: Form1->A=10; (в данном случае пишет, что "А" не является компонентом TFrom1)


Form1: fault A;
Form2: A=10; (в данном случае пишет, что "А" - не опознаный символ, тоесть тоже самое что написать Form1: A=10; не объявляя "А" как переменную и не задавая ей тип.


1)
DanUnited, я понял написанное примерно так - что функция OnKeyDown повторит все то, что делает OnClick..... тоесть чтобы не писать два раза одно и тоже.

Но мне надо гдето объявить, чтобы при нажатии на "->" (стрелка вправо, или любую другую кнопку) выполнялся тот же код , что прописан в Button1Click. Тоесть я не знаю как привязывать к клавишам клавиатуры действия.

(Например, когда пихается на форму компонет "главном меню" (в Делфи 100%) то там можно настроить так, чтобы каждый из пунктов выполняющи действия... вызывался с комбинации кнопок (F1 - справка, H - открыть Help и т.д.) Но мне надо привязать клавишу к компоненту button.
0
Автор FAQ
3145 / 365 / 3
Регистрация: 08.08.2009
Сообщений: 1,126
29.08.2009, 18:02 7
Цитата Сообщение от Deimon Посмотреть сообщение
2)
Form1: fault A;
Form2: Form1->A=10; (в данном случае пишет, что "А" не является компонентом TFrom1)
Form1: fault A;
Form2: A=10; (в данном случае пишет, что "А" - не опознаный символ, тоесть тоже самое что написать Form1: A=10; не объявляя "А" как переменную и не задавая ей тип.
Возможно вы объявили переменную A как локальную , внутри фигурных скобок . Если так , то переменная доступна только в пределах фигурных скобок
0
35 / 35 / 6
Регистрация: 29.08.2009
Сообщений: 183
29.08.2009, 18:19  [ТС] 8
Цитата Сообщение от RNT Посмотреть сообщение
Возможно вы объявили переменную A как локальную , внутри фигурных скобок . Если так , то переменная доступна только в пределах фигурных скобок
Да-да-да-да-да-да!!! ..Вот ... вот в этом и вопрос ...как правельно объявить переменную? .. где именно ?
0
Автор FAQ
3145 / 365 / 3
Регистрация: 08.08.2009
Сообщений: 1,126
29.08.2009, 18:24 9
Вне фигурных скобок , после всех команд , начинающихся с # . Примерно так, как объявлены *Form1 и ival:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int ival;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
1
559 / 370 / 55
Регистрация: 05.04.2009
Сообщений: 767
29.08.2009, 18:29 10
Цитата Сообщение от RNT Посмотреть сообщение
Примерно так
или возможно так.
https://www.cyberforum.ru/post219258.html
1
35 / 35 / 6
Регистрация: 29.08.2009
Сообщений: 183
29.08.2009, 20:01  [ТС] 11
Очень-очень нужен ответ на 1)-ый вопрос.
0
Автор FAQ
3145 / 365 / 3
Регистрация: 08.08.2009
Сообщений: 1,126
29.08.2009, 20:19 12
1) Как сделать так, чтобы компонент формы button, запускал событие OnClick при нажатии определенной клавиши с клавиатуры?
Не думаю что это реально . Есть другие способы. Например это http://www.dudarik.wallst.ru/shortcut.php
1
559 / 370 / 55
Регистрация: 05.04.2009
Сообщений: 767
29.08.2009, 23:49 13
Цитата Сообщение от RNT Посмотреть сообщение
Не думаю что это реально
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
//---------------------------------------------------------------------------
//Form1->KeyPreview == True;
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
    switch(Key)
    {
        case  65  :  Button1->Click();
                          break;
        case  66  :  ;//..................
 
    }
    Form1->Caption = "Form KeyDown" + IntToStr(Key);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    Form1->DblClick();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDblClick(TObject *Sender)
{
     ShowMessage("Key = a; Form1->DblClick();");
}
//---------------------------------------------------------------------------
1
Автор FAQ
3145 / 365 / 3
Регистрация: 08.08.2009
Сообщений: 1,126
30.08.2009, 00:26 14
Цитата Сообщение от Deimon Посмотреть сообщение
1) Как сделать так, чтобы компонент формы button, запускал событие OnClick при нажатии определенной клавиши с клавиатуры?
Событие OnClick компонента TButton запускается при нажатии на кнопку , и только. Следовательно способ, который показал mirso, не более "реальный" чем мой .

Добавлено через 12 минут
Зачем нужен Form1->KeyPreview ? То что в справке написано я не понял:
Specifies whether the form should receive keyboard events before the active control.
Что это значит ?

Добавлено через 6 минут
Цитата с какого-то сайта:
присвоить свойству Form1.KeyPreview=True (этим мы будем передавать все нажатые клавиши в событие Form_KeyPress).
Тоже непонятно, что если Form1->KeyPreview=False то событие OnKeyPress работать не будет ?
1
125 / 116 / 17
Регистрация: 27.02.2007
Сообщений: 291
30.08.2009, 16:59 15
Цитата Сообщение от Deimon Посмотреть сообщение
Но мне надо гдето объявить, чтобы при нажатии на "->" (стрелка вправо, или любую другую кнопку) выполнялся тот же код , что прописан в Button1Click. Тоесть я не знаю как привязывать к клавишам клавиатуры действия.
Ну, например:
C++
1
2
3
4
5
void __fastcall TForm1::FormKeyUp(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
  if(Key == VK_RIGHT) Button1Click(Button1); //когда отпустил клавишу "->"
}
Это когда фокус ввода на форме. Ну а если фокус на другом компоненте, добавь этот обработчик к его OnKeyUp,
Цитата Сообщение от Deimon Посмотреть сообщение
(Например, когда пихается на форму компонет "главном меню" (в Делфи 100%) то там можно настроить так, чтобы каждый из пунктов выполняющи действия... вызывался с комбинации кнопок (F1 - справка, H - открыть Help и т.д.) Но мне надо привязать клавишу к компоненту button.
Есть такой компонент TActionList, который наполняется TAction (действия). TAction имеет свойство ShortCut, это как раз то, что надо. А уж TAction можно раздавать кнопкам и пунктам меню.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.08.2009, 16:59
Помогаю со студенческими работами здесь

Запись из формы данных в переменные php файла, данные из переменные используются в других файлах сайта
Всем привет! Ребят, подскажите пожалуйста! Есть один файл с обычной html формой, в которой обычные...

Button с клавиатуры
На форме имеются баттоны нужно чтобы при нажатии определенной клавиши на клавиатуре, нажимался...

Удерживать нажатие button с клавиатуры
Здравствуйте. Сразу к сути. Если я нажал и держу пробел на клавиатуре, то label1 окрашивается в...

Дано массив М*М (м- из клавиатуры), массив заполнить на rand и поменять местами
Дано массив М*М (м- из клавиатуры), массив заполнить на rand Поменять местами 1строчка из...

Если Button 1 и Button 2 нажаты - Button 3 стала активной, как?
Проверка если Button 1 и Button 2 нажаты - Button 3 стала активной Причем нужно чтобы это...

Как привязать button к определенной клавише клавиатуры
Никак не могу сообразить как привязать button к определенной клавише клавиатуры, есть исходный код...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru