【问题标题】:Create TNotifyEvent in C++ for use at Application level在 C++ 中创建 TNotifyEvent 以在应用程序级别使用
【发布时间】:2011-08-25 15:36:04
【问题描述】:

我需要在 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 文件中这样写时,它会抱怨

无法将 'void(*)(TObject *)' 转换为 'TNotifyEvent'

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

无法将“TNotifyEvent”转换为“TNotifyEvent”

那么,我应该如何编写一个函数来挂钩到我的应用程序属性?

【问题讨论】:

    标签: c++ hook c++builder


    【解决方案1】:

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

    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 结构来帮助您将其作为合适的@ 传递给事件987654324@:

    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 事件。

    【讨论】:

      【解决方案2】:

      你几乎就是这样。

      我所做的是创建一个包含各种操作的 TActionList。我使用以下代码创建了一个将在表单 OnCreate 事件上调用的操作:

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

      然后在我的表单中添加了一个小测试功能:

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

      就是这样。

      【讨论】:

      • 您说您希望在 form 的 OnCreate 事件上调用它,但我已经知道该怎么做。我不想像我说的那样挂钩到 Form 事件,而是挂钩到 Application 事件。
      猜你喜欢
      • 2018-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多