Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 087

/ вопрос открыт /

Приветствую, уважаемые эксперты!
У меня вот такой совершенно глупый вопрос:
Как задать порядок перехода по кнопкам формы (или другим элементам) при нажатии на клавишу "Tab"?

Smogg Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: 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

Smogg (статус: Посетитель), 14 августа 2009, 17:36 [#1]:

;) Лишь после отправки вопроса увидел свойство "TabOrder" (;

Тогда вопрос задам по другому:
Можно ли задать несколько групп элементов, чтобы передача фокуса по клавише "Tab" происходила только среди элементов отдельной группы?
Вадим К

Вадим К (статус: Академик), 14 августа 2009, 18:43 [#2]:

только в приделах одной группы, или групп может быть несколько? и в каждой свой порядок?
Галочка "подтверждения прочтения" - вселенское зло.
min@y™

min@y™ (статус: Доктор наук), 14 августа 2009, 19:17 [#3]:

Группы будут, если ты положишь контролы на контролы.
У них тоже в меню есть пункт Tab Order.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Smogg

Smogg (статус: Посетитель), 14 августа 2009, 21:47 [#4]:

Да, групп - несколько, но в пределах одной группы свой порядок..

Что такое "контролы"? И как они на инглише зовутся?
Вадим К

Вадим К (статус: Академик), 14 августа 2009, 23:45 [#5]:

Контролы обычно синоним визуальные компоненты. То есть кнопка - контрол, а вот таймер - нет.
По поводу "в пределах одной группы". То есть, есть несколько групп компонент, если оставить курсор ввода в одной, то нажимая tab, мы прыгаем по кругу в них, а перейдя мышкой в другую группу, будем там бегать. Я правильно описал желаемое поведение?
Если да, скажу, что это реально сделать, но с точки пользовательского интерфейса - это плохо.
Галочка "подтверждения прочтения" - вселенское зло.
Smogg

Smogg (статус: Посетитель), 15 августа 2009, 01:10 [#6]:

Про контролы понял, что имеется в виду.

Да, курсор именно так и должен бегать, как описали) С точки зрения пользовательского интерфейса - я делаю программки исключительно для себя, так что извращаюсь как хочу и умею.

Попробовал последовать совету.
Положил я пару кнопок на один GroupBox, другую пару - на другой GroupBox. Получилось, что курсор прекрасно бегает по всем четырем кнопкам сразу. При том, что в Object Tree View под каждым GroupBox'oм висит по своей паре кнопок. Предложенный способ не работает.
Smogg

Smogg (статус: Посетитель), 15 августа 2009, 16:05 [#7]:

Спасибо, Вадим К, за такой полный ответ!
Все теперь работает как надо!

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 16:49
Выполнено за 0.03 сек.