Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.09.03;
Скачать: CL | DM;

Вниз

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

 
ArtemESC ©   (2006-08-10 23:15) [0]

сабж...


 
KilkennyCat ©   (2006-08-10 23:20) [1]

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


 
KilkennyCat ©   (2006-08-10 23:35) [2]

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


 
Gydvin ©   (2006-08-10 23:42) [3]

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:46) [4]

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

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


 
Gydvin ©   (2006-08-10 23:50) [5]

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

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


 
Leonid Troyanovsky ©   (2006-08-11 09:51) [6]


> 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-11 11:05) [7]


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

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


 
alles ©   (2006-08-11 11:06) [8]

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


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

> 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 (а это можно сделать в обработчике OnKeyDown) и изменять его параметры. Ведь позже придёт WM_CHAR, сгенерированное для "старого", неизменённого WM_KEYDOWN, и в edit будет реагировать на "старый" символ, а не на тот, который нам нужен. Перехватывать и изменять нужно именно WM_CHAR, а это можно сделать в обработчике OnKeyPress -- он будет вызван до того, как WM_CHAR пройдёт в стандартную оконную процедуру edit"а.

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

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


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

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

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


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

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


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

А если так, раз уж по другому не получается. Но все же [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 18:22) [13]

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


 
begin...end ©   (2006-08-11 19:39) [14]

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

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


 
Leonid Troyanovsky ©   (2006-08-11 21:30) [15]


> 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.


 
ArtemESC ©   (2006-08-11 21:53) [16]

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


 
Gydvin ©   (2006-08-12 11:42) [17]


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


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


 
Leonid Troyanovsky ©   (2006-08-12 11:57) [18]


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

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


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

--
Regards, LVT.


 
Anatoly Podgoretsky ©   (2006-08-12 14:22) [19]

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



Страницы: 1 вся ветка

Текущий архив: 2006.09.03;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.074 c
2-1155663864
ArtemESC
2006-08-15 21:44
2006.09.03
Нет ли модуля, для работы c Png форматом?


6-1144817098
Попрошайка
2006-04-12 08:44
2006.09.03
Получения параметров IE для прокси


3-1151210776
antoxa2005
2006-06-25 08:46
2006.09.03
Можно ли как-нибудь обратиться к базе Access на дрегом компьютере


4-1147002915
Dstr
2006-05-07 15:55
2006.09.03
ApplicationEvents1Message


15-1154584324
КаПиБаРа
2006-08-03 09:52
2006.09.03
Пенроуз. Новый ум короля