Совместимость с NVDA (программой экранного чтения)

crossa
Дата: 11.07.2019 16:51:18
Кто-нибудь писал программы на Delphi, совместимые с программами экранного чтения для слабовидящих (например, NVDA)?

Возникла проблема с старой программой, написанной на Delphi 7. На форме лежит TLabel с текстом что-то типа "Введите текст", СПРАВА от него лежит TEdit, в которой и надо ввести текст. Расстояние между этими двумя элементами 16 пикселей. Слабовидящий пользователь жалуется, что при использовании NVDA TEdit и TLabel воспринимаются как не связанные друг с другом.

Из всей документации по написанию программ для слабовидящих у меня только эта ссылка:
https://edn.embarcadero.com/article/33642
  • Рекомендуют включить TLabel в tab order - это, по-моему, невозможно для TLabel.
  • Рекомендуют использовать TStaticText или TLabeledEdit - для моей программы это не совсем подходит.
  • Главная рекомендация - размещать TEdit справа от TLabel - так и было сделано в моей программе.

    Кто-нибудь занимался вопросами совместимости программ на Delphi с NVDA? Буду признателен за советы; поделитесь секретами. Каких еще проблем стоит опасаться?

    (Буду пробовать уменьшить расстояние между элементами окна; если не поможет, попробую заменить TLabel на TStaticText.)
  • _Vasilisk_
    Дата: 11.07.2019 17:19:59
    У TLabel свойство FocusControl установлено?

    Сам TLabel вообще NVDA читается? По идее не должен. Это же картинка
    _Vasilisk_
    Дата: 11.07.2019 17:21:37
    crossa
    TLabeledEdit - для моей программы это не совсем подходит.
    Почему?
    Aniskin
    Дата: 11.07.2019 17:35:37
    crossa,

    NVDA и прочие реадеры используют стандартный "протокол" взаимодействия с элементами управления через UI Automation или ее простую форму Microsoft Active Accessibility. На внутреннем уровне оконному элементу посылается сообщение WM_GETOBJECT с запросом информации о объекте или его детях. Поскольку у TLabel нет своего окна, то вместо него сообщение принимает его родитель. И я не уверен, что Delphi7 знает, как правильно отвечать на сообщение WM_GETOBJECT. Для стандартных элементов управления в Windows есть встроенные механизмы ответа на WM_GETOBJECT. Поэтому самый простой способ сделать программу совместимой с UI Automation - использовать только стандартные контролы. В твоей ситуации проще всего действительно заменить TLabel на TStaticText. В Win10 есть Narrator, можешь посмотреть, как он реагирует на твое окно.
    Gator
    Дата: 11.07.2019 18:00:41
    Aniskin, TLabej ни вкоем случае не элемент управления Windows.
    Это лишь картинка, как сазал _Vasilisk_
    А TLabeledEdit это их помесь :)
    Aniskin
    Дата: 11.07.2019 18:06:36
    Gator
    TLabel ни вкоем случае не элемент управления Windows.

    Вопрос терминологии ) А StaticText - это элемент управления? По msdn-новскому он называется Static Control. A static control is a control that enables an application to provide the user with informational text and graphics that typically require no response.
    _Vasilisk_
    Дата: 11.07.2019 18:10:40
    Aniskin
    А StaticText - это элемент управления?
    Да. У него есть HWND
    Aniskin
    Дата: 11.07.2019 18:14:39
    _Vasilisk_, Gator

    Я не совсем понял. Вы бы не могли процитировать мое конкретное предложение в исходном ответе, которое вы оспариваете, где бы я утверждал, что TLabel является оконным элементом с собственным окном. Я как раз таки утверждал обратное.
    _Vasilisk_
    Дата: 11.07.2019 18:15:34
    Aniskin
    И я не уверен, что Delphi7 знает, как правильно отвечать на сообщение WM_GETOBJECT
    Посмотрел в XE3 и Rio. Кастомная обработка WM_GETOBJECT производится только в TCustomActionMenuBar. Так, что даже с TLabeledEdit не взлетит
    _Vasilisk_
    Дата: 11.07.2019 18:17:04
    Aniskin
    которое вы оспариваете,
    Я не оспариваю. Я отвечаю на конкретный вопрос
    Aniskin
    А StaticText - это элемент управления?