Форум: "Начинающим";
Текущий архив: 2006.09.03;
Скачать: [xml.tar.bz2];
ВнизКак убрать 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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.042 c