在 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
源代码中
使用 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
源代码中