Разработка доступных интерфейсов в средах Delphi и C++Builder требует особого внимания к деталям, особенно когда речь заходит о поддержке пользователей с ограниченными возможностями. В данной статье мы рассмотрим, как можно улучшить доступность компонентов, таких как кнопки и изображения, для использования с программами чтения с экрана.
Проблема с кнопками без подписей
При использовании кнопок без подписей (только с изображением) программы чтения с экрана не могут определить, что именно представляет собой кнопка. Для решения этой проблемы можно использовать owner-drawing кнопок и установить стандартную подпись, которую программы чтения с экрана могут прочитать.
Пример кода для owner-drawing кнопок:
type
TMyButton = class(TButton)
private
FAccessibleText: string;
public
property AccessibleText: string read FAccessibleText write FAccessibleText;
procedure Paint; override;
end;
procedure TMyButton.Paint;
begin
if Caption = '' then
inherited;
// Здесь код для рисования кнопки с изображением
end;
Работа с IAccessible
Для более сложных сценариев, когда требуется полный контроль над тем, что читает программа чтения с экрана, можно использовать интерфейс IAccessible. Он позволяет обернуть существующие объекты и предоставить дополнительную информацию для чтения с экрана.
Пример обертки IAccessible для кнопки:
type
TMyAccessibleText = class(TInterfacedObject, IAccessible)
// Класс реализации IAccessible, для получения дополнительной информации смотрите подтвержденный ответ.
end;
type
TBitBtn = class(Vcl.Buttons.TBitBtn)
private
procedure WMGetObject(var Message: TMessage); message WM_GETOBJECT;
public
MyAccessibleText: string;
end;
procedure TBitBtn.WMGetObject(var Message: TMessage);
begin
// Код для замены стандартного IAccessible на пользовательскую реализацию
end;
Проблема с изображениями
Изображения на формах, наследующие TGraphicControl, также могут быть непонятны для программ чтения с экрана. Для решения этой задачи необходимо предоставить описание изображения, которое будет прочитано при наведении курсора.
Пример описания изображения:
TImage = class(TCustomImage)
procedure SetAccessibleText(const Value: string);
property AccessibleText: string read GetAccessibleText write SetAccessibleText;
function GetAccessibleText: string; virtual;
end;
function TImage.GetAccessibleText: string;
begin
Result := inherited;
// Если изображение не имеет подписи, вернуть значение свойства AccessibleText
end;
procedure TImage.SetAccessibleText(const Value: string);
begin
FAccessibleText := Value;
end;
type
TMyForm = class(TForm)
Image1: TImage;
...
procedure FormCreate(Sender: TObject);
...
end;
procedure TMyForm.FormCreate(Sender: TObject);
begin
Image1.AccessibleText := 'Описание изображения для чтения с экрана';
end;
Заключение
Для обеспечения доступности интерфейсов, созданных в Delphi и C++Builder, необходимо внимательно относиться к реализации IAccessible для каждого компонента, который должен быть доступен для программ чтения с экрана. Это может быть как простое owner-drawing с установкой подписей, так и полная реализация IAccessible для сложных сценариев.
Подтвержденный ответ
Для кнопок и изображений без подписей можно использовать owner-drawing и установку свойства Caption или AccessibleText, которое будет прочитано программами чтения с экрана. В случае необходимости полного контроля над процессом чтения можно реализовать собственную версию IAccessible, которая будет возвращать нужный текст.
Альтернативный ответ
К сожалению, нет простого способа избежать реализации IAccessible для каждого компонента, который требует доступа программ чтения с экрана. Третьесторонние библиотеки могут предложить готовые решения, но они могут быть не всегда доступны или подходить под конкретные требования проекта.
Эта статья предоставляет обзор проблемы доступности интерфейсов в Delphi и C++Builder и предлагает решения для обеспечения взаимодействия с программами чтения с экрана. Примеры кода на Object Pascal демонстрируют, как можно применить эти решения на практике.
Создание интерфейсов в средах Delphi и C++Builder, доступных для программ чтения с экрана, требует разработки компонентов, поддерживающих IAccessible, для обеспечения взаимодействия с пользователями с ограниченными возможностями.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS