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äftigtAlso 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