Реализация VirtualTreeView TVTDefaultAccessibleProvider в C ++ Builder - PullRequest
0 голосов
/ 07 февраля 2020

При использовании VirtualStringTree для добавления поддержки специальных возможностей необходимо включить единицу VirtualTrees.Accessibility в раздел uses. Это работает в Delphi.

Эквивалентом этого в C ++ Builder будет включение #include "VirtualTrees.Accessibility.hpp". Но включение файла включения не имеет никакого эффекта.

Я отследил проблему до файла VirtualTrees.Accessibility.pas, и он выполняет несколько строк кода, чтобы зарегистрировать поставщика специальных возможностей по умолчанию в Delphi, пока код отсутствует в файле hpp. Таким образом, включение hpp включает в себя класс, но не код, который регистрирует провайдера.

Код, о котором идет речь (в конце VirtualTrees.Accessibility.pas это):

var
  DefaultAccessibleProvider: TVTDefaultAccessibleProvider;
  DefaultAccessibleItemProvider: TVTDefaultAccessibleItemProvider;
  MultiColumnAccessibleProvider: TVTMultiColumnAccessibleItemProvider;

initialization
  if DefaultAccessibleProvider = nil then
  begin
    DefaultAccessibleProvider := TVTDefaultAccessibleProvider.Create;
    GetAccessibilityFactory.RegisterAccessibleProvider(DefaultAccessibleProvider);
  end;
  if DefaultAccessibleItemProvider = nil then
  begin
    DefaultAccessibleItemProvider := TVTDefaultAccessibleItemProvider.Create;
    GetAccessibilityFactory.RegisterAccessibleProvider(DefaultAccessibleItemProvider);
  end;
  if MultiColumnAccessibleProvider = nil then
  begin
    MultiColumnAccessibleProvider := TVTMultiColumnAccessibleItemProvider.Create;
    GetAccessibilityFactory.RegisterAccessibleProvider(MultiColumnAccessibleProvider);
  end;
finalization
  GetAccessibilityFactory.UnRegisterAccessibleProvider(MultiColumnAccessibleProvider);
  MultiColumnAccessibleProvider := nil;
  GetAccessibilityFactory.UnRegisterAccessibleProvider(DefaultAccessibleItemProvider);
  DefaultAccessibleItemProvider := nil;
  GetAccessibilityFactory.UnRegisterAccessibleProvider(DefaultAccessibleProvider);
  DefaultAccessibleProvider := nil;

end.

Мой вопрос - Как я могу перевести или использовать вышеупомянутое, чтобы я мог получить поддержку специальных возможностей из C ++ Builder после включения файла VirtualTrees.Accessibility.hpp? Перевод вышеупомянутого на C ++ был бы очень признателен.

1 Ответ

0 голосов
/ 17 февраля 2020

На основании исследования по этой ссылке и ответа Реми Лебо:

Часть инициализации не называется

И открытый вопрос о VirtualTree GitHub:

https://github.com/Virtual-TreeView/Virtual-TreeView/issues/951

Здесь я поделюсь решением, как этого можно достичь одним из следующих способов:

Метод A

Позвонив по телефону:

TVirtualTreeAccessibility::RegisterDefaultAccessibleProviders();

где-то в файле cpp, в соответствии с предложением Йоахима Мардера

Метод B

Путем добавления:

#pragma link "VirtualTrees.Accessibility"

в cpp исходный файл

Метод C

Добавляя что-то вроде:

{$HPPEMIT '#pragma link "VirtualTrees.Accessibility"'}

в VirtualTrees.Accessibility.pas исходный код

...