Newsgroup: it.comp.programmare.win32
Titolo: [Visual C++ 6.0] Dubbio su applicazione MDI

Stò sviluppando un'applicazione MDI avente un'unica classe documento e più
classi visualizzazione che vengono mostrate all'interno del frame principale
(CMDIFrameWnd). Per poter aggiungere una seconda classe visualizzazione ho
modificato il modello di documento o meglio ho aggiunto un secondo modello
di documento al principale  in questo modo:
public
    CMultiDocTemplate*  m_pTemplateSecondView;
nella funzione virtuale InitInstance della classe applicazione:
m_pTemplateSecondView = new CMultiDocTemplate (
    ID_MYAPP,
    RUNTIME_CLASS (CMyDoc),
    RUNTIME_CLASS (CChildFrame),
    RUNTIME_CLASS (CMySecondVuew));
e nella funzione virtuale ExitInstance ho cancellato l'oggetto
m_pTemplateSecondView.
Prima domanda: non è necessario richiamare la funzione AddDocTemplate la
seconda volta in quanto il documento utilizzato nel secondo modello è
identico a quello utilizzato nel primo modello? E' vero questa mia ipotesi?
Ok, continuiamo! Per poter creare la mia seconda vista ho aggiunto una nuova
voce di menu nel menu Finestra ,disponibile in tutte le applicazioni MDI
nella classe CMDIFrameWnd, (Crea seconda vista) mappata alla funzione che
riporto qui sotto:
void CMainFrame::OnGradoNewView()
{
 TRACE0("RICHIAMATA la funzione CMainFrame::OnGradoNewView()\n");
 // Salva un puntatore alla finestra MDI child attiva
 CMDIChildWnd* pActiveChild = MDIGetActive();
 CDocument* pDocument;
 // risale al documento dell'applicazione
 pDocument = pActiveChild->GetActiveDocument();
 if (pActiveChild == NULL || pDocument == NULL) {
  TRACE0("Attenzione: nessun documento attivo\n");
  AfxMessageBox(AFX_IDP_COMMAND_FAILURE);
  return; // comando fallito
 }
 // altrimenti l'applicazione dispone di un nuovo frame
 CDocTemplate* pTemplate = ((CFlightApp*) AfxGetApp())->m_pTemplateGrado;
 ASSERT_VALID(pTemplate);
 CFrameWnd* pFrame = pTemplate->CreateNewFrame(pDocument, pActiveChild);
 if (pFrame == NULL) {
  TRACE0("Attenzione: fallita la creazione del nuovo frame\n");
  AfxMessageBox(AFX_IDP_COMMAND_FAILURE);
  return; // comando fallito
 }
 // abilita la nuova vista alla chiamata della funzione OnInitialUpdate
 pTemplate->InitialUpdateFrame(pFrame, pDocument);
}
Come si può vedere dal codice della funzione qui sopra è necessario avere
aperta almeno una finestra dellla prima visualizzazione altrimenti
l'applicazione non sa come salvarsi il frame. Ma come devo fare se decidessi
di chiudere la finestra con la prima visualizzazione e volessi aprire una
visualizzazione del secondo tipo? Come faccio a risalire al frame? Con
GetParetFrame?
Grazie dell'aiuto
Sergio Mola

 identico a quello utilizzato nel primo modello? E' vero questa mia
ipotesi?
No, non e' necessario.  Dipende comunque, come vuoi che il programma
funzioni.  Devi decidere le due visualizzazioni debbano essere attivi
contemporaneamente, se l' utente possa cambiare la visualizzazione dopo aver
aperto il documento, o se l' utente debba scegliere una visualizzazione
quando viene aperto il documento.

Ma se ci sono due visualizzazioni, quale viene scelta quando apri il
documento?

 quando viene aperto il documento.
Non mi è chiara questa tua risposta. L'applicazione deve sì avere un'unica
classe derivata da CDocument ma in essa io dichiaro più oggetti recordset
per la gestione di tabelle DB. In realtà è come avere più classi documento
ma ho voluto, per semplicità di cose, inserire tutti i miei "dati" in
un'unica classe documento. Poi, a mio piacere, io visualizzo in MDI child
frame una visualizzazione per ciascuna tabella del mio archivio.

Viene aperta la prima visualizzazione tramite la funzione virtuale
OnWindowNew. In realtà, la mia funzione void CMainFrame::OnGradoNewView()
non è altro che un clone della funzione OnWindowNew ma adattata per la
visualizzazione definita nel secondo modello di documento
(m_pTemplateSecondView).
Sergio Mola