Форум: "Основная";
Текущий архив: 2007.01.21;
Скачать: [xml.tar.bz2];
ВнизКак лучше такое реализовать? Отлов нажатий клавиш. Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.041 c