Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как убрать Beep при нажатии Enter при вводе в TEdit?


ArtemESC ©   (2006-08-10 23:15:00) 

сабж...


Anatoly Podgoretsky   (2006-08-12 14:22:00) [1]

И что будем давить все недопустимые символы, лишая пользователя обратной связи?


Leonid Troyanovsky   (2006-08-12 11:57:00) [2]


> Gydvin ©   (12.08.06 11:42) [17]

> Спасибо за объяснения. Это в принципе я знал, просто непонял
> смысл [6] поста


Чего ж непонятного? MessageBeep издается при обработке
"недозволенных" чаров, и, значит, обнулять надо именно их,
т.е. в OnKeyPress.

--
Regards, LVT.


Gydvin   (2006-08-12 11:42:00) [3]


> begin...end ©   (11.08.06 16:10) [9]


Спасибо за объяснения. Это в принципе я знал, просто непонял смысл [6] поста


ArtemESC   (2006-08-11 21:53:00) [4]

Leonid Troyanovsky ©   (11.08.06 21:30) [15]

Просто я в примере begin...end использовал KeyDown, не заметил KeyPress
 
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if Key = #13 then Key:= #0
end


Leonid Troyanovsky   (2006-08-11 21:30:00) [5]


> ArtemESC ©   (11.08.06 17:59) [11]

> begin...end ©   (11.08.06 16:20) [10]
> Не работает...

> DprYg ©   (11.08.06 18:12) [12]
> Спасибо, теперь работает...


Докажи.

Чур, с указанием версии дельфи, windows &etc/.

--
Regards, LVT.


begin...end   (2006-08-11 19:39:00) [6]

> ArtemESC ©   (11.08.06 17:59) [11]

А у меня -- работает.


ArtemESC   (2006-08-11 18:22:00) [7]

DprYg ©   (11.08.06 18:12) [12]
Спасибо, теперь работает...


DprYg   (2006-08-11 18:12:00) [8]

А если так, раз уж по другому не получается. Но все же [10] должно работать
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
  Mgs: TMsg;
begin
  if Key = VK_RETURN then
    PeekMessage(Mgs, 0, WM_CHAR, WM_CHAR, PM_REMOVE);
end;


ArtemESC   (2006-08-11 17:59:00) [9]

begin...end ©   (11.08.06 16:20) [10]
Не работает...


begin...end   (2006-08-11 16:20:00) [10]

Приношу извинения -- я не совсем вник в [3], ведь там речь идёт о создании собственного потомка TEdit. На мой взгляд, для сабжевой задачи это излишне, и вместо этого я бы просто назначил обработчик OnKeyPress у стандартного TEdit (о чём и шла речь в [9]):

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
 if Key = #13 then Key:= #0
end


begin...end   (2006-08-11 16:10:00) [11]

> Gydvin ©   (11.08.06 11:05) [7]

Если пользователь нажимает клавиатурную клавишу в тот момент, когда edit имеет фокус ввода, то в очередь сообщений потока, которому принадлежит окно этого edit'а, ставится сообщение WM_KEYDOWN с соответствующим виртуальным кодом клавиши.

В таком потоке обычно работает цикл, задача которого заключается в выборке сообщений из очереди и передаче их тем окнам, которым они предназначены. Только что выбранное из очереди асинхронное сообщение перед отправкой его нужному окну обычно проходит ещё и через функцию TranslateMessage. Эта функция, получив сообщение WM_KEYDOWN в качестве параметра, проверяет, не соответствует ли код нажатой клавиши какому-нибудь символу (букве, цифре, переводу строки и т.д.), и, если да, генерирует соответствующее сообщение WM_CHAR с кодом символа и ставит его в очередь этого же потока. Это сообщение, конечно, будет выбрано из очереди и отправлено тому же edit'у на одном из следующих проходов цикла.

Таким образом, при нажатии клавиши Enter (которой соответствует символ перевода строки) окно edit'а, имеющее фокус, получит два сообщения: WM_KEYDOWN и соответствующее ему WM_CHAR.

Так вот -- символы в окне edit'а появляются именно в ответ на второе сообщение, т.е. WM_CHAR . Если WM_CHAR придёт с кодом, соответствующим, например, клавишам Enter или Esc, это окно "бибикнет", сигнализируя об "illegal character" -- но тоже именно в ответ на WM_CHAR, а не на WM_KEYDOWN.

Поэтому для того, чтобы заменить код символа , отправляемый edit'у, бесполезно перехватывать пришедшее сообщение WM_KEYDOWN (а это можно сделать в обработчике On KeyDown ) и изменять его параметры. Ведь позже придёт WM_CHAR, сгенерированное для "старого", неизменённого WM_KEYDOWN, и в edit будет реагировать на "старый" символ, а не на тот, который нам нужен. Перехватывать и изменять нужно именно WM_CHAR, а это можно сделать в обработчике On KeyPress -- он будет вызван до того, как WM_CHAR пройдёт в стандартную оконную процедуру edit'а.

И поэтому в Вашем коде [3] можно оставить только обработчик On KeyPress , написав его, например, так:

procedure TMyEdit1.KeyPress(var Key: Char);
begin
 if Key = #13 then Key := #0
end.


alles   (2006-08-11 11:06:00) [12]

в OnKeyPressed пишешь
if Key=#13 then
begin
do something
key:=0;
end


Gydvin   (2006-08-11 11:05:00) [13]


> Leonid Troyanovsky ©   (11.08.06 09:51) [6]

Не очень понял. Можете пояснить более развернуто?


Leonid Troyanovsky   (2006-08-11 09:51:00) [14]


> KilkennyCat ©   (10.08.06 23:46) [4]

> Gydvin ©   (10.08.06 23:50) [5]


Edit Control Default Message Processing
..
WM_CHAR
..
Uses the MessageBeep function for illegal characters.

Illegal - здесь (TEdit) и #13 и #27 и т.д.

--
Regards, LVT.


Gydvin   (2006-08-10 23:50:00) [15]

я тоже думал в дауне.

ЗЫ. Зачем спрашивается тогда я прицепил сюда keydown? )))


KilkennyCat   (2006-08-10 23:46:00) [16]

> [3] Gydvin ©   (10.08.06 23:42)

а разве бип не в дауне срабатывает?


Gydvin   (2006-08-10 23:42:00) [17]

unit MyEdit1;

interface

uses
 SysUtils, Classes, Controls, StdCtrls,dialogs;

type
 TMyEdit1 = class(TEdit)
 private
   { Private declarations }
   StopBeep:boolean;
 protected
   { Protected declarations }
   procedure KeyDown(var Key: Word; Shift: TShiftState); override;
   procedure KeyPress( var Key: Char); override;
 public
   { Public declarations }
 published
   { Published declarations }
 end;

procedure Register;

implementation

procedure TMyEdit1.KeyDown(var Key: Word; Shift: TShiftState);
begin
 inherited;
 StopBeep:=false;
if key = 13 then  StopBeep:=true;

 end;

procedure Register;
begin
 RegisterComponents('Samples', [TMyEdit1]);
end;

procedure TMyEdit1.KeyPress(var Key: Char);
begin
 inherited;
  if StopBeep then key:=#0;
end;

end.


KilkennyCat   (2006-08-10 23:35:00) [18]

а вообще, наверное, создать наследника, где выполнить лишь procedure KeyDown(var Key: Word; Shift: TShiftState); override;


KilkennyCat   (2006-08-10 23:20:00) [19]

А у меня нету...


Наверх

Титульная страница Поиск, карта сайта Написать письмо