Официальный сайт студ.городка НГТУ
Программирование и БД » [C++Builder6] ApplicationEvents //helpme plz =) 

#1  08.04.07 16:42

[C++Builder6] ApplicationEvents //helpme plz =)

Нужно сделать, чтобы по нажатиям на клавиши (стрелочки, в частности) вызывались нужные процедуры. Обработка события OnKeyPress не подходит, т.к. фокус может находиться в разных местах. Мне подсказали, что это через апликэйшнИвентс делается, а я осилить не могу =)
Гугля уже накурился, не помогает.

Offline

#2  08.04.07 19:40

Re: [C++Builder6] ApplicationEvents //helpme plz =)

У формы есть свойство KeyPreview. Если значение true, то форма обрабатывает событие OnKeyPress не зависимо от того, где находится фокус.

Исправлено Zaic (08.04.07 20:10)

Offline

#3  08.04.07 20:51

Re: [C++Builder6] ApplicationEvents //helpme plz =)

Проверил. Да, обрабатывает. Но!
Мне нужно нажимать на стрелочки. А на форме есть несколько буттонов. При нажимании стрелочек по кнопкам-буттонам бегает выделение (пунктирная рамка), а нужная процедура не вызывается.

Offline

#4  08.04.07 22:51

Re: [C++Builder6] ApplicationEvents //helpme plz =)

Le_Hash написал(а):

Проверил. Да, обрабатывает. Но!
Мне нужно нажимать на стрелочки. А на форме есть несколько буттонов. При нажимании стрелочек по кнопкам-буттонам бегает выделение (пунктирная рамка), а нужная процедура не вызывается.

ну ты сам должен её вызывать епта
программа то откуда знает что ты хочешь вызвать

Offline

#5  08.04.07 22:57

Re: [C++Builder6] ApplicationEvents //helpme plz =)

otaku, умник блин =)
вот я чо написал:

Код: Builder:

void __fastcall TForm1::FormKeyPress(TObject *Sender, char &Key)
{
if (Key==VK_UP) Button5Click(Sender);     //это не работает
if (Key==VK_ESCAPE) Close();     //а это работает
}

Offline

#6  09.04.07 11:25

Re: [C++Builder6] ApplicationEvents //helpme plz =)

Le_Hash написал(а):

otaku, умник блин =)
вот я чо написал:

Код: Builder:

void __fastcall TForm1::FormKeyPress(TObject *Sender, char &Key)
{
if (Key==VK_UP) Button5Click(Sender);     //это не работает
if (Key==VK_ESCAPE) Close();     //а это работает
}

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

Offline

#7  09.04.07 11:26

Maq
Профиль

Re: [C++Builder6] ApplicationEvents //helpme plz =)

VK_UP, VK_ESCAPE и т.д. - это чар?:)))))))))))))

Offline

#8  09.04.07 14:44

Re: [C++Builder6] ApplicationEvents //helpme plz =)

Le_Hash, если ты хочешь, чтобы выделение по кнопочкам вообще не бегало, то
установи свойство TabStop равным false.
Если у тебя что-то не хочет работать, то, как уже сказали, занимайся отладкой.

Кстати, можешь выложить вест код? Или он большой?

Offline

#9  09.04.07 19:19

Re: [C++Builder6] ApplicationEvents //helpme plz =)

Код огромный и сюда постить смысла нет.
Для примера: создаём новый application, накидываем на форму 2-3 кнопки, выставляем у них TabStop равным false. У формы ставим KeyPreview в значение true. В событии OnKeyPress у формы пишем код:

Код: Builder:

if (Key==VK_UP) ShowMessage("Ok");
if (Key==VK_ESCAPE) ShowMessage("Ok");

Запускаем. Жмём Esc, получаем мессагу "Ок". Жмём стрелочку вверх - не работает. Если нажать на кнопку и понажимать стрелку вверх, по кнопкам всёравно бегает выделение, мессага всёравно не показывается.

Le_Hash написал(а):

Мне подсказали, что это через ApplicationEvents делается, а я осилить не могу =)

Вот вопрос собственно в этом: как это сделать через событие onMessage элемента ApplicationEvents?
З.Ы. Как юзают отладку?))

Offline

#10  09.04.07 19:24

Re: [C++Builder6] ApplicationEvents //helpme plz =)

Более того, если в событии OnKeyPress у формы написать "Close();" (т.е. тупо закрывать, не проверяя клавишу), то форма не закрывается при нажатии на стрелочки. Т.е. они вообще не обрабатываются.

Offline

#11  09.04.07 19:49

Re: [C++Builder6] ApplicationEvents //helpme plz =)

Le_Hash написал(а):

Запускаем. Жмём Esc, получаем мессагу "Ок". Жмём стрелочку вверх - не работает. Если нажать на кнопку и понажимать стрелку вверх, по кнопкам всёравно бегает выделение, мессага всёравно не показывается.

Если этот код засунуть в KeyUp, то все будет работать. А KeyPress и KeyDown почему-то стрелочки не обрабатывают.

Offline

#12  10.04.07 00:14

Maq
Профиль

Re: [C++Builder6] ApplicationEvents //helpme plz =)

ХА ХА ХА
Le_Hash, мой пост то проигнорировал?

Le_Hash написал(а):

if (Key==VK_UP)

кто тебя учил так делать?

а то что Key - Char, а VK_UP - интегер тебя не смущает?)))))

Offline

#13  10.04.07 00:28

Maq
Профиль

Re: [C++Builder6] ApplicationEvents //helpme plz =)

если не умеешь чтать хелп, держи:

Occurs when key pressed.

Delphi syntax:

type TKeyPressEvent = procedure (Sender: TObject; var Key: Char) of object;
property OnKeyPress: TKeyPressEvent;

C++ syntax:

typedef void __fastcall (__closure *TKeyPressEvent)(System::TObject* Sender, char &Key);
__property TKeyPressEvent OnKeyPress = {read=FOnKeyPress, write=FOnKeyPress};

Description

Use the OnKeyPress event handler to make something happen as a result of a single character key press.

The Key parameter in the OnKeyPress event handler is of type Char; therefore, the OnKeyPress event registers the ASCII character of the key pressed. Keys that don't correspond to an ASCII Char value (Shift or F1, for example) don't generate an OnKeyPress event. Key combinations (such as Shift+A), generate only one OnKeyPress event (for this example, Shift+A results in a Key value of “A” if Caps Lock is off). To respond to non-ASCII keys or key combinations, use the  OnKeyDown or OnKeyUp event handlers.

тебе юзать надо не OnKeyPress, а OnKeyUp или OnKeyDown

Occurs when the user releases a key that has been pressed.

Delphi syntax:

type
  TKeyEvent = procedure (Sender: TObject; var Key: Word; Shift: TShiftState) of object;
property OnKeyUp: TKeyEvent;

C++ syntax:

typedef void __fastcall (__closure *TKeyEvent)(System::TObject* Sender, Word &Key, Classes::
TShiftState Shift);
__property TKeyEvent OnKeyUp = {read=FOnKeyUp, write=FOnKeyUp};

Description

Use the OnKeyUp event handler to provide special processing that occurs when a key is released. The OnKeyUp handler can respond to all keyboard keys, including function keys and keys combined with the Shift, Alt, and Ctrl keys.

The TKeyEvent type points to a method that handles keyboard events. The Key parameter is the key on the keyboard. For non-alphanumeric keys, you must use virtual key codes to determine the key pressed. For more information, see Virtual Key codes.

The Shift parameter indicates whether the Shift, Alt, or Ctrl keys are combined with the keystroke.

PS Можно сделать и по событию OnShortCut и по OnMessage, мо много еще как извратиться)))

Offline

#14  10.04.07 00:34

Re: [C++Builder6] ApplicationEvents //helpme plz =)

Maq, меня вообще несоответствие типов редко смущает =)))) Разве VK_UP - integer? А десятичные и НЕХ-коды клавиш это что? Какой тогда будет чаровый код клавиш для стрелочек?
И почему с эскейпом работает, а со стрелкой нет?
В среду на лабах добъюсь от препода решения (именно через AppEvents) и обязательно покажу сюда, что я имел ввиду. Просто очень уж хочется доделать курсовик и забыть.

Offline

#15  10.04.07 00:42

Maq
Профиль

Re: [C++Builder6] ApplicationEvents //helpme plz =)

Le_Hash, ну хз почему работает)) у меня в Делфе не пашет)))
Говорю, работай с собитием OnKeyUp и все будет норм)))
если надо могу более навороченные варианты написать:)))

Offline

#16  11.04.07 19:21

Re: [C++Builder6] ApplicationEvents //helpme plz =)

Сегодня сделал. Показываю.
В Unit.h, в раздел public класса TForm1:

Код: Builder:

        union BBB
        {
          unsigned long lB;
          struct _sB
          {
             unsigned char B1;
             unsigned char B2;
             unsigned char B3;
             unsigned char B4;
          } sb;
        } MyB;


В соббытие OnMessage элемента ApplicationEvents:

Код: Builder:

if(Msg.message == WM_KEYDOWN)
  {
          MyB.lB = Msg.lParam;
          if(MyB.sb.B3==72)  //кнопка вверх
             ShowMessage("Ok!");
  }

Вот такое я хотел от вас получить))
Maq, онКейАп мне вообще никак не подходит, а онКейДаун всёравно не работал, т.к. фокус стоял на button'aх и при нажатии стрелочек по ним перемещалось выделение, а процедура не вызывалась.
P.S. Кому интересно/непонятно как это работает - могу рассказать, мне не жалко =)

Исправлено Le_Hash (11.04.07 19:26)

Offline

Программирование и БД » [C++Builder6] ApplicationEvents //helpme plz =) 

ФутЕр:)

© Hostel Web Group, 2002-2025.   Сообщить об ошибке

Сгенерировано за 0.055 сек.
Выполнено 14 запросов.