Meine Anwendung füllt einige Panels mithilfe eingehender Nachrichten unter Verwendung der SendStructMessage()
-Funktion in Message.hpp
.Wann erhält eine VCL-Anwendung ihr Application-> MainForm-> Handle?
SendStructMessage()
brauchen ein gültiges Windows-Handle zu senden.
Ich habe die SendStrucMessage()
in einer Funktion, wie das verkapselte:
bool sendAppMessage(ApplicationMessageEnum msgID, void* s)
{
if(!Application || !Application->MainForm || !Application->MainForm->Handle)
{
Log(lError) << "Failed to get a valid handle when trying to send application message";
return false;
}
HWND h = Application->MainForm->Handle;
AppMessageStruct data;
data.mMessageEnum = msgID;
data.mData = s;
LRESULT res = SendStructMessage(h, UWM_MESSAGE, 0, &data);
if(res)
{
Log(lError) << "Sending message: "<<msgID<<" was unsuccesful";
return false;
}
return true;
}
Der Versuch, diese aus rufen entweder die des Main OnShow
oder OnCreate
Ereignis nicht funktioniert, wie sie in jedem Fall die Application->MainForm->Handle
noch NULL ist.
Meine Frage ist, in einer Startphase der VCL-Anwendung, wo kann man sicher sein, dass die Application->MainForm->Handle
tatsächlich erstellt wird?
Derzeit treten ich einen Timer Überprüfung für einen gültigen Handle aus:
void __fastcall TMain::WaitForHandleTimerTimer(TObject *Sender)
{
if(Application->MainForm->Handle)
{
WaitForHandleTimer->Enabled = false;
//Send a message to main ui to update sequence shortcuts
if(sendAppMessage(abSequencerUpdate) != true)
{
Log(lDebug)<<"Sending sequencer update to UI was unsuccesful";
}
}
}
Gibt es einen besseren Weg?
[Diese Frage] (https://Stackoverflow.com/q/37614161/62576) und seine Kommentare (sowie die Antwort) können helfen. Während es mit Delphi markiert ist, ist die VCL vollständig in dieser Sprache geschrieben und es gelten die gleichen Informationen. Die Kommentare zu der Frage enthalten einige andere Links, die hier relevant sind und äußerst nützlich sein sollten. –