Newsgroup: it.comp.lang.c++
Titolo: [VC++]Inizializzazione di controlli

[in questi giorni sto bombardando la ml ....scusate!]
Ho creato un'applicazione SDI basata su FormView in cui ho inserito
dall'editor di risorse un controllo CListCtrl.
Ora non so dove mettere le istruzioni per inserire le colonne al controllo
tramite CListCtrl::InsertColumn(.....).
Ho provato nella CMyFormView::OnCreate ma causa un errore allora l'ho
spostato nella CFormView::OnPaint e con l'ausilio di una variabile BOOL che
verifica che l'inizializzazione non sia già stata fatta funziona.
Però non mi piace.
Qual'è il posto giusto in cui mettere questo tipo di informazioni?
Grazie.
Emanuele.
~~~~~~~~~~~~~~~~>))))°>~~~~~~~~~~~~~~
b0nu$2000
bo...@numerica.it
http://wurstel.ing.unibs.it/~bonus
http://www.geocities.com/SiliconValley/Lakes/4313
ICQ : 3627899
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

...


Qual'è il posto giusto in cui mettere questo tipo di informazioni?
Dipende...
Ecco come funziona in sintesi il meccaismo del
framework MFC:
1. La vista viene creata come oggetto C++
(new CMyFormView)
2. dell'oggetto CMyFormView creato e' richiamata la
funzione membro virtuale CreateView.
3. l'oggetto CMyFormView my form view ha ora
l'opportunita' di gestire il messaggio WM_CREATE.
Tutti i controlli del form view sono gia' stati creati,
solo che non puoi accederci tramite gli oggetti C++ che
hai associato (di norma con il class wizard).
Questo significa che se hai un oggetto di tipo
CEdit m_edit e uno di tipo CListCtrl m_listCtrl,
non li puoi ancora usare, perche', nonstane esistano
gia' i controlli veri e propri, non sono stati ancora
"agganciati" agli oggetti C++ corrispondenti.
4. Viene chiamato dal framework il metodo OnInitialUpdate.
di CMyFormView. Questo viene richiamato ad OGNI
inizializazione del documento associato alla vista.
Ovvero verra' richiamato UNA SOLA volta se il tuo
progetto e' di tipo MDI (poiche' verra' creato un frame
per ogni documento --> per tutta la sua "vita" il frame e'
associato ad un solo documento).
Se il tuo progetto e' di tipo SDI, invece, OnInitialUpdate
verra' richiamato  AD OGNI evento "open document" o
"new document", poiche' esiste un solo frame che verra'
recuperato per tutti i documenti che verranno aperti e
inizializati nuovi per tutta la vita dell'applicazione.
Nell'implementazione di default di OnInitialUpdate, viene
effettuato "l'aggancio" (tramite la funzione DoDataExchange)
dei controlli windows agli oggetti C++ corrispondenti.
Avviene quello che in Windows si chiama subclassing.
Solo ora (dopo avere chiamto la OnInitialUpdate della classe
base (CFormView) puoi accedere ai controlli tramite chiamate
alle funzioni degli oggetti corrispondenti
(es. m_listCtrl, m_edit).
Ora dovresti avere due garanzie:
-Gli oggetti "controllo" sono utilizzabili.
-Il documento e' correttamente inizializzato.
(e' stato chiamato OnNewDocument o OnOpenDocument).
Ora se vuoi che la tua vista (CMyFormView) sia indipendente
dal contesto dell'applicazione (SDI o MDI) e quindi
riutilizzabile in altri progetti, devi tenere d'acconto
che il metodo OnInitialUpdate puo' essere richiamato piu'
volte (ad esempio ad ogni apertura del documento).
Ti consiglio quindi di effettuare le tue inizializzazioni
sempre nel contesto dell'OnInitialUpdate, con l'accortezza
di suddividerle in due: Le inizializzazioni che dovranno
essere fatte una volte sola (es creazione colonne list
control), e quelle che dipendono dal documento (esempio
riempimento rige del list control).
Oreste Notelli