Порядок табуляции в консольном приложении с одной формой VCL

У меня есть консольное приложение для Windows, созданное с помощью Embarcadero XE 6 (фактически преобразованное из проекта Borland C ++ Builder5). Он имеет единую форму с несколькими кнопками и элементами управления. Все эти элементы управления установили TabStop = True и соответствующие TabOrder's. Однако нажатие Tab во время выполнения, когда форма отображается, ничего не делает (просто издает звук, когда курсор / фокус находится в элементе управления Edit, и ничего не делает, когда кнопка находится в фокусе).

Я читал в документах, что порядок табуляции не будет работать, если не установлен родительский элемент формы. Однако это единственная форма VCL (другие окна - это консоль и окно GLUT), поэтому нет никакого родительского AFAIK VCL. Я пытался установить

Parent=Application->MainForm;

в конструкторе формы, но Application->MainForm также NULL. Любые идеи?


person dolphin    schedule 04.10.2014    source источник
comment
У вас есть цикл сообщений?   -  person David Heffernan    schedule 05.10.2014
comment
У меня нет собственного цикла сообщений. Форму создаю следующим образом: MyForm = new TMyForm (Application); MyForm- ›Показать (); и это все. У меня также есть обработчики для кнопок ОК и Отмена, которые делают все, что мне нужно.   -  person dolphin    schedule 05.10.2014
comment
Где вы взяли копию Borland XE6? Borland продала Delphi несколько лет назад, и в настоящее время не существует. Если у вас есть копия Borland XE6, вероятно, она стоит достаточно денег, чтобы вам больше не приходилось писать код. :-)   -  person Ken White    schedule 05.10.2014
comment
@KenWhite Действительно, версии XE продаются Embarcadero, но они не сильно изменились по сравнению с Borland C ++ Builder 5 1999 года :-)   -  person dolphin    schedule 05.10.2014
comment
@dolphin: Delphi и C ++ Builder кардинально изменились с 1999 года. Новая IDE, новый RTL / VCL, новые языковые функции, новые компиляторы.   -  person Remy Lebeau    schedule 05.10.2014
comment
@RemyLebeau Да, я читал об этом :-) Я интенсивно использую компиляторы Borland, начиная с версии Builder 3 (VCL и более ранние версии OWL с Borland C ++ 3.0). Вчера я портировал несколько больших и сложных проектов с BCB5 на XE6, и помимо необходимости переходить на unicode / широкую строку, перекомпилировать библиотеки DLL, много ручных исправлений в преобразованных файлах проекта (bpr- ›cbproj) и несколько настроек в Графический интерфейс (в основном потому, что теперь мне нужна высокая осведомленность о точках на дюйм), все работает и выглядит так же, как и в 1999 году. Это высокая обратная совместимость, отлично!   -  person dolphin    schedule 05.10.2014


Ответы (1)


Ваша проблема в том, что у вас нет цикла сообщений. Это связано с тем, что консольные приложения не должны иметь окон и по умолчанию не имеют циклов обработки сообщений.

Вы можете запустить цикл сообщений, позвонив:

Application->Run();

Однако это, вероятно, остановит правильную работу консольной части вашего приложения. Как ваш основной поток может синхронно обслуживать консоль и асинхронный цикл сообщений графического интерфейса пользователя одновременно?

Я подозреваю, что вам нужно будет более серьезно переосмыслить дизайн вашего приложения.


Что касается вашего обновления, похоже, что у вас есть цикл сообщений, но это цикл сообщений для инфраструктуры GLUT. Инфраструктура VCL требует, чтобы его цикл сообщений обрабатывал диалоговые сообщения, такие как нажатия клавиш TAB.

Вполне вероятно, что выполнение цикла сообщений VCL вместо цикла сообщений GLUT даст лучшие результаты. Но вполне вероятно, что это просто сломает часть GLUT приложения.

Попытка запустить две несовместимые среды графического интерфейса пользователя из одного цикла обработки сообщений является трудной задачей. Вероятно, здесь нет быстрого решения. Вам нужно копать глубже. Возможно, было бы лучше отказаться от VCL и придерживаться единой структуры графического интерфейса.

person David Heffernan    schedule 04.10.2014
comment
Это приложение GLUT (обновил мой вопрос), которое должно открывать форму VCL, когда происходит какое-то событие (и это так, все работает хорошо, кроме вкладок). Даже всплывающие подсказки появляются при наведении курсора на элементы управления. Я добавил Приложение- ›Выполнить (); после MyForm- ›Show (); но это ничего не изменило ... - person dolphin; 05.10.2014
comment
Ага. Это важная деталь. Не похоже, что у вас действительно есть консольное приложение. Похоже, у вас перенасыщенное GUI-приложение с окном консоли сбоку. Возможно через AllocConsole. Но ваш цикл сообщений о перенасыщении не знает о vcl. - person David Heffernan; 05.10.2014
comment
Это проект консольного приложения, и его точка входа - main (int, char **). Действительно, цикл сообщений о перенасыщении не вызывает обработку сообщений vcl. Странно, что все остальное, включая всплывающие подсказки, работает! [Я подтвердил, что та же форма в обычном приложении vcl правильно обрабатывает вкладку.] - person dolphin; 05.10.2014
comment
Что ж, это действительно так, как я сказал. Вам нужна помощь из цикла сообщений VCL, но он не работает. - person David Heffernan; 06.10.2014