Конференция "Основная" » Как сделать не модальное окно при ShowModal?
 
  • Mik © (29.12.16 16:50) [0]
    Есть относительно стандартное Delphi XE приложение (VCL). В нем некоторые формы вызываются через .ShowModal

    Для клиентов с тач экранами сделали виртуальную клавиатуру на основе компонента TTouchKeyboard. Форма без заголовка, на всю поверхность которой растянут TTouchKeyboard. Форма плавает поверх всех окон, по определенным причинам виртуальную клавиатуру windows использовать нельзя, нужно свою.

    НО! Если какую-то форму вызвать через .ShowModal, то рядом плавающая виртуальная клавиатура перестает работать.  Кнопки не нажимаются, события не приходят.

    Известно, что ShowModal инициализирует свой цикл выборки сообщений, отличный от Application.Run. Но не могу разобраться, почему форме с клавиатурой не приходит никаких сообщений? В этом новом цикле выборки сообщений нет никаких сообщений, адресованных окну с клавиатурой, по какой причине? Не понимаю.
    Я планировал как-то прокидывать через Application.OnMessage может быть сообщения или типа того, но Windows, видимо, просто не посылает сообщения любым окнам приложения, кроме модального. Почему? Как обойти?
  • Dimka Maslov © (29.12.16 19:15) [1]
    Можно сделать виртуальную клавиатуру модальным окном и посылать сообщения в другие окна.
  • Mik © (29.12.16 22:33) [2]
    вызвать окно клавиатуры через .ShowModal?

    А что толку, ведь если вызвать потом любое другое окно через еще один .ShowModal, то опять же окно клавиатуры заблокируется. К тому же в этом подходе мы заблокируем главное окно приложения сразу в виду показа клавиатуры в модальном режиме.
  • Dimka Maslov © (30.12.16 10:22) [3]
    А что если показывать виртуальную клавиатуру не постоянно, а когда она действительно нужна? Или сделать виртуальную клавиатуру отдельным процессом?
  • Германн © (03.01.17 02:58) [4]

    > Mik ©   (29.12.16 22:33) [2]
    >
    > вызвать окно клавиатуры через .ShowModal?
    >
    > А что толку, ведь если вызвать потом любое другое окно через
    > еще один .ShowModal, то опять же окно клавиатуры заблокируется.
    >  К тому же в этом подходе мы заблокируем главное окно приложения
    > сразу в виду показа клавиатуры в модальном режиме.

    Эх, где мои надцать лет?
    Когда я работал с TouchSreen'ами. Уже и исходников никаких не осталось.
    Одно только возникает в памяти. Модальность может быть разной! AppModal или SysModal.
  • Dimka Maslov © (03.01.17 12:12) [5]

    > Модальность может быть разной! AppModal или SysModal.


    Возможность создавать системно-модальные окна была ликвидирована, если я не ошибаюсь, вместе с Windows 3.11?
  • KSergey © (04.01.17 16:08) [6]
    1. Размещать компонент вирт. клавиатуры на модальной форме.
    Интерфейсно не прикольно, но можно обыграть так, что "пользователь и не заметит".

    2. Найти в VCL код ShowModal. Он в общем-то простой и явно написанный, из него видно, как эта модальность сделана, какие сообщения отбрасываются, чтобы другие формы не реагировали на ввод. В этот цикл добавить обработку сообщений (видимо мыши?) для окна виртуальной клавиатуры. (технически возможно есть смысл сделать свой базовый класс для модальных форм, кода скопировать подхаченный код ShowModal, если не удастся его перекрыть- сделать свой метод с другим названием, вызывать именно его).
    Вот только не придётся ли бороться с потерей фокуса модальной формой в таком варианте?
  • Германн © (05.01.17 02:38) [7]

    > Dimka Maslov ©   (03.01.17 12:12) [5]
    >
    >

    Да. Ты прав...
    Но тогда ты прав и в
    > сделать виртуальную клавиатуру отдельным процессом

    По-моему так правильнее всего.
  • дон трумп © (11.01.17 11:50) [8]
    Удалено модератором
 
Конференция "Основная" » Как сделать не модальное окно при ShowModal?
Есть новые Нет новых   [118685   +14][b:0][p:0.001]