Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Компоненты и классы
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 07.04.2014, 20:26
Аватар для Помидоркин
Помидоркин Помидоркин вне форума
Начинающий
 
Регистрация: 07.10.2012
Адрес: Дедовск
Сообщения: 110
Версия Delphi: Rio 10.3
Репутация: 10
По умолчанию class(TCustomControl) не работает KeyDown

Собсвенно сабж
Код:
  type
   TBaseGrid = class(TCustomControl)
          ..........
   protected
    procedure Paint; override;
    procedure Click; override;
    procedure KeyDown(var Key: Word; Shift: TShiftState); override;
         ...........
  end;

procedure TBaseGrid.KeyDown(var Key: Word; Shift: TShiftState);
begin inherited KeyDown(Key, Shift);
 if Key = VK_RETURN then ShowMessage('Попал');
{case Key of
  VK_:  SetEdt(Edt.EdtRow,Edt.EdtCol+1);
  VK_RIGHT: SetEdt(Edt.EdtRow,Edt.EdtCol+1);
end;                                                   }

end;
Click работает, Form1.KeyPreview:= True; не помогает
полагаю нужна еще иформация, но незнаю какая, не выкладывать же весь проект
Ответить с цитированием
  #2  
Старый 07.04.2014, 23:41
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Помидоркин
class(TCustomControl) не работает KeyDown
Должно работать. Возможно у тебя элемент управления не получает фокуса ввода по щелчку мыши. Нужно делать примерно так:
Код:
 type
   TBaseGrid = class(TCustomControl)
.....
   protected
    procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
.....
  end;
.....
procedure TBaseGrid.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  inherited;
  if CanFocus then SetFocus;
end;
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
Помидоркин (08.04.2014)
  #3  
Старый 08.04.2014, 17:23
Аватар для Помидоркин
Помидоркин Помидоркин вне форума
Начинающий
 
Регистрация: 07.10.2012
Адрес: Дедовск
Сообщения: 110
Версия Delphi: Rio 10.3
Репутация: 10
По умолчанию

Цитата:
Сообщение от poli-smen
...элемент управления не получает фокуса ввода...
Так и есть, огромное спасибо
Ответить с цитированием
  #4  
Старый 08.04.2014, 18:40
Аватар для Помидоркин
Помидоркин Помидоркин вне форума
Начинающий
 
Регистрация: 07.10.2012
Адрес: Дедовск
Сообщения: 110
Версия Delphi: Rio 10.3
Репутация: 10
По умолчанию

Нет, не работает.
Код:
procedure TBaseGrid.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
- Нужен, фокуса действительно небыло. А вот VK_DOWN не работает, VK_SPACE, VK_RETURN работает, а стрелка вниз нет.
Код:
procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
 if Key = VK_DOWN then ShowMessage('Попал');
end;
Попробовал со стандарным компонентом - все отлично.
Возможно это важно: TBaseGrid описан в другом юните.
Выяснилось: VK_DOWN, VK_RIGHT (т.е. клавиши со стрелками) переводят фокус между элементами.
Нашел вот такую штуку
Код:
Procedure tMessages ( Var Msg : tMsg; Var Handled : Boolean );
Begin
If ( Msg.Message = WM_KeyDown ) And
( Msg.wParam In [VK_UP, VK_DOWN, VK_LEFT, VK_RIGHT] ) Then
Begin
Case Msg.wParam Of
VK_UP    : ShowMessage ( 'Нажата стрелка вверх' );
VK_DOWN  : ShowMessage ( 'Нажата стрелка вниз' );
VK_LEFT  : ShowMessage ( 'Нажата стрелка влево' );
VK_RIGHT : ShowMessage ( 'Нажата стрелка вправо' );
End;
Handled := True;
End;
End;

procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnMessage := HandleMessages;
end;
но как это прикрутить к собственному классу описанному в отдельном юните
я даже не уверен, что это то что нужно

Последний раз редактировалось Помидоркин, 08.04.2014 в 19:08.
Ответить с цитированием
  #5  
Старый 09.04.2014, 00:08
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Помидоркин
Нет, не работает.
Код:
procedure TBaseGrid.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
- Нужен, фокуса действительно небыло. А вот VK_DOWN не работает, VK_SPACE, VK_RETURN работает, а стрелка вниз нет.
Стрелки перехватываются в процессе обработки очереди сообщений и обрабатываются как команды перемещения фокуса ввода между элементами управления.
Чтобы этого не происходило нужно отлавливать сообщение WM_GETDLGCODE:
Код:
type
  TBaseGrid = class(TCustomControl)
.....
  protected
    procedure WMGetDlgCode(var Msg: TWMGetDlgCode); message WM_GETDLGCODE;  
.....
  end;
.....
procedure TBaseGrid.WMGetDlgCode(var Msg: TWMGetDlgCode);
begin
  Msg.Result := DLGC_WANTARROWS;
end;
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
Помидоркин (09.04.2014)
  #6  
Старый 09.04.2014, 17:05
Аватар для Помидоркин
Помидоркин Помидоркин вне форума
Начинающий
 
Регистрация: 07.10.2012
Адрес: Дедовск
Сообщения: 110
Версия Delphi: Rio 10.3
Репутация: 10
По умолчанию

Цитата:
Сообщение от poli-smen
Код:
.....
    procedure WMGetDlgCode(var Msg: TWMGetDlgCode); message 
.....
Да все работает, спасибо
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 22:48.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter