Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как лучше такое реализовать? Отлов нажатий клавиш. [D7, WinXP]


DVM ©   (2006-11-30 10:15:00) 

Мне необходимо наделить один из своих компонентов (потомок TCustomControl) следующим свойством. Он должен получать сообщения о нажатиях клавиш во всех своих дочерних контролах, которые лежат на нем. Как такое лучше провернуть? Кто что посоветует.


Юрий Зотов   (2006-11-30 13:05:00) [1]

> DVM ©   (30.11.06 12:32) [12]

Только не забудьте, что компонент может существовать и во многих экземплярах. И если каждый начнет ставить свой хук, то вряд ли это будет хорошо. Видимо, хук должен быть только один, а компонент должен регистрировать себя при создании (и разрегистрировать при удалении) в некоем списке - вот с этим списком хук и работает.


Сергей М.   (2006-11-30 12:42:00) [2]


> DVM ©   (30.11.06 12:32) [12]
>
>


Ну решил так решил.
Но я так и не понял, что ты подразумеваешь под "извещением" - вызов какого-то метода ? возбуждение какого-то события ? что-то еще ?


DVM   (2006-11-30 12:32:00) [3]


> Юрий Зотов ©   (30.11.06 12:18) [11]

Собственно я так и решил делать.

Всем спасибо.


Юрий Зотов   (2006-11-30 12:18:00) [4]

> DVM ©   (30.11.06 10:15)

Клавиатурный хук точно решит проблему. В конструкторе ставим, в деструкторе снимаем, в хуке извещаем.


Сергей М.   (2006-11-30 12:05:00) [5]


> Он вроде и не динамический.
>
>
> function DoKeyDown(var Message: TWMKey): Boolean;


DoKeyDown() и KeyDown() - два совершенно разных метода.
Я именно о KeyDown() говорю.


DVM   (2006-11-30 11:21:00) [6]


> Я так понял, что разрабатывается как раз "родительский"
> контрол - контейнер, для других, в том числе и не самописных.
>

Вот именно! Если бы все дочерние контролы были только мои - проблемы бы не было. Чужие же тоже должны извещать "контейнер".

> Сергей М. ©   (30.11.06 10:50) [5]


> а метод у этого класса есть дин.метод KeyDown

Он вроде и не динамический.


function DoKeyDown(var Message: TWMKey): Boolean;


wal   (2006-11-30 11:15:00) [7]


> [7] Сергей М. ©   (30.11.06 11:01)

Я так понял, что разрабатывается как раз "родительский" контрол - контейнер, для других, в том числе и не самописных.


Сергей М.   (2006-11-30 11:01:00) [8]


> что изменится поведение всех прочих компонентов, которые
> потомки TWinControl?


В перекрытом тобой методе KeyDown ты можешь вызвать метод KeyDown контрола, являющегося родительским по отношению к твоему контролу, тем самым известив его о событии нажатия клавиши


DVM   (2006-11-30 10:55:00) [9]


> Сергей М. ©   (30.11.06 10:50) [5]

Что-то я не понимаю, наверное.


> Зато он у тебя потомок TWinControl, а метод у этого класса
> есть дин.метод KeyDown, который ты вправе у себя перекрыть.
>


Перекрыть то я могу в своем компоненте ясное дело. От этого что изменится поведение всех прочих компонентов, которые потомки TWinControl?


Сергей М.   (2006-11-30 10:50:00) [10]


> Он даже не потомок TCustomForm


Зато он у тебя потомок TWinControl, а метод у этого класса есть дин.метод KeyDown, который ты вправе у себя перекрыть.


DVM   (2006-11-30 10:43:00) [11]


> Сергей М. ©   (30.11.06 10:35) [3]

Нашел.

Вот кусок оттуда:

var
 ShiftState: TShiftState;
 Form: TCustomForm;
begin
 Result := True;
 Form := GetParentForm(Self);
 if (Form <> nil) and (Form <> Self) and Form.KeyPreview and
   TWinControl(Form).DoKeyDown(Message) then Exit;


Так не получиться сделать для своего компонента, т.к. все контролы изначально обладают способностью пересылать информацию о нажатиях именно в форму, на которой они лежат. Моему компоненту они пересылать не станут. Он даже не потомок TCustomForm.


Сергей М.   (2006-11-30 10:35:00) [12]


> Где же реализация?


обращение к св-ву KeyPreview осуществляется в controls.pas


DVM   (2006-11-30 10:32:00) [13]


> Сергей М. ©   (30.11.06 10:18) [1]

Странно, я просмотрел весь модуль Forms поиском сочетания KeyPreview - нашел всего 4 вхождения. У TCustomForm цепочка заканчивается:

   property KeyPreview: Boolean read FKeyPreview write FKeyPreview
     stored IsForm default False;

Где же реализация?


Сергей М.   (2006-11-30 10:18:00) [14]


> Кто что посоветует


Посмотри как это реализовано для, например, формы в св-ве KeyPreview


Наверх

Титульная страница Поиск, карта сайта Написать письмо