Dialog soll anderen schließen !?



  • Hallo Leute... ich weiß, dass das Problem schon öfter angesprochen wurde, doch leider hat mir die Suche noch nicht den gewünschten Erfolg gebracht.

    Problem: im FormView rufe ich nicht-modale Dialoge über Buttons auf. Einer der Dialoge starten sofort bei Start des Programms -- wenn ich nun über einen Button den nächsten nicht-modalen Dialog aufrufe, soll der bisher offene geschlossen werden.

    Habs schon mit S

    SendMessage(IDD_Station47, WM_CLOSE, 0);
    

    versucht, das Kompilieren klappt auch, aber das Programm stürzt dann mit einer Fehlermeldung ab (read kann nicht auf den Speicher ausgeführt werden).

    Der Code im ganzen:

    void meinView::OnStat14
    {
    SendMessage(IDD_Station47,WM_CLOSE,0);
    CStat14Dlg* aWnd = new CStat14Dlg();
    aWnd->Create(IDD_Station14);
    aWnd->SetWindowPos(NULL, 100,100,100,100,0);
    aWnd->ShowWindow(SW_SHOW);
    }
    

    Also: neuer Dialog wird aufgerufen, alter soll beendet werden.

    Danke für Eure Hilfe - CtB



  • ruf doch einfach in dem zu schliessenden dialog ne public methode auf, die den dialog schliesst...

    Esco



  • Hi Esco...

    .. kannste mir das bei Gelegenheit mal mit ein bissel Code erklären ?!
    Ich seh grad gar nix mehr. 😕

    Merci - CtB 😞



  • Versuchs mal mit PostMessage's

    PostMessage(IDD_Station47, WM_CLOSE, 0, 0);
    

    Gruß
    :: NoName ::



  • Hi NoName...

    ... also es kommt damit zwar keine Fehlermeldung mehr, aber auch leider keine Reaktion.

    CtB



  • Hmm, den Dialog den du schließen möchtest, hast du den auch mit Create erstellt ? So wie den :

    CStat14Dlg* aWnd = new CStat14Dlg();
    aWnd->Create(IDD_Station14); 
    ...
    

    Da du dann den anderen Dialog einfach deleten könntest :

    CAndererDialogDlg* AD = new CAndererDialogDlg();
    AD->Create(IDD_ANDEREDIALOG); 
    
    ...//Dann da wo du ihn wieder schließen möchtest :
    
    delete AD;
    

    Natürlich musst das " CAndererDialogDlg* AD; "
    als z.B. private Member anlegen, damit du dann von überall aus das delete aufrufen kannst !

    Gruß
    :: NoName ::



  • .. das klingt doch mal ganz gut...

    ... gibst mir mal bitte einen Tip, wie ich das als private Member anlege ??
    Ich hab schon´n soooo´n Kopp weil mich det kleine Problem seit zwei Tagen beschäftigt 😮

    Also ich lege generell alle Dialoge so an. Mein Problem dabei bisher: wenn ich zum Beispiel in Dialog für die 14 (aWnd) auf den Dialog der 47 (cWnd) zugreifen will, kennt er cWnd nicht (cWnd: nicht deklarierter bezeichner)

    .. Deine Idee scheint ja die Lösung zu sein... mir fehlt grad bloß die Idee zur Umsetzung. 😡

    Merci und fG - CtB



  • Naja, wie gesagt. In der Klasse wo du das Create aufrufst musst du auch die private Variable anlegen.
    Geh mal die die CTestView.h rein und lege dort die Vaiable an:

    ....
    private:
       CAndererDialogDlg* AD;
    

    Alles in allen muss das denn so aussehen :

    ...
    .....
    
    class CAHPView : public CFormView
    {
    protected: // create from serialization only
    	CAHPView();
    	DECLARE_DYNCREATE(CAHPView)
    
    public:
    	//{{AFX_DATA(CAHPView)
    	enum{ IDD = IDD_AHP_FORM };
    		// NOTE: the ClassWizard will add data members here
    	//}}AFX_DATA
    
    // Attributes
    public:
    	CAHPDoc* GetDocument();
    
    // Operations
    public:
    
    // Overrides
    	// ClassWizard generated virtual function overrides
    	//{{AFX_VIRTUAL(CAHPView)
    	public:
    	virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
    	protected:
    	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
    	virtual void OnInitialUpdate(); // called first time after construct
    	//}}AFX_VIRTUAL
    
    // Implementation
    public:
    	virtual ~CAHPView();
    #ifdef _DEBUG
    	virtual void AssertValid() const;
    	virtual void Dump(CDumpContext& dc) const;
    #endif
    
    protected:
    
    // Generated message map functions
    protected:
    	//{{AFX_MSG(CAHPView)
    		// NOTE - the ClassWizard will add and remove member functions here.
    		//    DO NOT EDIT what you see in these blocks of generated code !
    	//}}AFX_MSG
    	DECLARE_MESSAGE_MAP()
    [b]private:
    	CAndererDialogDlg* AD;[/b]
    };...
    ....
    

    Jetzt hast du die private Variable angelegt, jetzt kannst wie folgt weiterarbeiten :

    void meinView::OnStat14
    {
    delete AD; [u]// delete statt SendMessage[/u]
    CStat14Dlg* aWnd = new CStat14Dlg();
    aWnd->Create(IDD_Station14);
    aWnd->SetWindowPos(NULL, 100,100,100,100,0);
    aWnd->ShowWindow(SW_SHOW);
    }
    

    Aber natürlich musst du vorher den Dialog 'AD' irgendwo mit Create erzeugen, sonst schlägt delete fehl und du erhälst eine Fehlmeldung !

    Hoffe du kommst mit allem klar...

    Gruß
    :: NoName ::



  • hey NoName..

    .. vielen Dank für Deine Mühe.

    Das mit dem delete war nich so ganz sauber, hat biss´n Probleme gemacht. Aber hab mir da was anderes zusammen gebastelt.
    Der Rest hat mir echt weitergeholfen.

    Merci und fG - CtB 👍


Anmelden zum Antworten