powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TFrame - как обработать сообщение WM_KEYUP?
36 сообщений из 36, показаны все 2 страниц
TFrame - как обработать сообщение WM_KEYUP?
    #39459839
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет всем.

Каким образом можно в наследниках от TFrame обрабатывать сообщения нажатия клавиш?

В этот метод управление не передается:
Код: pascal
1.
2.
3.
4.
procedure TMyFrame.WMKeyUp( var Message : TMessage );
begin
  inherited;
end;



Суть хотелки: есть набор типовых фреймов, которые располагаются на формах.
Экземпляры фреймов (даже одного типа) могут быть ассоциированы с различными разделами справки.
Хочется добиться реакции на нажатие клавиши F1 для вызова контекстной справки.

С уважением, Polesov.
...
Рейтинг: 0 / 0
TFrame - как обработать сообщение WM_KEYUP?
    #39459861
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PolesovВ этот метод управление не передается:Передается, если специально послать. А так ведь у самого фрейма нет фокуса и надо тогда делать что-то вроде KeyPreview, как у форм...
...
Рейтинг: 0 / 0
TFrame - как обработать сообщение WM_KEYUP?
    #39459863
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Перекрыть WindowProc у детей фрейма, способных принимать обрабатывать WM_KEYUP и оттуда пересылать сообщение родителю через dispatch
...
Рейтинг: 0 / 0
TFrame - как обработать сообщение WM_KEYUP?
    #39459881
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barmaley57Перекрыть WindowProc у детей фрейма, способных принимать обрабатывать WM_KEYUP

У меня не получилось.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
type
  TFrame2 = class(TFrame)
  private
    { Private declarations }
    OldProc : TWndMethod;
    procedure FrameProc( var Msg : TMessage );
  public
    { Public declarations }
    constructor Create( aOwner : TComponent ); override;
  end;

implementation

{$R *.dfm}

constructor TFrame2.Create( aOwner : TComponent );
begin
  inherited Create( aOwner );
  OldProc := WindowProc;
  WindowProc := FrameProc;
end;

procedure TFrame2.FrameProc( var Msg : TMessage );
begin
//  OldProc( Msg );
  if Msg.Msg = WM_KEYUP then
  asm
       Nop
  end;
  OldProc( Msg );
end;



На Nop поставлен брикпоинт - не попадает.
Пробовал с вызовом OldProc в начале и в конце.
...
Рейтинг: 0 / 0
TFrame - как обработать сообщение WM_KEYUP?
    #39459883
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barmaley57Перекрыть WindowProc у детей фрейма
...
Рейтинг: 0 / 0
TFrame - как обработать сообщение WM_KEYUP?
    #39459888
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Barmaley57Перекрыть WindowProc у детей фрейма
Имеется ввиду, у всех компонентов, расположенных на фрейме? Детей может быть много.
Тогда уж проще при создании фрейма у родительской формы переопределить обработчик
события OnKeyUp с анализом, что обработчик уже переопределен другим фреймом.

Но хотелось бы по ленивому сценарию :-)
...
Рейтинг: 0 / 0
TFrame - как обработать сообщение WM_KEYUP?
    #39459892
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PolesovДетей может быть много.Рекурсивный пробег по Controls[]
...
Рейтинг: 0 / 0
TFrame - как обработать сообщение WM_KEYUP?
    #39459895
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Polesov_Vasilisk_пропущено...

Имеется ввиду, у всех компонентов, расположенных на фрейме? Детей может быть много.
Тогда уж проще при создании фрейма у родительской формы переопределить обработчик
события OnKeyUp с анализом, что обработчик уже переопределен другим фреймом.

Но хотелось бы по ленивому сценарию :-)

По ленивому сценарию - у формы есть обработчик сообщения WM_HELP, в котором определяется, какой Control или его родитель попросил помощи. Этот обработчик можно перекрыть.
Методы собственно вызова разных справок у TApplication имеют видимость public
...
Рейтинг: 0 / 0
TFrame - как обработать сообщение WM_KEYUP?
    #39459897
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Рекурсивный пробег по Controls[]Только делать это нужно в переопределенном TmyFrame.Notification. И не забыть восстановить при удалении
...
Рейтинг: 0 / 0
TFrame - как обработать сообщение WM_KEYUP?
    #39459908
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schiПо ленивому сценарию - у формы есть обработчик сообщения WM_HELP
Можно и так, но не хотелось бы в эту кухню вызова справки каким-либо образом привлекать TForm.
В силу того, что все фреймы наследуются от одного базового класса, достаточно вызов справки
реализовать в базовом фрейме. А так как наследование форм в данном конкретном проекте не
используется, придется для каждого класса форм не забыть про реализацию вызова справки
через обработчик сообщения WM_HELP.
...
Рейтинг: 0 / 0
TFrame - как обработать сообщение WM_KEYUP?
    #39459909
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Рекурсивный пробег по Controls ... Только делать это нужно в переопределенном TmyFrame.Notification
Надо будет обдумать. Спасибо за совет.
...
Рейтинг: 0 / 0
TFrame - как обработать сообщение WM_KEYUP?
    #39459911
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PolesovschiПо ленивому сценарию - у формы есть обработчик сообщения WM_HELP
Можно и так, но не хотелось бы в эту кухню вызова справки каким-либо образом привлекать TForm.
В силу того, что все фреймы наследуются от одного базового класса, достаточно вызов справки
реализовать в базовом фрейме. А так как наследование форм в данном конкретном проекте не
используется, придется для каждого класса форм не забыть про реализацию вызова справки
через обработчик сообщения WM_HELP.

