我需要在C++ Builder中挂接到应用程序的OnDeactivate事件。因此,我需要编写自己的函数以在OnDeactivate事件为应用程序触发时运行,但我不知道在哪里或如何定义该函数。

理想情况下,我希望代码看起来像这样:

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

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

当我在.cpp文件中这样写时,它抱怨



如果我更改函数以返回TNotifyEvent(无论如何都不应该工作),它会给我带来搞笑的错误



因此,我应该如何编写一个函数以挂钩到我的Application属性?

最佳答案

您正在尝试分配一个独立的函数,该函数应使用非静态类方法。您有两种选择:

1)将事件处理程序移到帮助程序类中:

class Helper
{
public:
    void __fastcall myFunction(TObject *Sender)
    {
        // ... do stuff
    }
};

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

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

2)将函数保留为非类函数,但给它一个额外的参数以接收编译器的this指针,然后使用TMethod结构帮助您将其作为合适的TNotifyEvent传递给事件:
void __fastcall 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上,然后可以在设计时为其分配OnDeactivate事件处理程序。

更新:或者,如果您的项目中有任何TFormTDataModule对象,则只需在其中一个对象上放置TApplicationEvents组件,然后在设计时为其分配一个OnDeactivate事件处理程序。然后它将为您连接到应用程序的OnDeactivate事件。

关于c++ - 在C++中创建TNotifyEvent以在应用程序级别使用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7193174/

10-14 18:36
查看更多