PDA

Visualizza la versione completa : [C++ e MFC] Dichiarazione di un oggetto CFileDialog


Paulin
12-02-2007, 16:10
Stavo valutando le possibilità di utilizzo della classe CFileDialog, un codice molto utilizzato è quello della dichiarazione esplicita e potrebbe essere questo:



CFileDialog dlg(TRUE, "Text", "*.txt", OFN_FILEMUSTEXIST, szFilters, this );

Tuttavia mi è capitato di incontrare anche la dichiarazione con allocazione:



CFileDialog* dlg = new CFileDialog(TRUE, "Text", "*.txt", OFN_FILEMUSTEXIST, szFilters, this );

Mi chiedevo se c'è qualche ragione particolare per fare una allocazione dell'oggetto CFileDialog, in poche parole quale delle due forme utilizzereste?

A voi la palla!

MItaly
12-02-2007, 16:19
Originariamente inviato da Paulin
Mi chiedevo se c'è qualche ragione particolare per fare una allocazione dell'oggetto CFileDialog, in poche parole quale delle due forme utilizzereste?

Una alloca l'oggetto sullo stack e l'altra sull'heap; tendenzialmente userei la prima (in modo da correre meno rischi di dimenticarmi il delete della seconda), a meno di non trovarmi in situazioni particolari.

Paulin
13-02-2007, 11:43
Si, anche io penso che in questo caso una allocazione automatica sia sufficiente e anche a scanso di equivoci, soprattutto se l'oggetto CFileDialog è contenuto in un blocco ben delimitato all'interno del programma.

Personalmente l'allocazione dinamica la vedrei meglio per oggetti di dimensioni più imprevedibili come ad esempio un CFile (visto che si parla di MFC) o un FileStream, oggetti che potrebbero occupare porzioni di memoria anche molto notevoli, e pertanto una deallocazione esplicita potrebbe diventare molto conveniente.


Ma tornando a CFileDialog, ho un problema con la stringa dei filtri, quel parametro normalmente indicato con lpszFilter o szFilter, faccio subito un esempio:


static char BASED_CODE szFilter[] = "Text Files(*.txt)|*.txt |All Files(*.*)|*.*";
CFileDialog dlg(TRUE, "TempText", "*.txt", OFN_FILEMUSTEXIST, szFilter, this);

if (dlg.DoModal() == IDOK){

// ...

}



Purtroppo accade che all'apertura della finestra di dialogo, nella tendina "Tipo File", mi ritrovo oltre ai miei filtri, una serie di caratteri speciali, il solito sintomo di una memoria sporcata. Sto cercando la soluzione al problema, intanto se qualcuno conoscesse già questo inconveniente e la sua possibile soluzione potrebbe essermi di grande aiuto.

saluti...

MItaly
13-02-2007, 14:40
Originariamente inviato da Paulin
un CFile (visto che si parla di MFC) o un FileStream, oggetti che potrebbero occupare porzioni di memoria anche molto notevoli

Su questo non sarei così sicuro... probabilmente non contengono altro che puntatori a stream (certo non caricano l'intero file in memoria).


Ma tornando a CFileDialog, ho un problema con la stringa dei filtri, quel parametro normalmente indicato con lpszFilter o szFilter, faccio subito un esempio:


static char BASED_CODE szFilter[] = "Text Files(*.txt)|*.txt |All Files(*.*)|*.*";
CFileDialog dlg(TRUE, "TempText", "*.txt", OFN_FILEMUSTEXIST, szFilter, this);

if (dlg.DoModal() == IDOK){

// ...

}



Purtroppo accade che all'apertura della finestra di dialogo, nella tendina "Tipo File", mi ritrovo oltre ai miei filtri, una serie di caratteri speciali, il solito sintomo di una memoria sporcata. Sto cercando la soluzione al problema, intanto se qualcuno conoscesse già questo inconveniente e la sua possibile soluzione potrebbe essermi di grande aiuto.

saluti...
Dalla documentazione delle MFC:


The lpszFilter parameter is used to determine the type of filename a file must have to be displayed in the file list box. The first string in the string pair describes the filter; the second string indicates the file extension to use. Multiple extensions may be specified using ';' as the delimiter. The string ends with two '|' characters, followed by a NULL character. You can also use a CString object for this parameter.

Dunque, modifica la linea


static char BASED_CODE szFilter[] = "Text Files(*.txt)|*.txt |All Files(*.*)|*.*"
così:

static char BASED_CODE szFilter[] = "Text Files(*.txt)|*.txt |All Files(*.*)|*.*||"

Paulin
13-02-2007, 16:04
Originariamente inviato da MItaly
Su questo non sarei così sicuro... probabilmente non contengono altro che puntatori a stream (certo non caricano l'intero file in memoria).
Bene, giusto per sapere quanti panini ho ancora da mangiare prima di avere una idea abbastanza chiara su cosa succede dentro il computer.


static char BASED_CODE szFilter[] = "Text Files(*.txt)|*.txt |All Files(*.*)|*.*||"

Urka!!!
Mi sono dimenticato il carattere NULL al termine della stringa! Se avessi avuto più esperienza mi sarei accorto della distrazione, invece ho cominciato a pensare ad errori fantascientifici!

Ora gira benissimo, grazie dell'aiuto

MItaly
13-02-2007, 17:01
Originariamente inviato da Paulin
Urka!!!
Mi sono dimenticato il carattere NULL al termine della stringa! Se avessi avuto più esperienza mi sarei accorto della distrazione, invece ho cominciato a pensare ad errori fantascientifici!

Ora gira benissimo, grazie dell'aiuto
Prego, ma non ti eri dimenticato il carattere NULL (quello viene aggiunto automaticamente dal compilatore in fondo ad ogni costante stringa che inserisci nel codice), bensì i due caratteri pipe ("|").
:ciauz:

Loading