Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2004
    Messaggi
    286

    [C++ e MFC] Dichiarazione di un oggetto CFileDialog

    Stavo valutando le possibilità di utilizzo della classe CFileDialog, un codice molto utilizzato è quello della dichiarazione esplicita e potrebbe essere questo:

    codice:
    CFileDialog dlg(TRUE, "Text", "*.txt", OFN_FILEMUSTEXIST, szFilters, this );
    Tuttavia mi è capitato di incontrare anche la dichiarazione con allocazione:

    codice:
    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!

  2. #2

    Re: [C++ e MFC] Dichiarazione di un oggetto CFileDialog

    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.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2004
    Messaggi
    286
    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:

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

  4. #4
    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:

    codice:
    	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
    codice:
    static char BASED_CODE szFilter[] = "Text Files(*.txt)|*.txt |All Files(*.*)|*.*"
    così:
    codice:
    static char BASED_CODE szFilter[] = "Text Files(*.txt)|*.txt |All Files(*.*)|*.*||"
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2004
    Messaggi
    286
    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.

    codice:
    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

  6. #6
    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 ("|").
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.