MDI-Child bei Programmstart automatisch öffnen



  • Ich habe sozusagen das gegenteilige Problem wie das hier:
    https://www.c-plusplus.net/forum/54026-full

    Ich lasse ein MDI-Child Formular nicht automatisch beim Programmstart erzeugen, möchte dies aber unter gewissen Bedingungen doch gleich nach Programmstart erzeugen.
    Es geht weder wenn ich es in der Ereignisfunktion für OnCreate noch für OnActivate noch für OnShow versuche. Weiß jemand die Lösung?



  • Eine Möglichkeit wäre, dafür einfach einen 10ms Timer zu benutzen, der einmal aufgerufen wird, um das Child- Fenster zu erzeugen.

    Form10 ist die MDIForm, Form11 ist MDIChild

    void __fastcall TForm10::tmr1Timer(TObject *Sender)
    {
    	tmr1->Enabled = false;
    	TForm *pForm = new TForm11(this);
    	pForm->Show();
    }
    

    Eine andere Möglichkeit wäre, das Erzeugen über Postmessage nach dem Anzeigen auszulösen:

    H-Datei:

    class TForm10 : public TForm
    {
    __published:	// Von der IDE verwaltete Komponenten
    	void __fastcall FormShow(TObject *Sender);
    private:	// Benutzer-Deklarationen
    	enum
    	{
    		WM_CREATECHILDS = WM_USER+1
    	};
    
    	virtual void __fastcall Dispatch(void* Message);
    	void __fastcall CreateChilds();
    public:		// Benutzer-Deklarationen
    	__fastcall TForm10(TComponent* Owner);
    };
    

    cpp-Datei:

    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit10.h"
    #include "Unit11.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm10 *Form10;
    //---------------------------------------------------------------------------
    __fastcall TForm10::TForm10(TComponent* Owner)
    	: TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm10::CreateChilds()
    {
    	TForm *pForm = new TForm11(this);
    	pForm->Show();
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm10::Dispatch(void* Message)
    {
    	TForm::Dispatch(Message);
    	TMessage *pMsg = (TMessage*)Message;
    
    	if (pMsg->Msg == WM_CREATECHILDS)
    	{
    		CreateChilds();
    	}
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm10::FormShow(TObject *Sender)
    {
    	PostMessage(Handle,WM_CREATECHILDS,0,0);
    }
    //---------------------------------------------------------------------------
    


  • herzlichen dank an burkhi für die ausführliche Antwort


Log in to reply