Хорошо. После прочтения это , это , это и это , я нашел кое-что интересное.
Таким образом, в основном приложение VCL Delphi / C ++ Builder использует сообщения форм Windows для сообщения, и мы можем переопределить виртуальную функцию WndProc
, чтобы перехватить определенное сообщение, но это должно быть какое-то уникальное сообщение, потому что VCL использует много сообщений, и если вы не будете действовать осторожно, все может взорваться; Это преобразуется в пользовательский обработчик событий в главной форме.
Итак, что я сделал:
- Передал дескриптор MainForm в Form2 в конструкторе, чтобы сохранить его в закрытой переменной Form2 и использовать только для обмена сообщениями.
- Создать конкретный идентификатор, который я использую, чтобы пометить сообщение, чтобы оно выделялось
- переопределяя
WndProc
и фильтруя сообщения с определенным идентификатором, чтобы мы знали, что Form2 закрывается.
Протестируйте, и это сработало, возможно, у кого-то есть идея получше.
//From unit2.h---------------------------------------------------------
class TForm2 : public TForm
{
__published: // IDE-managed Components
TButton *Button1;
void __fastcall Button1Click(TObject *Sender);
void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
private: // User declarations
HWND mfhandle;
public: // User declarations
__fastcall TForm2(TComponent* Owner, HWND mainformhandle);
};
//From unit2.cpp---------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit2.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
const UINT uiMyCopyDataID = RegisterWindowMessage(TEXT("MyCopyDataID"));
__fastcall TForm2::TForm2(TComponent* Owner,HWND mainformhandle)
: TForm(Owner)
{
mfhandle = mainformhandle;
}
void __fastcall TForm2::Button1Click(TObject *Sender)
{
Close();
}
void __fastcall TForm2::FormClose(TObject *Sender, TCloseAction &Action)
{
//Notify the mainForm and say Hey I am closing now
PostMessage(mfhandle, uiMyCopyDataID, 0, 0);
}
//From unit1.h---------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TPanel *container;
void __fastcall FormCreate(TObject *Sender);
void __fastcall FormUnDock(TObject *Sender, TControl *Client, TWinControl *NewTarget,
bool &Allow);
private: // User declarations
protected:
void __fastcall TForm1::WndProc(TMessage &Message); //Added THIS
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
//From unit1.cpp-------------------------------------------------------
const UINT uiMyCopyDataID = RegisterWindowMessage(TEXT("MyCopyDataID"));
void __fastcall TForm1::WndProc(TMessage &Message)
{
if (Message.Msg == uiMyCopyDataID)
{
//Do SomeThing here
ShowMessage("Form2 is closing");
}
TForm::WndProc(Message);
}
Хорошо, пока это работает, и пользовательские сообщения ДОЛЖНЫ быть в диапазоне WM_USER (0x0400 - 0x7FFF).