Newsgroup: it.comp.programmare.win32
Titolo: CPropertySheet, CPropertyPage e CListCtrl

Linguaggio: Visual C   6.0
-----
Una finestra delle proprietà (CPropertySheet) ha diverse
pagine delle proprietà (CPropertyPage) e, in una di queste, è
posizionato un list control (CListCtrl) in modalità report
già impostato in fase di design time. In fase di runtime
desidero popolarlo di colonne (header) e il procedimento che
regolarmente funziona in una normalissima dialog box qui,
invece, non funziona. Da premettere che tale codice lo
inserisco nella funzione virtuale OnInitDialog della classe
CPropertySheet.
// inizializzazione del list control
static CString HeaderPass [5] =
{
   _T("Col01"),
   _T("Col02"),
   _T("Col03"),
   _T("Col04"),
   _T("Col05"),
};
// Aggiunta delle colonne 
for (int cont = 0; cont < 4; cont  )
// m_page02 è di classe CPropertyPage definito in AppWizard
// m_ctlPasseggeri è di classe CListCtrl definito in 
// AppWizard
   m_page02.m_ctlPasseggeri.InsertColumn (cont, (LPCTSTR)  
HeaderPass[cont], LVCFMT_LEFT, 100);
e non funziona neanche questa tecnica:
CListCtrl wnd;
// IDC_PASSEGGERI è l'ID del list control
wnd.Attach(GetDlgItem(IDC_PASSEGGERI)->m_hWnd);
wnd.InsertColumn(0, (LPCTSTR) HeaderPass[1], LVCFMT_LEFT,
100);
wnd.Detach();
Dove è l'errore? Grazie, Sergio

 CPropertySheet.
[CUT]
Potrebbe effettivamente non funzionare.
Faccio un'ipotesi; non è detto che il CPropertySheet crei tutte le
CPropertyPage.
Anzi se non sbaglio in genere è così.
Il CPropertySheet crea le pagine alla prima visualizzazione di esse.
In altre parole se il CPropertySheet deve visualizzare 5 pagine, a runtime
normalmente si posiziona sulla prima.
Solo la prima è stata creata, le altre vengono create successivamente quando
agisci sul tab per cambiare pagina.
Questo è il motivo principale per cui solitamente l'inizializzazione degli
elementi di una pagina viene fatta
nel OnInitDialog della pagina stessa.
Il tuo codice quindi dovrebbe essere posizionato nella OnInitDialog del
CPropertyPage che contiene il list-control.
CMyPropertyPage::OnInitDialog( )
{
    CPropertyPage::OnInitDialog( )
for (int cont = 0; cont < 4; cont ++ )
   m_ctlPasseggeri.InsertColumn (cont, (LPCTSTR)  HeaderPass[cont],
LVCFMT_LEFT, 100);
}
Dovresti quindi derivare la tua classe CMyPropertyPage da CPropertyPage ed
effettuare l'override del metodo virtuale OnInitDialog.
Ti segnalo anche un'alternativa, che però non ho mai provato.
Settare il PSP_PREMATURE per tutte le property-page prima di creare il
property sheet.
In pratica dove hai la sequenza di addpage, aggiungere anche il flag.
Un esempio potrebbe essere:
propsheet.AddPage(&pag1);
pag1.m_psp.dwFlags |= PSP_PREMATURE;
propsheet.AddPage(&pag2);
pag2.m_psp.dwFlags |= PSP_PREMATURE;
propsheet.AddPage(&pag3);
pag3.m_psp.dwFlags |= PSP_PREMATURE;
.....
propsheet.AddPage(&pagn);
pagn.m_psp.dwFlags |= PSP_PREMATURE;
Dovrebbe forzare la creazione di tutte le pagine al momento della creazione
del property-sheet, ed il tuo codice dovrebbe funzionare.
da MSDN
PSP_PREMATURE
Version 4.71. Causes the page to be created when the property sheet is
created. If this flag is not specified, the page will not be created until
it is selected the first time.
Ciao
Porlock