Во фрейме написать подмену WindowProc формы на собственный обработчик WM_HELP - это разве сложно ?
...
Рейтинг: 0 / 0
TFrame - как обработать сообщение WM_KEYUP?
    #39459916
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schiВо фрейме написать подмену WindowProc формы на собственный обработчик WM_HELP - это разве сложно ?
Ну, в принципе, это то же самое, что переопределение у родительской формы обработчика события OnKeyUp.
Только обработчик на событие WM_HELP будет даже логически проще.
...
Рейтинг: 0 / 0
TFrame - как обработать сообщение WM_KEYUP?
    #39459929
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PolesovschiВо фрейме написать подмену WindowProc формы на собственный обработчик WM_HELP - это разве сложно ?
Ну, в принципе, это то же самое, что переопределение у родительской формы обработчика события OnKeyUp.
Только обработчик на событие WM_HELP будет даже логически проще.

Возможно, сообщение WM_HELP придет даже фрейму, как родителю контрола, на котором нажали F1, и у формы ничего не надо будет переопределять.
...
Рейтинг: 0 / 0
TFrame - как обработать сообщение WM_KEYUP?
    #39459978
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PolesovКаким образом можно в наследниках от TFrame обрабатывать сообщения нажатия клавиш?

Открыть для себя сообщения с префиксом CN_
...
Рейтинг: 0 / 0
TFrame - как обработать сообщение WM_KEYUP?
    #39460334
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schiВозможно, сообщение WM_HELP придет даже фрейму, как родителю контрола
Нет, WM_HELP до фрейма не доходит.

Вот примерная реализация в общих чертах:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
var
  FSaveProc : TWndMethod;

procedure TFrame2.Loaded;
var
  frm : TCustomForm;
begin
  inherited Loaded;
  frm := GetParentForm( Self );
  if Assigned( frm ) then
    with frm do
    begin
      FSaveProc := WindowProc;
      WindowProc := FrameProc;
    end;
end;

procedure TFrame2.FrameProc( var Msg : TMessage );
begin
  FSaveProc( Msg );
  if Msg.Msg = WM_HELP then
//  здесь вызов контекстной справки
end;
...
Рейтинг: 0 / 0
TFrame - как обработать сообщение WM_KEYUP?
    #39460338
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PolesovWM_HELP до фрейма не доходит.Проверил. Доходит. D2009.
...
Рейтинг: 0 / 0
TFrame - как обработать сообщение WM_KEYUP?
    #39460340
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соколинский БорисОткрыть для себя сообщения с префиксом CN_Один фиг, что WM, что СN. У самого фрейма нет фокуса. Не получит он их.
...
Рейтинг: 0 / 0
TFrame - как обработать сообщение WM_KEYUP?
    #39460341
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соколинский БорисPolesovКаким образом можно в наследниках от TFrame обрабатывать сообщения нажатия клавиш?

Открыть для себя сообщения с префиксом CN_

Без явного присвоения фрейму фокуса не работает:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
type
  TFrame2 = class(TFrame)
  protected
    procedure CNKeyUp( var Msg : TMessage ); message CN_KEYUP;
  end;

implementation

{$R *.DFM}

procedure TFrame2.CNKeyUp( var Msg : TMessage );
begin
  inherited;
  if Msg.wParam = VK_F1 then
  asm
       Nop  // сюда попадаем только, если на фрейме зажата левая кнопка мыши
  end;
end;



Если явно присваивать фокус фрейму, придется как-то сохранять информацию об ActiveControl родительской формы, а он может быть любого класса.
...
Рейтинг: 0 / 0
TFrame - как обработать сообщение WM_KEYUP?
    #39460345
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barmaley57PolesovWM_HELP до фрейма не доходит.Проверил. Доходит. D2009.
Э-э-э... Если доходит через переопределенную WindowProc, то да.

А если написать у фрейма обработчик
Код: pascal
1.
  procedure WMHelp( var Msg : TMessage ); message WM_HELP;


то в него не попадает.
...
Рейтинг: 0 / 0
TFrame - как обработать сообщение WM_KEYUP?
    #39460347
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Polesovто в него не попадает.Именно так и написал. Попадает.
...
Рейтинг: 0 / 0
TFrame - как обработать сообщение WM_KEYUP?
    #39460350
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barmaley57Polesovто в него не попадает.Именно так и написал. Попадает.Конечно же, если есть какой-то компонент на фрейме в фокусе.
...
Рейтинг: 0 / 0
TFrame - как обработать сообщение WM_KEYUP?
    #39460352
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barmaley57Один фиг, что WM, что СN. У самого фрейма нет фокуса. Не получит он их.
Кстати, если на фрейме зажать левую кнопку мыши и нажать какую-либо клавишу, то CN_KeyDown, CN_KeyUp во фрейм приходят, а WM_ нет.
...
Рейтинг: 0 / 0
TFrame - как обработать сообщение WM_KEYUP?
    #39460354
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barmaley57Barmaley57пропущено...
Именно так и написал. Попадает.Конечно же, если есть какой-то компонент на фрейме в фокусе.
А если фрейм содержит только один TLabel попадает?
Позже попробую.
...
Рейтинг: 0 / 0
TFrame - как обработать сообщение WM_KEYUP?
    #39460355
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще, несколько раз приходилось копаться в исходниках VCL на тему обработки сообщений....это конечно непотребство какое-то! Так из мухи раздуть слона надо постараться)))
...
Рейтинг: 0 / 0
TFrame - как обработать сообщение WM_KEYUP?
    #39460364
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barmaley57....это конечно непотребство какое-то!
А кому шас лехко? :-)
...
Рейтинг: 0 / 0
TFrame - как обработать сообщение WM_KEYUP?
    #39460365
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PolesovА если фрейм содержит только один TLabel попадает?Не конечно. TLabel - не оконный компонент.
...
Рейтинг: 0 / 0
TFrame - как обработать сообщение WM_KEYUP?
    #39460369
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PolesovА кому шас лехко? :-)Так может попробовать вместо фреймов формы. Но это так - шальная мысль))
...
Рейтинг: 0 / 0
TFrame - как обработать сообщение WM_KEYUP?
    #39460378
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И Frame и TForm - оба наследники TScrollingWinControl они оба имеют HWND, поэтому заменять одно другим смысла нет.
Про WM_HELP - почитайте MSDN, что когда и кому приходит.
Вообще, мне кажется, проблема надуманная, достаточно менять HelpType|HelpContext у фрейма в зависимости от того, с каким разделом справки он должен быть ассоциирован по месту. А велосипеды с сообщениями, перехватом нажатия клавиш - это от лукавого.
...
Рейтинг: 0 / 0
TFrame - как обработать сообщение WM_KEYUP?
    #39460380
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barmaley57Так может попробовать вместо фреймов формы.Отставить! У вложенной формы keypreview не работает....
...
Рейтинг: 0 / 0
TFrame - как обработать сообщение WM_KEYUP?
    #39460382
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schiИ Frame и TForm - оба наследники TScrollingWinControl они оба имеют HWNDДа, только бардак в VCL их немного по-разному разбирает.
...
Рейтинг: 0 / 0
TFrame - как обработать сообщение WM_KEYUP?
    #39460413
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barmaley57schiИ Frame и TForm - оба наследники TScrollingWinControl они оба имеют HWNDДа, только бардак в VCL их немного по-разному разбирает.

Бардак - он обычно не в VCL :)
...
Рейтинг: 0 / 0
TFrame - как обработать сообщение WM_KEYUP?
    #39460533
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barmaley57PolesovА если фрейм содержит только один TLabel попадает?Не конечно. TLabel - не оконный компонент.
В том то и заковыка, что возможны фрейм без оконных контролов, а контекстную справку вызывать надо.
...
Рейтинг: 0 / 0
TFrame - как обработать сообщение WM_KEYUP?
    #39460535
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barmaley57PolesovА кому шас лехко? :-)Так может попробовать вместо фреймов формы. Но это так - шальная мысль))
Потребуется приличный объем переделок. Пока решено использовать WM_HELP с подменой WindowProc у ParentForm - это вариант вроде работает.
...
Рейтинг: 0 / 0
TFrame - как обработать сообщение WM_KEYUP?
    #39460537
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schiдостаточно менять HelpType|HelpContext у фрейма в зависимости
Дело в том, что для вызова контекстной справки используется как HelpContext фрейма, там и некая идентификационная строка (
используется chm). Конечно можно в разделе [MAP] ассоциировать строки с идентификаторами, но это тоже кусок работы.
...
Рейтинг: 0 / 0
TFrame - как обработать сообщение WM_KEYUP?
    #39460581
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Polesovschiдостаточно менять HelpType|HelpContext у фрейма в зависимости
Дело в том, что для вызова контекстной справки используется как HelpContext фрейма, там и некая идентификационная строка (
используется chm). Конечно можно в разделе [MAP] ассоциировать строки с идентификаторами, но это тоже кусок работы.

У TControl есть HelpContext, HelpType, HelpKeyword - туда столько всего можно написать, что хватить на все случаи жизни :)
...
Рейтинг: 0 / 0
36 сообщений из 36, показаны все 2 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TFrame - как обработать сообщение WM_KEYUP?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]