2011-08-25 6 views
1

C++ Builder의 응용 프로그램 속성 "OnDeactivate"에 연결해야합니다. 따라서 OnDeactivate 이벤트가 응용 프로그램에 대해 실행될 때 실행되도록 자체 함수를 작성해야하지만 해당 함수를 정의하는 위치 나 방법을 알지 못합니다. 이상적으로는이 같은 것을보고 내 코드를 싶습니다응용 프로그램 수준에서 사용하기 위해 C++에서 TNotifyEvent를 만듭니다.

WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int) 
{ 
    try 
    { 
    Application->Initialize(); 
    Application->OnDeactivate = myFunction; 
    Application->Run(); 
    } 

이상 :

void myFunction(TObject *Sender) 
{ 
//Do Stuff 
} 

을 내 .cpp 파일이처럼 쓸 때 그러나 그것은 ("무효 변환 할 수 없습니다 뿌려 *) (TObject *)를 TNotifyEvent로 변환합니다. 함수를 반환하여 (어떤 식 으로든 작동하지 않아야하는) TNotifyEvent를 반환하면 "TNotifyEvent '를'TNotifyEvent '로 변환 할 수 없습니다."

그래서 어떻게해야합니까? 내 응용 프로그램 속성에 연결하는 함수를 작성하려고합니까?

답변

2

정적이 아닌 클래스 방법이 예상되는 독립 실행 형 함수를 할당하려고합니다.

1) 헬퍼 클래스에 이벤트 핸들러를 이동 : 컴파일러의 this를받을

class Helper 
{ 
public: 
    void __fasycall myFunction(TObject *Sender) 
    { 
     ... 
    } 
}; 

WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int) 
{ 
    try 
    { 
     Application->Initialize(); 

     Helper helper; 
     Application->OnDeactivate = &helper.myFunction; 
     ... 
    } 
    ... 
} 

2) 비 수준의 기능과 기능을 중단하지만, 그것을 추가 매개 변수를 줄 당신은 두 가지 선택이 포인터는, 다음은 TNotifyEvent 적절한으로 이벤트에 전달하는 데 도움이 TMethod 구조체를 사용 : MainForm이 할당되지 않은 경우 TApplication::Run() 즉시 종료됩니다 말했다 그와

void __fasycall myFunction(void *pThis, TObject *Sender) 
{ 
    ... 
} 

WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int) 
{ 
    try 
    { 
     Application->Initialize(); 

     TMethod m; 
     m.Data = NULL; // passed to the pThis parameter, can be whatever you want 
     m.Code = &myFunction; 
     Application->OnDeactivate = reinterpret_cast<TNotifyEvent&>(m); 
     ... 
    } 
    ... 
} 

때문에, 가장 간단한 해결책은 TApplicationEvents 구성 요소를 MainForm에 놓은 다음 디자인 타임에 OnDeactivate 이벤트 처리기를 할당하는 것입니다.

0

당신은 그것을 좋아할 것입니다.

내가 한 것은 다양한 작업이 포함 된 TActionList를 만드는 것입니다. 이 코드와 양식에서 OnCreate 이벤트에서 호출됩니다 작업 생성 :

void __fastcall TForm1::onCreateActionExecute(TObject *Sender) 
{ 
Application->OnDeactivate = MyAppDeactivate; 
} 

을 한 후 내 폼에 약간의 테스트 기능을 추가 :

void __fastcall MyAppDeactivate(TObject *Sender) { ShowMessage("Deactivate"); }; 

을 그리고 그것은 그 것이었다.

+0

당신은 ** 폼의 ** OnCreate 이벤트에서이 이벤트를 호출하기를 원했지만 이미 수행 방법을 알고 있습니다. Form 이벤트에 연결하고 싶지 않지만 내가 말했던 것처럼 Application 이벤트에 연결하려고합니다. – user912447

관련 문제