Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Работа с клавой


Автор: SAVANE 3.9.2006, 14:37
Когда в пустой форме прописываю процедуру которая обрабатівает нажатие кнопки.
Код

procedure TForm1.FormClick(Sender: TObject);
begin
if kay=#13 then ShowMessage('Нажат Ентер');
end;


То все работает!!!

Когда же помещаю на форму любой обьект: кнопку, поле, и т.д.
уже не перехватівает нажатие!

 smile 

В чем траблы?

Автор: SGTeam 3.9.2006, 15:03
Хм.......А не пробовал в обработчике OnKeyPress помещать свой код?тогда в обработчиках(onkeypress)  других контролов на форме необходимо вызывать Form.OnKeyPress.

Автор: Matematik 3.9.2006, 16:33
Цитата(SGTeam @  3.9.2006,  16:03 Найти цитируемый пост)
тогда в обработчиках(onkeypress)  других контролов на форме необходимо вызывать Form.OnKeyPress.

необязательно, Form.KeyPreview := True ж 

Автор: Lence 3.9.2006, 21:21
можно еще и в 

KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);

Автор: Rodman 3.9.2006, 22:02
Ты слышал про библиотеку JEDI???

Если есть возможность скачай (она бесплатная)....

Там есть компонент JvApplicationHotKey1... хоть на него можно повесить только один набор, но работает всегда... smile 

Автор: Lence 3.9.2006, 22:12
еще есть отдельный компонент HotKeyManager
с ним можно отловить все что хочешь, даже если программа не активна а где-то спрятана.. 

Автор: Alexeis 4.9.2006, 00:45
SAVANE, все очень просто сообщения получает окно с фокусом ввода, если бросить на форму компонент, то он и получит фокус ввода. Проще всего использовать application.onMessage так как через него проходят многие сообщения, но он кажись не получает сообщения посланные postmessage, надо попробовать.

Добавлено @ 00:48 
Работает!
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Edit1: TEdit;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure fmsg(var Msg: TMsg; var Handled: Boolean);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.fmsg(var Msg: TMsg; var Handled: Boolean);
begin
  if Msg.message = WM_KEYDOWN
  then
    ShowMessage('нажата');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnMessage := fmsg;
end;


Автор: Fedia 4.9.2006, 06:24
Rodman, 
alexeis1, если не секрет, то чем 
Код

Form.KeyPreview := True
 не устраивает ?

Автор: SAVANE 4.9.2006, 16:13
Спасибо!!!

Form.KeyPreview := True

 реально то что было нужно.

Автор: Alexeis 4.9.2006, 16:39
Fedia, я и не говорил что не устраивает, просто перехват на уровне приложения еще более глобальный. Я думаю, что хорошо когда есть много рабочих вариантов, тогда можно выбрать тот который устраивает больше. smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)