在 C++ Builder 中实现 VirtualTreeView TVTDefaultAccessibleProvider

Implementing VirtualTreeView TVTDefaultAccessibleProvider in C++ Builder

使用 VirtualStringTree 添加辅助功能支持时,需要在 uses 部分中包含单元 VirtualTrees.Accessibility。这适用于 Delphi.

C++ Builder 中的等效项是包含 #include "VirtualTrees.Accessibility.hpp"。但是包括包含文件没有任何效果。

我已将问题追溯到 VirtualTrees.Accessibility.pas 文件,它执行了几行代码以在 Delphi 中注册默认的辅助功能提供程序,而 hpp 文件中没有此代码。因此,包括 hpp 确实包括 class 但不包括注册提供者的代码。

问题代码(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.

我的问题 - 如何翻译或使用上述内容,以便在包含 VirtualTrees.Accessibility.hpp 文件后也能获得 C++ Builder 的辅助功能支持?将以上内容翻译成 C++ 将不胜感激。

基于此 link 的研究和 Remy Lebeau 的回答:

The initialization part is not called

以及在 VirtualTree 上打开的问题 GitHub:

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

我在这里分享一个解决方案,如何通过以下任一方式实现:

方法一

通过调用:

TVirtualTreeAccessibility::RegisterDefaultAccessibleProviders();

cpp 文件中的某处,如 Joachim Marder 所建议的那样

方法B

通过添加:

#pragma link "VirtualTrees.Accessibility"

在cpp源文件中

方法 C

通过添加如下内容:

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

VirtualTrees.Accessibility.pas源代码中