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

Вниз

Как подменить событие при нажатии на клавишу в форме?   Найти похожие ветки 

 
Странный   (2003-01-23 20:04) [0]

Добрый день (утро, вечер, ночь, etc.)
Подскажите пожалуйста ответ на вопрос:
У меня есть форма, на ней два десятка полей типа TEdit, ComboBox, etc. При нажатии на клавишу [TAB] курсор перескакивает на следующее поле согласно TabOrder. Как мне сделать так, чтобы то же самое происходило при нажатии на клавишу [ENTER] в поле?
Пытался подменить код клавиши на KeyDown (KeyPress, KeyUp) вместо [ENTER] на [TAB], но это не помогает. Помогите плз...
Заранее спасибо.


 
leonon   (2003-01-23 20:25) [1]

procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
case Key of
13 : FindNextControl(Sender as TWinControl, True, True, False).SetFocus;
end;
end;


 
Stager   (2003-01-23 20:25) [2]

Простейший вариант - пришете обработчики события OnKeyPress для каждого визуального компонента (TEdit, ComboBox, etc.) Каждый выполняет метод SetFocus следующего в вашем списке компонента.

Вариант чуть сложнее - то же самое, только пишете один обработчик и проставляете его для всех. На входе анализируете, от кого поступило сообщение, выясняете его TabOrder, находите на форме компонент со следующим по счету TabOrder"ом (помогут свойства TForm.ComponentCount и TForm.Components) и делаете ему тот же самый SetFocus.

Вариант последний. Устанавливаете форме свойство KeyPreview = True; Пишете обработчик OnKeyDown, который условно (для Key = 13) переводит фокус на нужный компонент.


 
Stager   (2003-01-23 20:34) [3]

2 leonon

Согласен. Такой фичи (FindNextControl) я не знал. Но прописывать событие KeyDown для каждого компонента все же недешево. Лучше будет, воспользовавшись свойством TForm.KeyPreview = True, сделать универсальную процедуру:

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if Key = 13 then
FindNextControl(TWinControl(ActiveControl), True, True, False).SetFocus;
end;


 
leonon   (2003-01-23 20:36) [4]

Согласен, но если последний компонент кнопка ОК а нажатие Enter не приведет к ее активизации!?


 
Странный   (2003-01-23 20:42) [5]

2 leonon:

Большое спасибо, все заработало на "Ура", именно то, что я и хотел! Но, есть маленькое но: (косметическое так сказать) :)

Можно ли убрать характерный "Биип" при нажатии на кнопу [ENTER] когда осуществляется переход? (При [TAB] звука нет).

2 Stager:
К варианту 1 я пришел сразу же, минутой позже - к варианту 2, его и осуществил, но: Меня не устраивал тот факт, что в этом случае приходится "TabOrder" описывать программно, т. е. у меня получился код типа:

procedure OnKey (Sender: TObject; var Key: Word; Shift: TShiftState);
begin
If Key = 13 Then
Begin
If Form1.ActiveControl = Edit1 Then
Form1.Edit2.SetFocus;
Else If Form1.ActiveControl = Edit2 Then
Form1.Edit3.SetFocus;
Else If Form1.ActiveControl = Edit3 Then
Form1.Edit4.SetFocus;
...
...
Else If Form1.ActiveControl = Edit?? Then
Form1.Edit??.SetFocus; // Зацикливаем
end;

И таких строк на два-три экрана. А если я меняю положение Edit"ов? Все переписывать. Мне нужен был вариант, который пользовался бы стандартным TabOrder, определенным в форме. Предыдущий пример это именно то, что мне нужно :)
Но все равно, спасибо за содействие :))

ЗЫ! Быть может я неправильно Вас понял...


 
leonon   (2003-01-23 20:48) [6]

Бип - возникает для полей типа TEdit. Просто возьми и исключи код 13 из рассмотрения:

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


 
Странный   (2003-01-23 20:54) [7]

2 lenon:
Спасибо, все работает. :))
Последний вопрос был глупый: мог бы и сам догадаться :))

2 RASTOMAN_ADIDAS:
ИМХО гораздо проще добавить код из трех строк в программу. А если вдруг я отдам исходник кому-то другому? Ему тоже придется юнит перекомпилировать?


 
asd   (2003-01-23 21:56) [8]

procedure TfmMane.ed_bKeyPress(Sender: TObject; var Key: Char);
begin
if not(key in ["0".."9",DECIMALSEPARATOR,Chr(VK_BACK),Chr(VK_RETURN),
".",".","."]) then key:=#0;
if (key=".")or(key=".")or(key=".") then key:=DECIMALSEPARATOR;
If Key = #13 Then
Begin
SelectNext(Sender as tWinControl, True, True );
Key := #0;
end;
end;


 
asd   (2003-01-23 21:57) [9]

procedure TfmMane.ed_bKeyPress(Sender: TObject; var Key: Char);
begin
if not(key in ["0".."9",DECIMALSEPARATOR,Chr(VK_BACK),Chr(VK_RETURN),
".",".","."]) then key:=#0;
if (key=".")or(key=".")or(key=".") then key:=DECIMALSEPARATOR;
If Key = #13 Then
Begin
SelectNext(Sender as tWinControl, True, True );
Key := #0;
end;
end;



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

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

Наверх




Память: 0.49 MB
Время: 0.013 c
14-5263
smok_er
2003-01-16 17:13
2003.02.03
Система автоматического апдейта


1-4895
SeNtiMeL
2003-01-24 18:53
2003.02.03
Прорисовка картинок в ListView !!!!!!!!


1-4919
Armageddon
2003-01-25 00:35
2003.02.03
Как програмно добавить символ с определенным кодом в Richedit(нап


7-5282
Romeo
2002-11-22 10:23
2003.02.03
Ребята кто-нибудь писал Gina.


1-4928
Tahion
2003-01-13 09:22
2003.02.03
ХР кнопки