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

Передача клавиш со стрелками и табуляцией в форму 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
  • Новые материалы

    Изучите Vue перед React. Вот почему
    Сегодняшняя сеть представляет собой запутанный беспорядок из разных языков, библиотек и фреймворков, и начинающие веб-разработчики часто не могут понять, что изучать в первую очередь. Что вы..

    Гл.31 — Помощь слабослышащим с помощью возможностей машинного обучения Apple Watch.
    1 500 000 000  – количество людей с потерей слуха в мире. Это почти 20% населения Земли! (источник: who.int ) Недавно я экспериментировал с Apple Sound Classification API, и результаты на..

    Машинное обучение без кода / Глубокое обучение Каждый специалист по обработке и анализу данных должен знать
    Akkio, Очевидно.ай, DataRobot, Левити, Clarifai, Teachable Machines, Lobe, Pimer, DynaBench, APAflow Teachable Machine- https://teachablemachine.withgoogle.com/ Vertex AI..

    Код, который работает вместе, остается вместе
    Первоначально это было опубликовано в tiagojdf . Когда я только начинал как младший программист, я всегда терялся, глядя на внутренний код. Я предположил, что отчасти это было из-за того,..

    Эта модель Google сочетает в себе рассуждение и действие в рамках одной языковой модели.
    ReAct предоставляет архитектуру, которая инициирует действия на основе путей рассуждений языка. Недавно я запустил образовательный информационный бюллетень, посвященный ИИ, у которого уже..

    Сортировка структур JSON по нескольким полям в JavaScript
    Array.sort() не для слабонервных. Особенно, когда речь идет о сортировке сложных структур данных. Большинство руководств по JavaScript дают только краткое введение в Array.sort() . Обычно..

    Иллюзии разработки программного обеспечения
    Многие вещи не то, чем кажутся Реальность — это всего лишь иллюзия, хотя и очень настойчивая. Альберт Эйнштейн Разработка программного обеспечения никогда не бывает такой, какой кажется...