我需要在C ++ Builder中挂钩Application的OnDeactivate
事件。因此,当OnDeactivate
事件触发应用程序时,我需要编写自己的函数来运行,但我不知道在哪里或如何定义该函数。
理想情况下,我希望我的代码看起来像这样:
WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
{
try
{
Application->Initialize();
Application->OnDeactivate = myFunction;
Application->Run();
}
后:
void myFunction(TObject *Sender)
{
//Do Stuff
}
当我在.cpp
文件中这样写时,它会抱怨
无法将'void(*)(TObject *)'转换为'TNotifyEvent'
如果我改变我的功能以返回TNotifyEvent
(无论如何都不行),它会给我带来一个搞笑的错误
无法将'TNotifyEvent'转换为'TNotifyEvent'
那么,我该如何编写一个函数来挂钩我的Application属性呢?
答案 0 :(得分:2)
您正在尝试分配一个独立的函数,而不希望使用非静态类方法。你有两个选择:
1)将您的事件处理程序移动到辅助类中:
class Helper
{
public:
void __fasycall myFunction(TObject *Sender)
{
...
}
};
WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
{
try
{
Application->Initialize();
Helper helper;
Application->OnDeactivate = &helper.myFunction;
...
}
...
}
2)将函数保留为非类函数,但为其提供额外参数以接收编译器的this
指针,然后使用TMethod
结构来帮助您将其传递给事件作为合适的TNotifyEvent
:
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);
...
}
...
}
如上所述,如果未分配MainForm,TApplication::Run()
将立即退出,因此最简单的解决方案是将TApplicationEvents
组件放到MainForm上,然后分配{{1}在设计时将事件处理程序发送给它。
更新:或者,如果您的项目包含任何OnDeactivate
或TForm
个对象,您只需将TDataModule
组件放在其中一个组件上,然后分配它在设计时的TApplicationEvents
事件处理程序。然后它将为您挂钩应用程序的OnDeactivate
事件。
答案 1 :(得分:0)
你几乎就是这样。
我所做的是创建一个包含各种动作的TActionList。我使用以下代码创建了一个将在表单OnCreate事件上调用的操作:
void __fastcall TForm1::onCreateActionExecute(TObject *Sender)
{
Application->OnDeactivate = MyAppDeactivate;
}
然后在我的表单中添加了一点测试功能:
void __fastcall MyAppDeactivate(TObject *Sender) { ShowMessage("Deactivate"); };
就是这样。