Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.02.03;
Скачать: [xml.tar.bz2];

Вниз

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

 
Странный   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.008 c
7-5285
cutter-pro
2002-11-19 15:28
2003.02.03
ЧЕРНЫЙ ЭКРАН СМЕРТИ :(


7-5296
Chameleon
2002-11-17 09:31
2003.02.03
Старая тема: Определение серийного номера HDD!!!


1-4876
Иксик
2003-01-24 15:17
2003.02.03
Enumwindows


14-5137
Yury
2003-01-17 13:30
2003.02.03
???


14-5250
???
2003-01-16 16:07
2003.02.03
String





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский