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


Автор: mr.Anderson 8.8.2005, 20:30
Нужно отловить нажатие Del в Memo1, после чего поменять значение метки.
Я написал вот это:
Код

if(Key==83)
{
 Label1->Caption="New caption";
}

Но это не работает. Пробовал так:
Код

if(Key==VK_HELP)

Еще вот так:
Код

#define VK_HELP 83
if(Key==VK_HELP)

И даже так:
Код

#define VK_HELP &H2F
if(Key==VK_HELP)

Но в последнем варианте происходит ошибка. Компайлер говорит о неизвестном символе H2F.
В других случаях ни ошибок, ни предупреждений не выдается, однако - нажимаю Del, значение метки не изменяется. Этот отлов я писал в событии OnKeyPress объекта TMemo.

Автор: codelord 8.8.2005, 20:40
Код

void __fastcall TForm1::Memo1KeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
 if(Key==46) Label1->Caption="New caption";
}

Автор: Vitalik 8.8.2005, 21:20
Да, codelord прав.
Дело в том, что OnKeyPress отлавливает только буквенно-цифровые клавиши.
А вот OnKeyDown/OnKeyUp - это уже более мощный инструмент, тут тебе и виртуальные коды клавиш, и проверка состояния управляющих клавиш (Ctrl, Alt, Shift).

Кстати, для большей понятности кода я предпочитаю писать VK_DELETE вместо ничего не говорящего числа 46 smile

Автор: mr.Anderson 9.8.2005, 07:34
Спасибо, все заработало. Значит, можно вместо OnKeyPress всегда OnKeyDown использовать? А OnKeyUp для чего существует?
И еще непонятно: через вот такую конструкцию
Код

void main(void)
{
again: printf("%d\n",getch());
goto again;
}

Выдается, что код клавиши Delete 83. А почему же в Windows приходится писать 46?

Автор: codelord 9.8.2005, 09:11
Цитата(sim7 @ 9.8.2005, 07:34)
А OnKeyUp для чего существует?

это шутка??. В Help.

Цитата(sim7 @ 9.8.2005, 07:34)
Выдается, что код клавиши Delete 83. А почему же в Windows приходится писать 46?

подумай разок!!!

Автор: Vitalik 9.8.2005, 11:42
Цитата(sim7 @ 9.8.2005, 07:34)
Спасибо, все заработало. Значит, можно вместо OnKeyPress всегда OnKeyDown использовать?

Не всегда. OnKeyPress удобен, когда действительно нужно отлавливать только алфавитно-цифровые клавиши. В данном случае OnKeyPress легко различит и букву 'a' и 'A'. В то время, как OnKeyDown получит только виртуальный код клавиши (то есть 'A' и для маленькой и для большой).

Цитата(sim7 @ 9.8.2005, 07:34)
А OnKeyUp для чего существует?

OnKeyDown происходит при нажатии клавиши, OnKeyUp - при отпускании. По-моему логично smile

Цитата(sim7 @ 9.8.2005, 07:34)
И еще непонятно: через вот такую конструкцию printf("%d\n",getch()); Выдается, что код клавиши Delete 83. А почему же в Windows приходится писать 46?

Просто это разные варианты "кодирования" клавиш.
1). Функция getch().
Она просто возвращает ASCII-код клавиши для любой алфавитно-цифровой клавиши (в том числе учитывается регистр и "русские" буковки) а также для таких клавиш, как Tab (код 9), Enter (код 13), Backspace (код 8), Escape (код 27) и др...
Для управляющих же клавиш (F1-F12, "курсоры", и т.д... в том числе и Delete) она возвращает сначала 0, а потом еще одно байтовое число, характеризующее эту клавишу. Например, для Delete там как раз код 83.
2). Обработчики событий OnKeyDown/OnKeyUp возвращают так называемый виртуальный код клавиши. Это уже просто одно число в один байт (0..255) соответствующее каждой клавише на клавиатуре. Вот тут Delete имеет код клавиши 46. А вот коды для алфавитных клавиш, к примеру, совпадают с ASCII-кодами больших латинских букв. А ASCII-коды для маленьких латинских отданы под другие клавиши (управляющие).

Если интересно узнать коды виртуальных клавиш, то в справке билдера в предметном указателе можно ввести "Virtual key codes". Или же в файле "winuser.h" есть собственно все макросы для виртуальных клавиш (#define VK_DELETE 0x2E)

Цитата(codelord @ 9.8.2005, 09:11)
это шутка??. В Help.
Цитата(codelord @ 9.8.2005, 09:11)
подумай разок!!!

Зачем же так сразу?.. Ведь все мы раньше "чайниками" были smile
Тем более можно быть профи в одной области программирования и абсолютным чайником в другой smile

P.S. "Чайник" - это понятие ни в коем случае не оскорбительное.
"Чайник" - это тот, кто пока что мало знает, но пытается разобраться во всём.
"Ламер" - это тот, кто мало знает и не узнаёт ничего нового.

Добавлено @ 11:45
codelord, мне даже хотелось минус поставить за такие реплики... Ничего личного, просто если не хочется отвечать на вопрос, то его ведь можно и проигнорировать. Вместо того, чтобы принижать человека...

Автор: codelord 9.8.2005, 12:03
Цитата(Vitalik @ 9.8.2005, 11:42)
Вместо того, чтобы принижать человека...

Человека я принизить совсем не хотел. Просто если банально перевести на русский Key Down и Key Up,
ответ получишь гораздо раньше smile.

Автор: Vitalik 9.8.2005, 13:03
Цитата(codelord @ 9.8.2005, 12:03)
Человека я принизить совсем не хотел. Просто если банально перевести на русский Key Down и Key Up,
ответ получишь гораздо раньше

Тоже верно smile

Автор: mr.Anderson 11.8.2005, 18:32
Vitalik, спасибо, очень понятное разъяснение.
Что такое "чайник", я знаю, и вовсе не обиделся. smile Я до сих пор являюсь чайником. smile
codelord, перевести-то я перевел. Я просто не предполагал даже, что комп может учитывать и отлавливать "отпуск" клавиши. smile

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