Cum inchid documentele la OnFileNew si OnFileOpen ?

Intrebari legate de programarea cu biblioteci precum MFC, ATL, WTL si GDI+.
mesajflaviu
Membru++
Membru++
Posts: 687
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Cum inchid documentele la OnFileNew si OnFileOpen ?

Post by mesajflaviu » 24 Aug 2011, 20:18

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 ?



User avatar
Silviu Ardelean
Senior
Senior
Posts: 1175
Joined: 12 Jul 2007, 09:22
Judet: Timiş
Location: Timisoara
Contact:

Re: Cum inchid documentele la OnFileNew si OnFileOpen ?

Post by Silviu Ardelean » 24 Aug 2011, 22:55

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.

mesajflaviu
Membru++
Membru++
Posts: 687
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Cum inchid documentele la OnFileNew si OnFileOpen ?

Post by mesajflaviu » 25 Aug 2011, 07:56

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 ...

User avatar
Silviu Ardelean
Senior
Senior
Posts: 1175
Joined: 12 Jul 2007, 09:22
Judet: Timiş
Location: Timisoara
Contact:

Re: Cum inchid documentele la OnFileNew si OnFileOpen ?

Post by Silviu Ardelean » 25 Aug 2011, 08:17

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).

mesajflaviu
Membru++
Membru++
Posts: 687
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Cum inchid documentele la OnFileNew si OnFileOpen ?

Post by mesajflaviu » 25 Aug 2011, 08:39

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.

User avatar
Silviu Ardelean
Senior
Senior
Posts: 1175
Joined: 12 Jul 2007, 09:22
Judet: Timiş
Location: Timisoara
Contact:

Re: Cum inchid documentele la OnFileNew si OnFileOpen ?

Post by Silviu Ardelean » 25 Aug 2011, 09:20

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?).

User avatar
bu7ch3r
Membru++
Membru++
Posts: 326
Joined: 17 May 2011, 15:17
Judet: Iaşi
Location: Sofia
Contact:

Re: Cum inchid documentele la OnFileNew si OnFileOpen ?

Post by bu7ch3r » 25 Aug 2011, 09:48

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

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Cum inchid documentele la OnFileNew si OnFileOpen ?

Post by Ovidiu Cucu » 25 Aug 2011, 09:58

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);
            }
         }
      }
   }
}

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Cum inchid documentele la OnFileNew si OnFileOpen ?

Post by Ovidiu Cucu » 25 Aug 2011, 10:15

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 ?
Se poate si asa dar nu are rost.
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.

Viorel
Microsoft MVP
Microsoft MVP
Posts: 293
Joined: 13 Jul 2007, 12:26

Re: Cum inchid documentele la OnFileNew si OnFileOpen ?

Post by Viorel » 25 Aug 2011, 10:25

Încearcă şi această secvenţă:

Code: Select all

if( AfxGetApp()->SaveAllModified()) AfxGetApp()->CloseAllDocuments(FALSE);
Dacă se face în clasa derivată din CWinApp atunci nu e nevoie de AfxGetApp().

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Cum inchid documentele la OnFileNew si OnFileOpen ?

Post by Ovidiu Cucu » 25 Aug 2011, 10:44

Viorel wrote:Încearcă şi această secvenţă:

Code: Select all

if( AfxGetApp()->SaveAllModified()) AfxGetApp()->CloseAllDocuments(FALSE);
Dacă se face în clasa derivată din CWinApp atunci nu e nevoie de AfxGetApp().
Super! :thumbup:

mesajflaviu
Membru++
Membru++
Posts: 687
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Cum inchid documentele la OnFileNew si OnFileOpen ?

Post by mesajflaviu » 25 Aug 2011, 11:08

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 ...

mesajflaviu
Membru++
Membru++
Posts: 687
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Cum inchid documentele la OnFileNew si OnFileOpen ?

Post by mesajflaviu » 25 Aug 2011, 19:57

Imi puteti explica comportamentul de mai jos ?

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;
}

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.

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Cum inchid documentele la OnFileNew si OnFileOpen ?

Post by Ovidiu Cucu » 25 Aug 2011, 20:29

Mai bine lasi un pic OnNewDocument si OnOpenDocument in pace si pornesti la drum asa:

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);
      }
   }
}
// Am "furat" putin de la Viorel. :)

mesajflaviu
Membru++
Membru++
Posts: 687
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Cum inchid documentele la OnFileNew si OnFileOpen ?

Post by mesajflaviu » 25 Aug 2011, 21:51

OnFileNew merge bine, dar OnFileOpen crapa daca are un document deschis ... am atasat un mic demo ...
Attachments
Test.zip
(81.65 KiB) Downloaded 294 times

Post Reply