Хобрук: Ваш путь к мастерству в программировании

Передача клавиш со стрелками и табуляцией в форму Delphi в DLL

Когда форма Delphi объявляется и создается внутри библиотеки DLL и библиотеки DLL, загруженной хост-приложением, клавиши со стрелками и табуляцией не передаются через границу хоста / DLL. Это означает, что блоки TEdit и элементы управления TMemo, которые могут использоваться в форме, не будут реагировать на эти нажатия клавиш. Есть ли способ гарантировать, что эти нажатия клавиш передаются из основной формы приложения в форму в dll? Обратите внимание, что может быть несколько DLL, каждая из которых содержит форму. KeyPreview не имеет значения.

27.09.2011

Ответы:


1

Формы в DLL лишены этой поддержки, а также поддержки ярлыков (действий) меню. Вы можете написать код для имитации этого поведения.

////////////////////////////////////////////////////////////////
// If you display a form from inside a DLL/COM server, you will miss
// the automatic navigation between the controls with the "TAB" key.
// The "KeyPreview" property of the form has to be set to "True".
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
var
  bShift: Boolean;
begin
  // Check for tab key and switch focus to next or previous control.
  // Handle this in the KeyPress event, to avoid a messagebeep.
  if (Ord(Key) = VK_TAB) then
  begin
    bShift := Hi(GetKeyState(VK_SHIFT)) <> 0;
    SelectNext(ActiveControl, not(bShift), True);
    Key := #0; // mark as handled
  end;
end;
27.09.2011
  • как насчет клавиш со стрелками и других клавиш навигации? 27.09.2011
  • @ Дэвид Хеффернан - клавиши со стрелками должны работать, когда они используются внутри элемента управления, хотя обычно они не используются для навигации между элементами управления. Ярлыки действий и меню могут быть реализованы аналогичным образом, я могу предоставить ссылку, если кому-то нужен пример. 27.09.2011
  • стрелки часто используются для навигации между элементами управления. Конечно, лучше всего использовать одиночный VCL. 27.09.2011
  • Для навигации можно использовать клавиши со стрелками, но тогда вам придется писать код самостоятельно (это не стандартное поведение Windows). Тот же код, который вы написали, чтобы поймать клавишу со стрелкой, должен работать в dll. 27.09.2011
  • Нет, стрелки очень стандартные. VCL реализует навигацию по клавишам со стрелками. 27.09.2011
  • @ Дэвид Хеффернан - Я не уверен, что вы имеете в виду, когда я создаю форму в Delphi 2010, я не могу перемещаться между элементами управления с помощью клавиш со стрелками. Что касается единственного VCL, это, вероятно, самое простое решение, но иногда вы не можете этого сделать, потому что вы используете COM или вызывающий объект не является приложением Delphi. 27.09.2011
  • Попробуйте добавить к форме несколько переключателей и используйте клавиши со стрелками для навигации между ними. 27.09.2011
  • Ну, я вижу, это зависит от элемента управления, использует ли он клавишу со стрелкой для себя или для навигации. Должна быть возможность получить нажатия клавиш со стрелками в событии KeyUp. 27.09.2011
  • Большая проблема с этим подходом заключается в том, что вы навязываете работу каждому автору плагина. Хороший фреймворк для плагинов этого не требует. 27.09.2011
  • Верно, но что делать, если у вас нет выбора? Пакет можно использовать только в том случае, если хост-приложение также написано на Delphi. Другие языки и COM исключены. 27.09.2011
  • давайте продолжим обсуждение в чате 27.09.2011
  • Выход состоит в том, чтобы предоставить подключаемым модулям основу для создания графического интерфейса пользователя, но при этом обеспечить выполнение создания графического интерфейса в главном приложении и, таким образом, подхватить VCL хоста. Чтобы быть уверенным, нужно еще поработать. 27.09.2011
  • Спасибо за комментарии, похоже, нетривиальная проблема. Я изучу возможное предлагаемое решение и вернусь с ответом, работает ли оно со стрелками, особенно с элементами управления tedit и tmemo, что является моей самой большой проблемой. Если все это не удается, то его пакеты. 27.09.2011

  • 2

    Глядя на этот вопрос и на ваш предыдущий, я бы сказал, что ваша основная проблема в том, что вы не используете пакеты времени выполнения.

    Если бы вы использовали пакеты времени выполнения, у вас был бы единственный экземпляр VCL, и границы модуля не имели бы значения.

    Без пакетов времени выполнения у вас есть отдельные экземпляры VCL. Для правильной работы навигации по форме VCL необходимо, чтобы каждый элемент управления распознавался как элемент управления VCL. Это невозможно, если у вас несколько экземпляров VCL.

    27.09.2011
  • Это то, что я рассмотрел и могу рассмотреть еще раз. Меня беспокоит только то, что пакеты придется перекомпилировать, если мы обновимся до новой версии Delphi. 27.09.2011
  • Новые материалы

    Как ИИ меняет сельское хозяйство
    Прочтите Статью Кэтлин Уолч в Forbes о том, как ИИ меняет сельское хозяйство . Сельское хозяйство и земледелие - одна из древнейших и важнейших профессий в мире. Человечество прошло долгий..

    Slack: проектирование современных интерфейсов человека и ИИ
    Когда Стюарт Баттерфилд выделил Slack из быстро исчезающей онлайн-игры Tiny Speck, его перспективы были в лучшем случае неопределенными. Существовал очевидный спрос на средства связи на рабочем..

    HTTP1.1 против HTTP2
    Http расшифровывается как HyperText Transfer Protocol, это в основном метод, который компьютеры и серверы используют для запроса и отправки информации. HTTP1.1 - это более старая версия Http, а..

    Радость вырезания
    Радость фрагментов По какой-то причине, когда я начал программировать в колледже, я активно сопротивлялся целому ряду земных благ, которые сделали бы мою жизнь чуточку удобнее. Я в основном..

    Создайте стройный слайдер с нуля без каких-либо внешних инструментов
    Слишком долго я полагался на сторонние плагины и инструменты для простых слайдеров. Пока в один прекрасный день в моей крошечной голове не загорелась лампочка, которую я могу сделать..

    Буферы протоколов, часть 01: соглашения об именах и файловая организация
    Если вам нравится читать статьи на Medium и вы заинтересованы в том, чтобы стать участником, я буду рад поделиться с вами своей реферальной ссылкой!

    Наши партнеры
    Globex SCI — уникальная система, которая хранит и позволяет использовать большие базы данных, опубликованные в блокчейне. Используя алгоритмы глубокого обучения и ИИ, мы можем прогнозировать..