2013-08-19 2 views
2

EnumAllWindowsOnActivateHint는 TApplication을위한 속성이며 도움에 따라 C++ Builder - Codegear 2007에 공개되어야합니다.Delphi에서 VCL로 속성을 노출하는 VCL

내 어려움은이 응용 프로그램을 C++에 노출 시키거나 그렇지 않으면 true로 설정해야한다는 것입니다.

그래서 이러한 목표를 달성하기 위해 다른 도로가있다, 나는 아마 시도하고 한 가지 잘못했는지 : Forms.pas에 EnumAllWindowsOnActivateHint 노출

  1. . 그러나이 변경 사항을 응용 프로그램/VCL에 포함시키는 데 어려움을 겪고 있습니다. 나는 VCL을 다시 컴파일 할 때 읽은 모든 것을 시도했다. 아무것도 효과가 없습니다.
  2. 수있는 델파이 코드를 C++에서 속성에 액세스 할 수 있습니다.
  3. 다른 건 없나요?

최신 버전의 Codegear로 업그레이드 할 수 없습니다.이 경우 응용 프로그램이 의존하는 RTTI 동작이 중단됩니다.

제안 사항? 솔루션?

+0

사용하지 않아도됩니다. 내부적으로 사용되는 속성입니다. [문서] (http://docwiki.embarcadero.com/Libraries/XE4/en/Vcl.Forms.TApplication.EnumAllWindowsOnActivateHint)를 참조하십시오. –

+1

@KenWhite : 문서에 기록되어 있습니다. 그러나 RTL/VCL의 어떤 것도 그 속성 값을 설정하지 않으며 기본값은 False이므로 사용자가 값을 수동으로 True로 변경하지 않으면 항상 False이므로 처음부터 존재하지 않을 수도 있습니다. 이는 사실상 사용자가 정의한 값을위한 속성이되므로 문서가 약간 오도 할 수 있습니다. –

+0

ActiveX 애플리케이션에 필요합니다. 특히 TabProcGrowth 레지스트리 해결 방법이 더 이상 작동하지 않는 IE10에 포함됩니다. – Zeroth

답변

6

TApplication::EnumAllWindowsOnActivateHint 진짜 C++로 소개되지 않았다 - C에서 ++ 빌더 2007, 그것은 대신 Class Helper의 속성으로 구현 된 2009 년 C++ 빌더까지 접근 특성 :

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

Class Helpers이 있습니다 C++에서 액세스 할 수없는 Delphi 관련 기능. 따라서 해결 방법을 사용해야합니다. EnumAllWindowsOnActivateHint 속성에 액세스 C 스타일의 기능을 노출하는 별도의 일단의 .pas 파일을 만든 다음 C++ 프로젝트에 그 일단의 .pas 파일을 추가 :

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); 
} 
+1

와우, 고마워요! 이것은 완벽하게 작동했고, 회고에서 그렇게 명백하게 단순 해 보였다. – Zeroth

+0

아쉽게도이 플래그는 TabProcGrowth가 0 이상으로 설정된 IE9/IE10에서 ActiveForms/ActiveX 컨트롤에 대해 작동하지 않는 것으로 보입니다. 플래그는 설정되지만 힌트는 여전히 표시되지 않습니다. 이것에 대한 아이디어가 있습니까? – Zeroth

관련 문제