Cum inchid documentele la OnFileNew si OnFileOpen ?
-
- Membru++
- Posts: 687
- Joined: 10 Sep 2008, 21:40
- Judet: Cluj
Cum inchid documentele la OnFileNew si OnFileOpen ?
Stiu ca titlul pare ciudat, caci la OnFileNew si la OnFileOpen se deschid noi documente, dar cerinta este ca intr-o aplicatie MDI, daca am deja documente deschise, la OnFileNew, si la OnFileOpen sa inchid toate documentele deschise ca apoi user-ul sa creeze sau sa aleaga un nou document .... am incercat in cateva feluri dar cel putin la OnFileOpen nu resusesc sa inchid tot ... cum se poate rezolva ?
- Silviu Ardelean
- Senior
- Posts: 1175
- Joined: 12 Jul 2007, 09:22
- Contact:
Re: Cum inchid documentele la OnFileNew si OnFileOpen ?
Atunci de ce mai e aplicatie MDI cand tu vrei sa deschizi doar un document la un moment dat? SDI-ul iti satisface automat aceasta doleanta.
Bine-inteles, daca ai o aplicatie deja scrisa si trebuie doar s-o modifici atunci trebuie sa sapi.

Bine-inteles, daca ai o aplicatie deja scrisa si trebuie doar s-o modifici atunci trebuie sa sapi.
-
- Membru++
- Posts: 687
- Joined: 10 Sep 2008, 21:40
- Judet: Cluj
Re: Cum inchid documentele la OnFileNew si OnFileOpen ?
Pentru ca aplicatia trebuie sa gestioneze mai multe tipuri de documente, care pot fi deschise simultan, dar cand user-ul vrea un new document sau open document (de pe disc) , trebuie sa inchid toate documentele (de orice tip) pentru ca apoi sa ii dau voie sa creeze/aleaga un document ...
- Silviu Ardelean
- Senior
- Posts: 1175
- Joined: 12 Jul 2007, 09:22
- Contact:
Re: Cum inchid documentele la OnFileNew si OnFileOpen ?
Deschiderea mai multor fisiere simultan nu se pupa cu "OnFileOpen sa inchid toate documentele deschise" (asta daca nu ai o abordare originala si neobisnuita de-a deschide fisierele ce vrei sa le inchizi pe OnFileOpen).
-
- Membru++
- Posts: 687
- Joined: 10 Sep 2008, 21:40
- Judet: Cluj
Re: Cum inchid documentele la OnFileNew si OnFileOpen ?
Scuze, documentele nu se vor deschide simultan, ci pe rand. Doar as vrea sa le inchid (in cazul cand sant deschise si alte tipuri de document) inainte de a deschide/crea un nou document.
- Silviu Ardelean
- Senior
- Posts: 1175
- Joined: 12 Jul 2007, 09:22
- Contact:
Re: Cum inchid documentele la OnFileNew si OnFileOpen ?
SDI-ul rezolva automat problema fara vreo transpiratie din partea ta. Atat la MDI cat si la SDI trebuie sa transpiri putin pentru suportul multi-type document (pe care banuiec ca-l ai... sau?).
Re: Cum inchid documentele la OnFileNew si OnFileOpen ?
Nu sunt specialist in aplicatii MDI dar ma gandesc ca de fiecare data cand faci Open la un fisier poti sa iei handle la el sau sa salvezi ce ai deschis ca pe urma la apelul lui OnFileOpen sa decizi ce vrei sa inchizi ?
Cu stima,
Lupu Claudiu
Lupu Claudiu
- Ovidiu Cucu
- Fondator
- Posts: 3778
- Joined: 11 Jul 2007, 16:10
- Judet: Iaşi
- Location: Iasi
- Contact:
Re: Cum inchid documentele la OnFileNew si OnFileOpen ?
Eu as pune un item de meniu "File/Close all" ca sa fie clar pentru user ce se intampla si l-as hendlui cam asa:
Code: Select all
void CMainFrame::OnFileCloseall()
{
// close all open documents
CWinApp* pApp = AfxGetApp();
POSITION posTemplate = pApp->GetFirstDocTemplatePosition();
while(NULL != posTemplate)
{
CDocTemplate* pDocTemplate = pApp->GetNextDocTemplate(posTemplate);
POSITION posDoc = pDocTemplate->GetFirstDocPosition();
while(NULL != posDoc)
{
CDocument* pDoc = pDocTemplate->GetNextDoc(posDoc);
POSITION posView = pDoc->GetFirstViewPosition();
while(NULL != posView)
{
CView* pView = pDoc->GetNextView(posView);
CFrameWnd* pFrame = pView->GetParentFrame();
if(NULL != pFrame->GetSafeHwnd())
{
pFrame->SendMessage(WM_CLOSE);
}
}
}
}
}
Ovidiu
Follow http://twitter.com/#!/ovidiucucu
Weblog: http://codexpert.ro/blog/author/ovidiu-cucu/
Visit FAQ, Tips & Tricks
Follow http://twitter.com/#!/ovidiucucu
Weblog: http://codexpert.ro/blog/author/ovidiu-cucu/
Visit FAQ, Tips & Tricks
- Ovidiu Cucu
- Fondator
- Posts: 3778
- Joined: 11 Jul 2007, 16:10
- Judet: Iaşi
- Location: Iasi
- Contact:
Re: Cum inchid documentele la OnFileNew si OnFileOpen ?
Se poate si asa dar nu are rost.bu7ch3r wrote:Nu sunt specialist in aplicatii MDI dar ma gandesc ca de fiecare data cand faci Open la un fisier poti sa iei handle la el sau sa salvezi ce ai deschis ca pe urma la apelul lui OnFileOpen sa decizi ce vrei sa inchizi ?
Framework-ul isi tine liste cu ce deschide, altfel n-ar sti nici el cu ce lucreaza.
Poti oricand sa te uiti in ele si sa iei ce ai nevoie, ca in exemplul care l-am dat mai sus.
Ovidiu
Follow http://twitter.com/#!/ovidiucucu
Weblog: http://codexpert.ro/blog/author/ovidiu-cucu/
Visit FAQ, Tips & Tricks
Follow http://twitter.com/#!/ovidiucucu
Weblog: http://codexpert.ro/blog/author/ovidiu-cucu/
Visit FAQ, Tips & Tricks
Re: Cum inchid documentele la OnFileNew si OnFileOpen ?
Încearcă şi această secvenţă:
Dacă se face în clasa derivată din CWinApp atunci nu e nevoie de AfxGetApp().
Code: Select all
if( AfxGetApp()->SaveAllModified()) AfxGetApp()->CloseAllDocuments(FALSE);
- Ovidiu Cucu
- Fondator
- Posts: 3778
- Joined: 11 Jul 2007, 16:10
- Judet: Iaşi
- Location: Iasi
- Contact:
Re: Cum inchid documentele la OnFileNew si OnFileOpen ?
Super!Viorel wrote:Încearcă şi această secvenţă:
Dacă se face în clasa derivată din CWinApp atunci nu e nevoie de AfxGetApp().Code: Select all
if( AfxGetApp()->SaveAllModified()) AfxGetApp()->CloseAllDocuments(FALSE);

Ovidiu
Follow http://twitter.com/#!/ovidiucucu
Weblog: http://codexpert.ro/blog/author/ovidiu-cucu/
Visit FAQ, Tips & Tricks
Follow http://twitter.com/#!/ovidiucucu
Weblog: http://codexpert.ro/blog/author/ovidiu-cucu/
Visit FAQ, Tips & Tricks
-
- Membru++
- Posts: 687
- Joined: 10 Sep 2008, 21:40
- Judet: Cluj
Re: Cum inchid documentele la OnFileNew si OnFileOpen ?
Aplicatia mea poate serializa fisiere de tip xyz in/de pe disc (reprezentate intr-un view de tip CView). Insa in interiorul aplicatiei mai am nevoie si de un alt tip de view (CHtmlView de exemplu), iar asa cum am mai facut si in alte cazuri, atasez la fiecare tip de view cate un tip de document dar pe care nu il serializez. Acuma, eu am grija ca fiecare tip de document sa fie deschis o singura data, (asta nu e o problema, pentru ca pe langa view-uri de tip CView si CHtmlView mai am view-uri de tip CListView, etc.). Insa toate aceste documente deschise as vrea sa le inchid daca user-ul vrea sa creeze/deschide un nou document de tip xyz ...
-
- Membru++
- Posts: 687
- Joined: 10 Sep 2008, 21:40
- Judet: Cluj
Re: Cum inchid documentele la OnFileNew si OnFileOpen ?
Imi puteti explica comportamentul de mai jos ?
daca nu am nici un document deschis, si incerc sa creez/deschid un document programul trece prin CMyDoc::OnNewDocument / CMyDoc::OnOpenDocument si creez/deschid un document, dupa aceea degeaba mai incerc sa creez/deschid un alt document, codul trece prin CMyDoc::OnFileNew / CMyDoc::OnFileOpen, fara nici un efect (nu mai pot crea/deschide un alt document) ... de ce ?
Multumesc.
Code: Select all
void CMyDoc::OnFileNew()
{
// TODO: Add your command handler code here
TRACE("CMyDoc::OnFileNew\n");
}
void CMyDoc::OnFileOpen()
{
// TODO: Add your command handler code here
TRACE("CMyDoc::OnFileOpen\n");
}
BOOL CMyDoc::OnNewDocument()
{
if(! CDocument::OnNewDocument())return FALSE;
TRACE("CMyDoc::OnNewDocument\n");
// TODO: add reinitialization code here
// (SDI documents will reuse this document)
return TRUE;
}
BOOL CMyDoc::OnOpenDocument(LPCTSTR lpszPathName)
{
if(! CDocument::OnOpenDocument(lpszPathName))return FALSE;
TRACE("CMyDoc::OnOpenDocument\n");
// TODO: Add your specialized creation code here
return TRUE;
}
Multumesc.
- Ovidiu Cucu
- Fondator
- Posts: 3778
- Joined: 11 Jul 2007, 16:10
- Judet: Iaşi
- Location: Iasi
- Contact:
Re: Cum inchid documentele la OnFileNew si OnFileOpen ?
Mai bine lasi un pic OnNewDocument si OnOpenDocument in pace si pornesti la drum asa:
// Am "furat" putin de la Viorel. 
Code: Select all
void CTest_MDIApp::OnFileNew()
{
SaveAllModified();
CloseAllDocuments(FALSE);
POSITION posTemplate = GetFirstDocTemplatePosition();
while(NULL != posTemplate)
{
CDocTemplate* pDocTemplate = GetNextDocTemplate(posTemplate);
pDocTemplate->OpenDocumentFile(NULL);
}
}
Code: Select all
void CTest_MDIApp::OnFileOpen()
{
SaveAllModified();
CloseAllDocuments(FALSE);
CWinApp::OnFileOpen();
POSITION posTemplate = GetFirstDocTemplatePosition();
if(NULL != posTemplate)
{
GetNextDocTemplate(posTemplate); // skip first document
while(NULL != posTemplate)
{
CDocTemplate* pDocTemplate = GetNextDocTemplate(posTemplate);
pDocTemplate->OpenDocumentFile(NULL);
}
}
}

Ovidiu
Follow http://twitter.com/#!/ovidiucucu
Weblog: http://codexpert.ro/blog/author/ovidiu-cucu/
Visit FAQ, Tips & Tricks
Follow http://twitter.com/#!/ovidiucucu
Weblog: http://codexpert.ro/blog/author/ovidiu-cucu/
Visit FAQ, Tips & Tricks
-
- Membru++
- Posts: 687
- Joined: 10 Sep 2008, 21:40
- Judet: Cluj
Re: Cum inchid documentele la OnFileNew si OnFileOpen ?
OnFileNew merge bine, dar OnFileOpen crapa daca are un document deschis ... am atasat un mic demo ...
- Attachments
-
- Test.zip
- (81.65 KiB) Downloaded 316 times