Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.043 c
2-1167218022
term1t
2006-12-27 14:13
2007.01.21
ADO + MS VFP


2-1167300587
KOSS
2006-12-28 13:09
2007.01.21
DBGRID


3-1162542442
Монг
2006-11-03 11:27
2007.01.21
Вопрос по компоненту cxGrid


3-1162391114
Patrick
2006-11-01 17:25
2007.01.21
Импорт в FastReport


2-1168029033
Александр Свентицкий
2007-01-05 23:30
2007.01.21
Вывод данных в файл





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский