|
Вопрос # 3 087/ вопрос открыт / |
|
Приветствую, уважаемые эксперты!
У меня вот такой совершенно глупый вопрос:
Как задать порядок перехода по кнопкам формы (или другим элементам) при нажатии на клавишу "Tab"?
 |
Вопрос задал: Smogg (статус: Посетитель)
Вопрос отправлен: 14 августа 2009, 17:28
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: Вадим К
Здравствуйте, Smogg!
Можно, можно сделать любой вариант. Для этого надо прописать правильный обработчик OnKeyDown для тех элементов, которые должны участвовать в переборе. Но вот незадача - клавиша tab обрабатывается на уровень выше и до нужного нам обработчика просто не доходит. Что ж, для начала его надо отключить. Это делается так. В приватную часть описания формы добавляем такое (это после слова private)
procedure CMDialogKey( var msg: TCMDialogKey ); message CM_DIALOGKEY;
теперь жмём Ctrl+Shift+C и в созданный обработчик дописываем код
procedure TForm1.CMDialogKey(var msg: TCMDialogKey);
begin
if msg.Charcode <> VK_TAB then
inherited;
end;
Всё, магия завершилась, теперь начинается рутина.
Для всех элементов, которые будут участвовать в переборе, создаем обработчик OnKeyDown, куда вписываем код вида
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key = VK_TAB then
Edit2.SetFocus;
end;
То есть, если в первом едите нажали таб, то надо перейти в второй.
И так дальше.
В принципе, никто не запрещает сделать "умные переходы". Например такое
procedure TForm1.Edit2KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key = VK_TAB then begin
if length(Edit2.Text) = 4 then
Edit1.SetFocus
else
Edit3.SetFocus;
end;
end;
В таком случе если длина текста в втором едите равна 4, то переход будет в первый едит, а если нет, то в третий. Чуть желания и по табу будет бегать как по лабиринту:)
 |
Ответ отправил: Вадим К (статус: Академик)
Время отправки: 15 августа 2009, 03:04
Оценка за ответ: 5
|
Мини-форум вопроса
Всего сообщений: 7; последнее сообщение — 15 августа 2009, 16:05; участников в обсуждении: 3.
|
Smogg (статус: Посетитель), 14 августа 2009, 17:36 [#1]:
Лишь после отправки вопроса увидел свойство "TabOrder" (;
Тогда вопрос задам по другому:
Можно ли задать несколько групп элементов, чтобы передача фокуса по клавише "Tab" происходила только среди элементов отдельной группы?
|
|
Вадим К (статус: Академик), 14 августа 2009, 18:43 [#2]:
только в приделах одной группы, или групп может быть несколько? и в каждой свой порядок?
Галочка "подтверждения прочтения" - вселенское зло.
|
|
min@y™ (статус: Доктор наук), 14 августа 2009, 19:17 [#3]:
Группы будут, если ты положишь контролы на контролы.
У них тоже в меню есть пункт Tab Order.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Smogg (статус: Посетитель), 14 августа 2009, 21:47 [#4]:
Да, групп - несколько, но в пределах одной группы свой порядок..
Что такое "контролы"? И как они на инглише зовутся?
|
|
Вадим К (статус: Академик), 14 августа 2009, 23:45 [#5]:
Контролы обычно синоним визуальные компоненты. То есть кнопка - контрол, а вот таймер - нет.
По поводу "в пределах одной группы". То есть, есть несколько групп компонент, если оставить курсор ввода в одной, то нажимая tab, мы прыгаем по кругу в них, а перейдя мышкой в другую группу, будем там бегать. Я правильно описал желаемое поведение?
Если да, скажу, что это реально сделать, но с точки пользовательского интерфейса - это плохо.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Smogg (статус: Посетитель), 15 августа 2009, 01:10 [#6]:
Про контролы понял, что имеется в виду.
Да, курсор именно так и должен бегать, как описали) С точки зрения пользовательского интерфейса - я делаю программки исключительно для себя, так что извращаюсь как хочу и умею.
Попробовал последовать совету.
Положил я пару кнопок на один GroupBox, другую пару - на другой GroupBox. Получилось, что курсор прекрасно бегает по всем четырем кнопкам сразу. При том, что в Object Tree View под каждым GroupBox'oм висит по своей паре кнопок. Предложенный способ не работает.
|
|
Smogg (статус: Посетитель), 15 августа 2009, 16:05 [#7]:
Спасибо, Вадим К, за такой полный ответ!
Все теперь работает как надо!
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|