Notify view of application closure
Ganesh Vaideeswaran -- gvaidees@intertrust.com Tuesday, April 01, 1997 Hi, Environment: VC++ 4.2b, NT 4.0 How can the mainframe notify a view, that the user has chosen to exit the app. I am displaying a set of rows from a database on a CListView. The user can edit certain fields in each item of the list view. Now when the chooses to exit out of the app, I would like to warn him/her that unsaved changes will be lost. I would like to bring up a Yes/No/Cancel box with a custom message. Now the problem, is that the main frame has no knowledge about the changes made to the database thro' the view. Only the view has any knowledge of changes made. But the view does not get a WM_CLOSE message. Thanks
Mihir Dalal -- m_dalal@ECE.concordia.CA Wednesday, April 02, 1997 [Mini-digest: 4 responses] On Tue, 1 Apr 1997, Ganesh Vaideeswaran wrote: > > Hi, > > Environment: VC++ 4.2b, NT 4.0 > > How can the mainframe notify a view, that the user has chosen to exit the > app. > > I am displaying a set of rows from a database on a CListView. The user > can edit certain fields > in each item of the list view. Now when the chooses to exit out of the > app, I would like > to warn him/her that unsaved changes will be lost. > > I would like to bring up a Yes/No/Cancel box with a custom message. > > Now the problem, is that the main frame has no knowledge about the > changes made to the database > thro' the view. Only the view has any knowledge of changes made. But the > view does not get a WM_CLOSE message. So simply "GetActiveView()->SendMessage(WM_CLOSE,...)" in the appropriate message handler in the mainframe which gets called when the user exits your application. Trap the WM_CLOSE in CYourView and write your Yes/No/Cancel MessageBox (or whatever) in that. Mihir. _________________________________________________________________________ Mihir Dalal, M.Engg. (Electrical) Student Department of Electrical and Computer Engineering Concordia University, Montreal, Canada http://www.ECE.Concordia.CA/~m_dalal/addr.html -----From: Jim Lawson Williams At 09:29 01-04-97 P, Ganesh Vaideeswaran wrote: > >Hi, > >Environment: VC++ 4.2b, NT 4.0 > >How can the mainframe notify a view, that the user has chosen to exit the >app. > Apparently my recent response to a similar question passed you by. See below. There's no need to notify a view/document. OnCloseDocument() will be called automatically. Jim LW At 02:16 20-03-97 -0500, Patrick Davis wrote: >Environment: Win95 MSVC++4.0 > >Can anyone help me in getting a pointer to my document class >data from within the CMainFrame class ? G'day! >From anywhere within your program you can find your CWinApp-derived object by means of AfxGetApp(). In a wizard-generated MDI program, it's obvious your app. knows about the mainframe through m_pMainWnd. In SDI, this is less obvious because the set-up is done (in \Msdev\mfc\src\DOCSINGL.CPP) by: CWinThread* pThread = AfxGetThread(); if (bCreated && pThread->m_pMainWnd == NULL) { // set as main frame (InitialUpdateFrame will show the window) pThread->m_pMainWnd = pFrame; } InitialUpdateFrame(pFrame, pDocument, bMakeVisible); With the necessary pointers you can do the saving, either as changes occur, or by catching OnCloseDocument(). Regards, Jim LW >From the BBC's "Barchester Chronicles": "I know that ultimately we are not supposed to understand. But I also know that we must try." -- the Reverend Septimus Harding, crypt-analyst, art-critic, tax-consultant, C++ programmer, humanitarian (If vegetarians eat vegetables, what do humanitarians eat?) -----From: "Dalmer Junior" You can create a member function for your view that say if the Database changed. When you receive a WM_CLOSE in your frame, you can take the active view and "ask" for your view about the document. Follow a example. void CMainFrame::OnClose() { CView* pActView; ASSERT( pActView = GetActiveView() ); .... if( !pActView->IsDatabaseModified() ) { //Show your MessageBox ... } CFrameWnd::OnClose(); } I never did this but I hope help you. (:P []s, -- ***************************************************************** * Dalmer B. A. Junior Light-Infocon * * mail: dalmer@light-infocon.com Software Engineer * * Office Tel: (954) 450-0085 * * FAX : (954) 438-1995 -------- __o * * http://www.light-infocon.com ------- _`\<,_ * * "Life is Short Ride Tough" ------- (*)/ (*) * ***************************************************************** ---------- > From: Ganesh Vaideeswaran > To: 'mfc-l@netcom.com' > Subject: Notify view of application closure > Date: Tuesday, April 01, 1997 4:29 AM > > > Hi, > > Environment: VC++ 4.2b, NT 4.0 > > How can the mainframe notify a view, that the user has chosen to exit the > > > > > > app. > > I am displaying a set of rows from a database on a CListView. The user > can edit certain fields > in each item of the list view. Now when the chooses to exit out of the > app, I would like > to warn him/her that unsaved changes will be lost. > > I would like to bring up a Yes/No/Cancel box with a custom message. > > Now the problem, is that the main frame has no knowledge about the > changes made to the database > thro' the view. Only the view has any knowledge of changes made. But the > > > > > > view does not get a WM_CLOSE message. > > Thanks > > -----From: DFPav@aol.com 1. Put your data (database connection, etc) in your document. 2. When your view, changes the data, make sure, the document's modified flag gets set 3. When you attempt to close the MainFrame, it will try to close the document. 4. If the Document closes with the modified flag set it will pop up your Yes/No/Cancel dialog that is pretty standard. 5. This occurs within the virtual CDocument::SaveModified 6. RTFM starting with the above function and work from there. 10Q Dan
Mike Blaszczak -- mikeblas@nwlink.com Wednesday, April 02, 1997 [Mini-digest: 4 responses] At 09:29 4/1/97 P, Ganesh Vaideeswaran wrote: >Environment: VC++ 4.2b, NT 4.0 >How can the mainframe notify a view, that the user has chosen to exit the >app. Code a handler for the WM_CLOSE and/or system menu close message and/or the File/Exit menu handler your application has. In that code, make a call to a member function you've written for the view. >I am displaying a set of rows from a database on a CListView. The user >can edit certain fields >in each item of the list view. Now when the chooses to exit out of the >app, I would like to warn him/her that unsaved changes will be lost. Normally, people manage this kind of information in the document, since it's to be the object in the application that carries the data the user is editing. Even if your document isn't serving that purpose in your application, you might decide to use the same mechanism because all of the prompting is already wired up for you and you won't have to worry about notifying your view of the applications demise. Read up on CDocument::SetModifiedFlag() to learn more about this technique. >I would like to bring up a Yes/No/Cancel box with a custom message. If you close a document that has the modified flag set, MFC will do this for you. It doesn't matter how you're closing the document. >Now the problem, is that the main frame has no knowledge about the >changes made to the database thro' the view. Only the view has >any knowledge of changes made. But the view does not get a WM_CLOSE >message. I think your view should be telling the associated document about the fact that there were changes made. .B ekiM http://www.nwlink.com/~mikeblas/ These words are my own. I do not speak on behalf of Microsoft. One is too many and a million is not enough. -----From: Frank PijpersHello, In general when the main frame receives a message that you want the (a) view to process all you have to do is to re-route the message. Thus there are three steps: 1) Add a message handler to the main frame for the message you want the view to handle. 2) Have that message handler re-route the message to the view. 3) Add a handler for the message you want to handle to the view class. The message handler in the main frame would look something like (assuming only one view type): BOOL CMainFrame::OnAMessage(CWnd* pWnd, A_MESSAGE_STRUCT* pAMessageStruct) { // Re-route the message to the view CView* pView = GetActiveView(); if (pView) { pView->SendMessage(A_MESSAGE, WPARAM(this), (LPARAM)pAMessageStruct); } return CFrameWnd::AMessage(pWnd, pAMessageStruct); } Sincerely, Frank At 09:29 AM 4/1/97 P, you wrote: > >Hi, > >Environment: VC++ 4.2b, NT 4.0 > >How can the mainframe notify a view, that the user has chosen to exit the > > > > > >app. > >I am displaying a set of rows from a database on a CListView. The user >can edit certain fields >in each item of the list view. Now when the chooses to exit out of the >app, I would like >to warn him/her that unsaved changes will be lost. > >I would like to bring up a Yes/No/Cancel box with a custom message. > >Now the problem, is that the main frame has no knowledge about the >changes made to the database >thro' the view. Only the view has any knowledge of changes made. But the > > > > > >view does not get a WM_CLOSE message. > >Thanks > > > > > -----From: Stuart Downing >---------- From: Ganesh Vaideeswaran[SMTP:gvaidees@intertrust.com] >Subject: Notify view of application closure >How can the mainframe notify a view, that the user has chosen to exit the >app. CFrameWnd handles the WM_QUERYENDSESSION message and attempts to save any modified documents that are open in the app. You can overide the virtual CDocument::SaveModified to change the default behaviour (which is to prompt the user whether to save/don't save/cancel end session). For a database app, you are almost certainly writing changes to the database as the user navigates from record to record. It doesn't make sense to try to use CDocument::SetModifiedFlag, because you need to keep track of the modified state on a view-by-view basis, not for the whole document. Keep track in each view of whether the user has modified the current record. Add a method to the view, (let's call it SaveModified) that determines if the current record is modified, and if so prompts the user whether to save/don't save/cancel. It returns TRUE if it's OK to close the view, FALSE otherise. Override your CDocument's SaveModified. In there, walk through all the views attached to the document, calling CYourView::SaveModified(). If all the views return TRUE, the document's SaveModified also returns TRUE. (As soon as any view's SaveModified returns FALSE, the document's should return FALSE immediately). Other considerations... * In the view's SaveModified, you'll probably want to activate the view if the record has been modified. That way the user can see the record that they are being prompted about. * If the user has entered invalid data into the current field, you'll want SaveModified to present an error message and return FALSE. * If you're using MDI, you can also make use of the view's SaveModified function in your CMDIChildWnd's WM_CLOSE handler to deal with the user closing the view when changes are pending. Market research time... How much would you be willing to pay for some nice base classes that do all this for you? (Sorry, I haven't written them - yet :) ----- Stuart Downing sdowning@fame.com FAME Information Services, Inc. -----From: Ben Burnett Ganesh Vaideeswaran wrote: > > Hi, > > Environment: VC++ 4.2b, NT 4.0 > > How can the mainframe notify a view, that the user has chosen to exit the > > > > > app. > > I am displaying a set of rows from a database on a CListView. The user > can edit certain fields > in each item of the list view. Now when the chooses to exit out of the > app, I would like > to warn him/her that unsaved changes will be lost. > > I would like to bring up a Yes/No/Cancel box with a custom message. > > Now the problem, is that the main frame has no knowledge about the > changes made to the database > thro' the view. Only the view has any knowledge of changes made. But the > > view does not get a WM_CLOSE message. > > Thanks In your doc class there is a function called SetModifiedFlag( option ); In the view, when ever the user edits the data use the ptr to your doc and set the SetModifiedFlag( option ) to TRUE, make the view question you on exit as to wether to save or not. Hope this helps. -- ---------------------------------------------- Reality is for those who have no imagination Ben Burnett / Pulse productions e-mail: benner@supernet.ab.ca
Become an MFC-L member | Вернуться в корень Архива |