2

EnumAllWindowsOnActivateHint は TApplication のプロパティであり、ヘルプによると、C++ Builder - Codegear 2007 で公開する必要があります。そうではありません。

私の困難は、これを C++ に公開するか、アプリケーションで true に設定する必要があることです。

したがって、これを達成するためのさまざまな手段があり、私が試したものとおそらく間違っていたものがあります。

  1. Forms.pas で EnumAllWindowsOnActivateHint を公開しました。ただし、この変更をアプリケーション/VCL に含めるのに苦労しています。VCLの再コンパイルについて読んだことはすべて試しました。何も機能していません。
  2. C++ からプロパティにアクセスできるDelphi コードを呼び出します。
  3. 他の何か?

アプリケーションが依存している RTTI の動作が損なわれるため、Codegear の新しいバージョンにアップグレードできません。

提案?ソリューション?

4

1 に答える 1

6

TApplication::EnumAllWindowsOnActivateHintC++Builder 2009 まで、実際の C++ アクセス可能なプロパティとして導入されませんでした。C++Builder 2007 では、代わりにクラス ヘルパーのプロパティとして実装されました。

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

クラス ヘルパーは、C++ ではアクセスできない Delphi 固有の機能です。そのため、回避策を使用する必要があります。プロパティにアクセスする C スタイルの関数を公開する別の .pas ファイルを作成し、 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++ コードが関数を呼び出すために使用できる C++ .hpp ヘッダー ファイルが生成されます。例えば

#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 に答える