2

EnumAllWindowsOnActivateHint 是 TApplication 的一个属性,根据帮助,应该在 C++ Builder - Codegear 2007 中公开。它不是。

我的困难是我需要将它暴露给 C++ 或者为我的应用程序将它设置为 true。

所以有不同的途径来实现这一点,我尝试过并且可能做错的事情:

  1. 在 Forms.pas 中公开了 EnumAllWindowsOnActivateHint。但是,我很难将此更改包含到应用程序/VCL 中。我已经尝试了我在重新编译 VCL 时所读到的所有内容。没有任何效果。
  2. 调用一些可以从 C++ 访问属性的 delphi 代码。
  3. 还有什么?

我无法升级到较新版本的 Codegear,因为这会破坏应用程序所依赖的 RTTI 行为。

建议?解决方案?

4

1 回答 1

6

TApplication::EnumAllWindowsOnActivateHint直到 C++Builder 2009 才作为真正的 C++ 可访问属性引入。在 C++Builder 2007 中,它被实现为Class Helper的属性:

TApplicationHelper = class helper for TApplication
private
  procedure SetEnumAllWindowsOnActivateHint(Flag: Boolean);
  function GetEnumAllWindowsOnActivateHint: Boolean;
  ...
public
  property EnumAllWindowsOnActivateHint: Boolean read GetEnumAllWindowsOnActivateHint write SetEnumAllWindowsOnActivateHint;
  ...
end;

Class Helpers是 Delphi 特有的功能,在 C++ 中无法访问。因此,您将不得不使用解决方法。创建一个单独的 .pas 文件,该文件公开 C 样式函数以访问该 EnumAllWindowsOnActivateHint属性,然后将该 .pas 文件添加到您的 C++ 项目中:

AppHelperAccess.pas:

unit AppHelperAccess;

interface

function Application_GetEnumAllWindowsOnActivateHint: Boolean;
procedure Application_SetEnumAllWindowsOnActivateHint(Flag: Boolean);

implementation

uses
  Forms;

function Application_GetEnumAllWindowsOnActivateHint: Boolean;
begin
  Result := Application.EnumAllWindowsOnActivateHint;
end;

procedure Application_SetEnumAllWindowsOnActivateHint(Flag: Boolean);
begin
  Application.EnumAllWindowsOnActivateHint := Flag;
end;

end.

当它被编译时,将生成一个 C++ .hpp 头文件,然后您的 C++ 代码可以使用它来调用函数。例如

#include "AppHelperAccess.hpp"

void EnableEnumAllWindowsOnActivateHint()
{
    Application_SetEnumAllWindowsOnActivateHint(true);
}

void DisableEnumAllWindowsOnActivateHint()
{
    Application_SetEnumAllWindowsOnActivateHint(false);
}

void ToggleEnumAllWindowsOnActivateHint()
{
    bool flag = Application_GetEnumAllWindowsOnActivateHint();
    Application_SetEnumAllWindowsOnActivateHint(!flag);
}
于 2013-08-19T17:05:09.930 回答