gpt4 book ai didi

c++ - 在 C++ 中创建 TNotifyEvent 以在应用程序级别使用

转载 作者:行者123 更新时间:2023-11-30 04:33:04 26 4
gpt4 key购买 nike

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

cannot convert 'void(*)(TObject *)' to 'TNotifyEvent'

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

Cannot convert 'TNotifyEvent' to 'TNotifyEvent'

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

最佳答案

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

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com