Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Перехват клавиш


Автор: Kbl4AH 4.5.2008, 21:30
Добрый вечер!
Столкнулся с такой проблемой - 
у меня на форме много Edit'ов, скажем штук 10...
мне нужно, чтобы выполнялся код при нажатии клавиши F2, причом она может быть нажата в любом Edit'е...
делать 10 раз процедуру onkeyup для каждого Edit'a - не вариант...
глянул DRKB - нашел кусок кода, в котором используется процедурка CM_dialogkey перехвата диалоговых клавиш до того, как они будуь обрабатываться формой (покрайней мере, я так понял)...
все классно, процедурка клевая (в других задачах меня устраивала)...
прекрасно ловит всякие табы и ентеры, но почему-то не срабатывает с F-клавишами (наверное, они не диалоговые)...
подскажите какую-нибудь другую процедурку, пожалуйста, или помогите написать собственную процедуру для onkeyup, чтоб не надо было делать одинаковый громоздкий onkeyup только в разных Edit'ах, а чтоб можно было один раз процедурку описать, а потом в каждом editX.onkeyup чисто одну строчку вписывать...
просто я недавно программирую, учусь только, и еще не освоил написание собственных процедур...
Заранее СПАСИБО, всем откликнувшимся!

Автор: Akella 4.5.2008, 22:51
что-то вроде этого кода, который должен находиться в событии OnKeyPress или OnKeyDown
само собой, что свойство KeyPreview формы должно быть в True
Код

  if ActiveControl is TEdit then TEdit(ActiveControl).Text := 'бла бла бла'!!!


почитай о привидении типов, оператора IS и AS и о RTTI

Автор: Poseidon 5.5.2008, 14:17
Цитата(Kbl4AH @  4.5.2008,  21:30 Найти цитируемый пост)
делать 10 раз процедуру onkeyup для каждого Edit'a - не вариант
Сделай одну и пропиши ее в каждом едите  smile 

Автор: Kbl4AH 5.5.2008, 16:01
В принципе так и сделал... просто до этого ни разу свою процедуру не делал - оказалось не так сложно, как думал)))
но серавно мне вариант с перехватом клавиш больше нравицца...
как все таки сделать перехват одной процедурой АБСОЛЮТНО ЛЮБЫХ клавиш?

Автор: Akella 8.5.2008, 08:34
Цитата(Kbl4AH @  5.5.2008,  16:01 Найти цитируемый пост)
как все таки сделать перехват одной процедурой АБСОЛЮТНО ЛЮБЫХ клавиш? 

разуй глаза smile

Добавлено через 11 секунд
http://forum.vingrad.ru/index.php?showtopic=209656&view=findpost&p=1501153

Автор: SAVANE 8.5.2008, 12:28
Не уверен что про то спрашивают но
Свойства формы KeyPeview=True
Код

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
If key=//F2 Как обозначить F2 непомню в форуме есть
then procedure bla;
end;

Автор: Poseidon 8.5.2008, 13:20
Цитата(SAVANE @  8.5.2008,  12:28 Найти цитируемый пост)
 Как обозначить F2 непомню в форуме есть
vk_F2

Автор: Akella 10.5.2008, 13:41
Цитата(SAVANE @  8.5.2008,  12:28 Найти цитируемый пост)
If key=//F2 Как обозначить F2 непомню в форуме есть

vk_F2, vk_return, vk_escape, vk

в справочной системе есть все коды виртуальных клавиш
кстати если в гугле поискать по ключевому слову vk_return
то вылезешь сюда http://delphi.about.com/od/objectpascalide/l/blvkc.htm

Автор: maximus666 12.5.2008, 21:39
Перехват абсолютно любых клавиш можно сделать поставив кейборд хук (дополнительная инфа есть в http://www.drkb.ru/).

Для этого нужно написать простенькую DLL, код которой может быть следующий:

Код

library SpyKey;// имя библиотеки

uses
    Windows,SysUtils, messages;

var
MyHookHandle:HHook = 0;

function MyCoolHook(Code: integer; wParam: word; lParam: Longint):LongInt;stdCall;
    begin
// wParam содержит код нажатой клавы
        if (code<0 ) then Result := CallNextHookEx(MyHookHandle,Code, wParam, lParam)
        else//проверка, какая кнопка нажата
            begin
            result:=0; // здесь надо быть осторожным: надо проверить какой резальт запрещает дальнейшую обработку события
            CallNextHookEx(MyHookHandle,Code, wParam, lParam)
            //вызываю следующую ловушку
        end;{if}

    end;
{===========================}
procedure SetHook;stdCall;Export;
    begin
          //установить хук
    MyHookHandle := SetWindowsHookEx(WH_Keyboard, @MyCoolHook, hInstance, 0);
    end;
{===========================}
procedure UnHook;stdCall;Export;
    begin
    UnhookWindowsHookEx(MyHookHandle);//снять хук
    end;
{===========================}
exports
//экспорт функций
    SetHook,
    Unhook;
Begin
//установить ловушку при подключении библиотеки, эту функцию здесь можно убрать, вставив ее в коде своей программы
//не забывать только вызывать функцию UnHook, иначе после завершения программы хук не снимится, продолжая обрабатывать инфу
SetHook;у
end.


в коде программы достаточно импортировать функции SetHook и UnHook.

Автор: Akella 12.5.2008, 23:23
При чём здесь DLL? Нужно в конкретной форме приложения ловить клавиши? а не в DLL

Автор: Kbl4AH 15.5.2008, 21:52
Фига вы разогнались smile 
2Акелла Не надо мне никакие актив контролы... Допустим у мну на форме пяток разных вариантов компонентов - я что, 5 раз условие писать буду?
Мне надо чтобы форма улавливала нажатую клавишу без разницы какой компонент при этом активный...
2СаванЧто-то похожее на то, что мне нужно... Тока объясни на пальцах, что за свойство КейПревю, за что оно отвечает?
2Остальные уважаемые винградари А нет ни у кого сцылки на понятную начинающим доку по всяким сендерам, обжектам, активам, хендлам и т.п.?
А то именно эта штука походу мне нужна... Просто работаю с БД Оракакл... Запросы сложные не требуцца, а с простыми напрягов - нет... Зато есть траблы в Делфи с формами, нажатиями клавиш и т.п. 
Просто надоело на каждой форме делать по несколько невидимых лэйбелов (меток) и писать кучу условий (типа - не прально работаешь, а скушай тада условие такое-то... реально код становицца фиговочитабельным), чтоб формы между собой по правилам воевали...
З.Ы. Делфийским перцам Перебарывайте себя и не отвечайте новичкам - да ты, лошара, смотри туда-сюда... если лень или убивает ответить грамотно, то лучше ваще не отвечать...

Автор: SAVANE 15.5.2008, 23:49
В событии OnCreate формы напиши.
Код

KeyPeview:=True;

Дальше  событие формы FormKeyPress
Напиши условие
Код

If key=vk_F2 then .....;

При этом в После зен пишеш тот код который нужно выполнить при нажатии F2
Нужно Другую кнопку обработать в процедуре  FormKeyPress пиши еще одно условие к примеру
Код

If key=vk_F3 then .....;

 и так хоть всю клавиатуру. 
Где найти коды кнопок писал Akella


Автор: Kbl4AH 16.5.2008, 07:43
2Саван. Мм, немножко не это спрашивал... Объясни мне, плиз, что это за свойство KeyPreview, что оно делает када включено и выключено?

Автор: Qu1nt 16.5.2008, 13:21
Цитата

If KeyPreview is true, keyboard events occur on the form before they occur on the active control. (The active control is specified by the ActiveControl property.) 
If KeyPreview is false, keyboard events occur only on the active control.

Цитата(Kbl4AH @  15.5.2008,  21:52 Найти цитируемый пост)
Мне надо чтобы форма улавливала нажатую клавишу без разницы какой компонент при этом активный...

Код

KeyPreview := True;

Автор: Kbl4AH 16.5.2008, 13:58
Краткость - сестра таланта;)

Автор: Akella 16.5.2008, 21:47
Цитата(Kbl4AH @  15.5.2008,  21:52 Найти цитируемый пост)
2Акелла Не надо мне никакие актив контролы... Допустим у мну на форме пяток разных вариантов компонентов - я что, 5 раз условие писать буду?

ДА НЕТ ЖЕ!!!!!!!!!! Я ТЕБЕ КОД ДАЛ ДЛЯ ФОРМЫ, А НЕ ДЛЯ 5-10-25 КОНТРОЛОВ!!!!!!!!


Цитата(Akella @  4.5.2008,  22:51 Найти цитируемый пост)
что-то вроде этого кода, который должен находиться в событии OnKeyPress или OnKeyDown

ЗАБЫЛ ДОПИСАТЬ, ЧТО В СОБИТИИ ФОРМЫ
И НЕ ЗАБУДЬ

Цитата(Akella @  4.5.2008,  22:51 Найти цитируемый пост)
свойство KeyPreview формы должно быть в True


Добавлено через 2 минуты и 18 секунд
Цитата(Kbl4AH @  15.5.2008,  21:52 Найти цитируемый пост)
Мне надо чтобы форма улавливала нажатую клавишу без разницы какой компонент при этом активный...

ВОТ ИМЕННО ЭТО Я И ИМЕЛ ВВИДУ

НЕУЖЕЛИ НЕ ПОНЯТНО ЭТО:
Код

определяем, какой контрол активный
 if ActiveControl is TEdit then TEdit(ActiveControl).Text := 'бла бла бла'!!!

или так:
 if (ActiveControl is TEdit) and (TEdit(ActiveControl).name := 'Edit1') then
   TEdit(ActiveControl).Text := 'бла бла бла'!!!


Добавлено через 3 минуты и 46 секунд
Цитата(Kbl4AH @  15.5.2008,  21:52 Найти цитируемый пост)
2СаванЧто-то похожее на то, что мне нужно... Тока объясни на пальцах, что за свойство КейПревю, за что оно отвечает?

это свойство отвечает за приоритет улавливания клавиш, так сказать, если := True, то форма первая получает нажатие клавиши, а вотом передаёт дальше, если ты конечно не запретишь дальше передавать  smile

Добавлено через 4 минуты и 17 секунд
кстати по поводу KeyPreView..... а что клавиша F1 на клаве выламана??????? smile

Добавлено через 5 минут и 59 секунд
Цитата(Kbl4AH @  15.5.2008,  21:52 Найти цитируемый пост)
Перебарывайте себя и не отвечайте новичкам - да ты, лошара, смотри туда-сюда...

за свою практику я на винграде таких ответов ещё не видел

Добавлено через 7 минут и 52 секунды
Но и вы не ленитесь использовать поиск по форуму или интернету в целом, а ещё есть такое понятие, как справка ну и, может быть + переводчик.

Добавлено через 12 минут и 35 секунд
Цитата(Kbl4AH @  16.5.2008,  07:43 Найти цитируемый пост)
2Саван. Мм, немножко не это спрашивал... Объясни мне, плиз, что это за свойство KeyPreview, что оно делает када включено и выключено? 

ты про гугл слышал?  smile 
http://www.google.com.ua/search?hl=ru&q=keypreview&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA&meta=lr%3Dlang_ru

Автор: Kbl4AH 17.5.2008, 20:22
2Акелла. Грамотно и доходчиво. Спасибо!

Автор: Akella 17.5.2008, 20:39
Наконец-то  smile 

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