При разработке пользовательского интерфейса на Delphi, особенно когда речь идет о создании доступных элементов управления, важно учитывать, что доступность является ключевым аспектом для пользователей с ограниченными возможностями. В частности, реализация интерфейса IAccessible позволяет элементам управления взаимодействовать с программами чтения экрана и другими инструментами, предназначенными для помощи пользователям.
В данной статье мы рассмотрим проблему, с которой столкнулся разработчик после реализации интерфейса IAccessible для элементов управления в Delphi: доступное имя элемента управления пропадает и не отображается в свойствах Windows Forms.
Описание проблемы
Разработчик успешно реализовал интерфейс IAccessible для элементов управления, производных от TEdit, и ожидал увидеть доступное имя в свойствах Windows Forms. Однако, несмотря на то, что во время отладки имя устанавливалось корректно, в свойствах Windows Forms оно не отображалось.
Контекст
В контексте данной проблемы стоит упомянуть, что IAccessible - это интерфейс, который используется для обеспечения доступности элементов управления в Windows. Он позволяет программам чтения экрана и другим вспомогательным технологиям получать информацию об элементах управления, включая их имена и описания.
Реализация IAccessible
Разработчик создал класс TXControlEigenschaften, который реализует интерфейс IAccessible. В частности, он реализовал функцию Get_accName, которая возвращает доступное имя элемента управления. Также был создан класс TXCustomEdit, производный от TCustomMaskEdit, который использует TXControlEigenschaften для предоставления доступности.
Проблема с потерей имени
Проблема заключалась в том, что после реализации IAccessible, доступное имя, установленное в отладочном режиме, не сохранялось и не отображалось в свойствах Windows Forms. Это происходило даже после того, как разработчик убедился, что сообщение WM_GETOBJECT обрабатывается корректно и функция Get_accName вызывается при попытке чтения свойств элемента управления.
Возможное решение
Разработчик предположил, что проблема может быть связана с тем, как часто вызывается WM_GETOBJECT и с последовательностью вызовов. Он также упомянул, что после простого чтения документации по MSDN и внесения изменений в реализацию метода Get_accState, проблема с именем была решена, хотя это решение больше напоминало обходной путь, а не полноценное решение.
Подтвержденный ответ
В итоге, разработчик нашел решение в изменении реализации метода Get_accState, возвращая DISP_E_MEMBERNOTFOUND, вместо кода из статьи на Stack Overflow, на которую он ссылался ранее. Это позволило решить проблему с отображением имени, но усложнило процесс выбора компонентов с помощью инструментов, таких как AutoIt или Visual Studio Test-Generator для Coded UI.
Альтернативный ответ и дальнейшие действия
Разработчик также открыл новый вопрос на Stack Overflow, где обсуждается влияние метода Get_accState на Get_accName, что указывает на продолжение поиска более полного и надежного решения проблемы.
Заключение
Важно помнить, что доступность - это не только соответствие стандартам, но и удобство использования для широкого круга пользователей. Решение проблем, связанных с доступностью, требует внимательного изучения документации и тестирования в различных условиях использования.
Пример кода на Object Pascal (Delphi)
// Пример реализации метода Get_accName
function TXControlEigenschaften.Get_accName(varChild: OleVariant; out pszName: WideString): HResult;
begin
pszName := '';
Result := S_FALSE;
if varChild = CHILDID_SELF then
begin
if AccessibleName <> '' then
pszName := AccessibleName
else
pszName := FControl.Name;
Result := S_OK;
end;
end;
Этот код является частью класса, реализующего интерфейс IAccessible, и показывает, как можно установить доступное имя для элемента управления в Delphi.
В данной статье мы рассмотрели типичную проблему, с которой может столкнуться разработчик при реализации доступных элементов управления в Delphi, и возможные пути ее решения.
Проблема заключается в потере доступного имени для элемента управления после реализации интерфейса `IAccessible` в среде разработки Delphi, что мешает корректному отображению этого имени в свойствах Windows Forms и влияет на функционирование вспомогатель
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.