Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.01.21;
Скачать: CL | DM;

Вниз

Как лучше такое реализовать? Отлов нажатий клавиш.   Найти похожие ветки 

 
DVM ©   (2006-11-30 10:15) [0]

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


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


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


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


 
DVM ©   (2006-11-30 10:32) [2]


> Сергей М. ©   (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:35) [3]


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


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


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


> Сергей М. ©   (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:50) [5]


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


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


 
DVM ©   (2006-11-30 10:55) [6]


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

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


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


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


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


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


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


 
wal ©   (2006-11-30 11:15) [8]


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

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


 
DVM ©   (2006-11-30 11:21) [9]


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

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

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


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

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


function DoKeyDown(var Message: TWMKey): Boolean;


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


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


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


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

> DVM ©   (30.11.06 10:15)

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


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


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

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

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


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


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


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


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

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

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



Страницы: 1 вся ветка

Текущий архив: 2007.01.21;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.065 c
15-1167295872
Rouse_
2006-12-28 11:51
2007.01.21
Таки скока вы работаете? :)


1-1164629646
NeyroSpace
2006-11-27 15:14
2007.01.21
Вопрос про плагины (компонент TJvPlugin)


2-1167987067
Wahnsinng
2007-01-05 11:51
2007.01.21
Автоматичсекий переход


3-1162386352
FBuilder
2006-11-01 16:05
2007.01.21
MySQL + Delphi через DBExpress


15-1167412230
Footballer
2006-12-29 20:10
2007.01.21
Копирование