Форум: "Основная";
Текущий архив: 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