Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перехват клавиш, частичный перехват, нужно - полный 
:(
    Опции темы
Kbl4AH
Дата 4.5.2008, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 741
Регистрация: 1.4.2008
Где: Вятка

Репутация: 1
Всего: 15



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

Это сообщение отредактировал(а) Kbl4AH - 4.5.2008, 21:41
PM MAIL ICQ   Вверх
Akella
Дата 4.5.2008, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



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

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


почитай о привидении типов, оператора IS и AS и о RTTI
PM MAIL   Вверх
Poseidon
Дата 5.5.2008, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



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



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Kbl4AH
Дата 5.5.2008, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 741
Регистрация: 1.4.2008
Где: Вятка

Репутация: 1
Всего: 15



В принципе так и сделал... просто до этого ни разу свою процедуру не делал - оказалось не так сложно, как думал)))
но серавно мне вариант с перехватом клавиш больше нравицца...
как все таки сделать перехват одной процедурой АБСОЛЮТНО ЛЮБЫХ клавиш?
PM MAIL ICQ   Вверх
Akella
Дата 8.5.2008, 08:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



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

разуй глаза smile

Добавлено через 11 секунд
http://forum.vingrad.ru/index.php?showtopi...t&p=1501153
PM MAIL   Вверх
SAVANE
Дата 8.5.2008, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 118
Регистрация: 20.7.2006
Где: Украина, Полтава

Репутация: нет
Всего: 1



Не уверен что про то спрашивают но
Свойства формы KeyPeview=True
Код

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


Это сообщение отредактировал(а) SAVANE - 8.5.2008, 12:29
--------------------
Be not afraid of growing slowly, be afraid only of standing still!
PM MAIL WWW ICQ   Вверх
Poseidon
Дата 8.5.2008, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



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



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Akella
Дата 10.5.2008, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Цитата(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
PM MAIL   Вверх
maximus666
Дата 12.5.2008, 21:39 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 30.12.2007

Репутация: нет
Всего: нет



Перехват абсолютно любых клавиш можно сделать поставив кейборд хук (дополнительная инфа есть в DRKB).

Для этого нужно написать простенькую 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.

Это сообщение отредактировал(а) maximus666 - 12.5.2008, 21:45
PM MAIL   Вверх
Akella
Дата 12.5.2008, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



При чём здесь DLL? Нужно в конкретной форме приложения ловить клавиши? а не в DLL
PM MAIL   Вверх
Kbl4AH
Дата 15.5.2008, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 741
Регистрация: 1.4.2008
Где: Вятка

Репутация: 1
Всего: 15



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

Это сообщение отредактировал(а) Kbl4AH - 15.5.2008, 22:03
PM MAIL ICQ   Вверх
SAVANE
Дата 15.5.2008, 23:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 118
Регистрация: 20.7.2006
Где: Украина, Полтава

Репутация: нет
Всего: 1



В событии OnCreate формы напиши.
Код

KeyPeview:=True;

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

If key=vk_F2 then .....;

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

If key=vk_F3 then .....;

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


--------------------
Be not afraid of growing slowly, be afraid only of standing still!
PM MAIL WWW ICQ   Вверх
Kbl4AH
Дата 16.5.2008, 07:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 741
Регистрация: 1.4.2008
Где: Вятка

Репутация: 1
Всего: 15



2Саван. Мм, немножко не это спрашивал... Объясни мне, плиз, что это за свойство KeyPreview, что оно делает када включено и выключено?
PM MAIL ICQ   Вверх
Qu1nt
Дата 16.5.2008, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 13.1.2007

Репутация: 18
Всего: 50



Цитата

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;

PM MAIL   Вверх
Kbl4AH
Дата 16.5.2008, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 741
Регистрация: 1.4.2008
Где: Вятка

Репутация: 1
Всего: 15



Краткость - сестра таланта;)
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0582 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.