powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TFrame - как обработать сообщение WM_KEYUP?
25 сообщений из 36, страница 1 из 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
25 сообщений из 36, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TFrame - как обработать сообщение WM_KEYUP?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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