Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1155197903
worldmen
2006-08-10 12:18
2006.09.03
Стандарты "MiniDV" и "DVD" и их отличия. Цифровые камеры.


15-1155287138
flad
2006-08-11 13:05
2006.09.03
Читать тексты(книги)на ДВД-проигрывателе?


2-1155263684
HoT@biCH
2006-08-11 06:34
2006.09.03
Вывод интернет денег


15-1155328754
GeLLeR
2006-08-12 00:39
2006.09.03
4-4-2


2-1155580796
begin
2006-08-14 22:39
2006.09.03
вопрос по графике





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский