Про event loop

Любые обсуждения, не нарушающие правил форума.

Модератор: Модераторы

Про event loop

Сообщение Troublemaker » 19.04.2008 06:08:51

Возможно, есть смысл создать на форуме раздел для начинающих, чтобы не засорять слишком уж широкоохватные разделы, но пока его нет потолкаюсь здесь :)

В свое время достаточно много писал на Clarion/win, там с обработкой ивентов многое проще - есть цикл accept, в котором часть событий обрабатывается автоматом, и на любое из них я могу повесить обработчик в виде тупого if event=...

В лазаре пытаюсь тупо заставить форму закрываться по esc. Повесил одинаковый код на form.onkeydown и на .onkeypress:

Код: Выделить всё
procedure TForm1.FormKeyPress(Sender: TObject; var Key: char);
begin
    self.Edit1.Text:=concat(Edit1.Text,key);
end;

Код: Выделить всё
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState );
var s:string;
begin
    str(key,s);
    self.Edit1.Text:=concat(Edit1.Text,s);
end;
(edit1 - просто текстовый контрол на форме)

Однако, никакой реакции на клавиатуру не наблюдаю кроме стандартных SAA-CUA клавиш. Где же включается этот обработчик, или, может, среди примеров к лазарю есть такой, где можно посмотреть основы?

Спасибо.
Аватара пользователя
Troublemaker
постоялец
 
Сообщения: 292
Зарегистрирован: 16.04.2008 13:00:44
Откуда: Биробиджан, Дальний Восток

Сообщение Brainenjii » 19.04.2008 06:18:47

KeyPreview := TRUE; ?

UPD: в Lazarus'e, вроде как, тоже можно обрабатывать события...
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение Troublemaker » 19.04.2008 06:58:18

Отлично, оно и есть.

Теперь бы разобраться с табуляцией: как мне отдать ненужные клавиши на дальнейшую обработку самой RTL? Кому послать message/event из:

Код: Выделить всё
procedure TForm1.FormKeyDown
begin
    case key of
    27:self.Close; //ESC
    end
end;
?
Потому как резко перестали работать те самые SAA-CUA - таб, стрелки и т.п. Просмотр показывает, что, независимо от выбранного мышкой контрола, sender.classname всегда равно tform1 (var form1:TForm1)[/b]
Аватара пользователя
Troublemaker
постоялец
 
Сообщения: 292
Зарегистрирован: 16.04.2008 13:00:44
Откуда: Биробиджан, Дальний Восток

Сообщение alexs » 19.04.2008 10:24:35

А не проще было ли положить на форму кнопку - и указать у неё что она обрабатывает нажатие Cancel?
там даже сточки кода не надо писать.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Сообщение Troublemaker » 19.04.2008 10:28:09

alexs писал(а):А не проще было ли положить на форму кнопку - и указать у неё что она обрабатывает нажатие Cancel?
Тоже вариант. Но как быть, если все-таки нужна обработка клавиш?
Аватара пользователя
Troublemaker
постоялец
 
Сообщения: 292
Зарегистрирован: 16.04.2008 13:00:44
Откуда: Биробиджан, Дальний Восток

Сообщение alexs » 19.04.2008 10:59:17

обычно хватает установить обработчик у какого-то компоненты. Зачем на всё?

Troublemaker писал(а):Просмотр показывает, что, независимо от выбранного мышкой контрола, sender.classname всегда равно tform1

Тут всё правильно. Ты же ведь повесил обработчик на форму - вот тебе она и отзывается. А чтобы узнать активный контрол в данный момент - смотри пропертю с одноимённым названием - ActiveControl. В ней содержится указатель на контрол, который имеет в данный момент фокус ввода.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Сообщение Troublemaker » 19.04.2008 11:09:13

alexs писал(а):А чтобы узнать активный контрол в данный момент - смотри пропертю с одноимённым названием - ActiveControl. В ней содержится указатель на контрол, который имеет в данный момент фокус ввода.
Так как мне отдать управление этому контролу? (например, стрелками выбирать радиокнопку а табами - нужную радиогруппу)
Или на каждую нужную комбинацию клавиш вешать невидимый батон, чтобы он перехватывал и обрабатывал именно эту комбинацию?
Аватара пользователя
Troublemaker
постоялец
 
Сообщения: 292
Зарегистрирован: 16.04.2008 13:00:44
Откуда: Биробиджан, Дальний Восток

Сообщение alexs » 19.04.2008 11:15:28

А он и так в фокусе и если ты установил у формы KeyPreview, но событие не обработал - то это событие получит этот контрол. Если не получает - то кто-то его другой обработал.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Сообщение Troublemaker » 19.04.2008 14:11:11

alexs писал(а):А он и так в фокусе и если ты установил у формы KeyPreview, но событие не обработал - то это событие получит этот контрол. Если не получает - то кто-то его другой обработал.
Дык, я-то его обработал! Проверил, не нажали ли ESC. Вопрос в том, как мне отдайть чайлдам ивент, который я не хочу обрабатывать в паренте, например, ту же клавишу?

В хелпе по дельфи упоминается broadcast, но не вижу ничего похожего в лазаре.
Аватара пользователя
Troublemaker
постоялец
 
Сообщения: 292
Зарегистрирован: 16.04.2008 13:00:44
Откуда: Биробиджан, Дальний Восток

Сообщение Sergei I. Gorelkin » 19.04.2008 23:25:28

В обработчиках KeyDown и KeyPress можно менять переменную Key, т.е. код нажатой клавиши. Если установить Key равным нулю - дальше это нажатие обрабатываться не будет. Если Key не менять, нажатие будет обрабатываться дальше обычным порядком.

Но... все это совершенно не касается клавиш навигации. Они в Дельфи обрабатываются совершенно по-другому, к тому же я не помню, чтобы это было документировано. Там надо обрабатывать сообщения CM_WANTSPECIALKEY, CM_DIALOGCHAR и WM_DIALOGCHAR.
Как оно в Лазаре обстоит - пока не изучал...
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1405
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград


Вернуться в Потрепаться

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12

Рейтинг@Mail.ru
cron