Создать TNotifyEvent в C ++ для использования на уровне приложений - PullRequest
1 голос
/ 25 августа 2011

Мне нужно подключиться к событию OnDeactivate приложения в C ++ Builder. Поэтому мне нужно написать свою собственную функцию, которая будет запускаться при возникновении события 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?

Ответы [ 2 ]

2 голосов
/ 30 августа 2011

Вы пытаетесь назначить отдельную функцию, где вместо этого ожидается нестатический метод класса. У вас есть два варианта:

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);
        ...
    }
    ...
}

С учетом вышесказанного, TApplication::Run() немедленно завершится, если MainForm не назначен, поэтому самое простое решение - просто перетащить компонент TApplicationEvents в вашу MainForm, а затем вы можете назначить ему обработчик события OnDeactivate в во время разработки.

Обновление : в качестве альтернативы, если в вашем проекте есть какие-либо объекты TForm или TDataModule, вы можете просто перетащить компонент TApplicationEvents на один из них и назначить обработчик события OnDeactivate для это во время разработки. Затем он подключится к событию OnDeactivate приложения.

0 голосов
/ 25 августа 2011

У вас почти все так.

Я создал TActionList, содержащий различные действия.Я создал действие, которое будет вызываться для события OnCreate форм с этим кодом:

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

, а затем добавил небольшую тестовую функцию в мою форму:

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

, и это было.

...