Datenfilter in CFileDialog



  • Hallo, ich möchte in einem 'Speichern Unter' Dialogfeld nur einen Datentyp zulassen der sich aber ändern kann.
    Ich hab jetzt volgenden Code:
    (Die FileExt steht in m_strExt.)

    static char BASED_CODE szFilter[] = "Dateien (*.exe)|*.exe||"; // Hier soll sich '.exe' z.B. in '.zip' ändern können.
    CFileDialog m_dFile(FALSE, m_strExt,m_strDatei,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szFilter);
    if(m_dFile.DoModal() == IDOK)
    {
        m_strDatei = m_dFile.GetFileName();
    }
    

    Da ich die m_strExt nicht 'einfach' in die struct-hostend-Variable klemmen kann, brauch ich jetzt Hilfe.

    Big Thx - Spritey



  • Hi!
    Mir ist nicht ganz klar was genau Du machen willst. Soll in dem Speicherndialog unten eine Liste von Dateitypen sein aus der man einen auswählen kann, oder soll es je nach Situation nur einen bestimmten Dateityp geben?



  • Es soll je nach Situation einen Datentyp geben.



  • Hi

    Naja mach doch einfach nen CString und formatiere dort deinen Dateityp. z.B.

    CString s;
    
    s.Format("Dateien (%s)|%s||", szDateiTyp);
    
    static char BASED_CODE szFilter[] = s;
    CFileDialog m_dFile(FALSE, m_strExt,m_strDatei,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szFilter);
    if(m_dFile.DoModal() == IDOK)
    {
        m_strDatei = m_dFile.GetFileName();
    }
    

    szDateityp ist dabei jeweils der Dateityp im String format. 😉

    mfg nobody



  • hmmm
    ich bekomm da den Fehler:
    error C2440: 'initializing' : 'class CString' kann nicht in 'char []' konvertiert werden
    Kein benutzerdefinierter Konvertierungsoperator verfuegbar, der diese Konvertierung durchfuehren kann, oder der Operator kann nicht aufgerufen werden



  • Dann musst du CString in Char konvertieren.
    Steht in der FAQ.

    Devil



  • Machs so:

    CString s;
    s.Format("Dateien (%s)|%s||", szDateiTyp);
    char *szFilter = new char[s.GetLength()+1];
    strcpy(szFilter,s.GetBuffer(s.GetLength()));
    s.ReleaseBuffer();
    CFileDialog m_dFile(FALSE, m_strExt,m_strDatei,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szFilter);
    if(m_dFile.DoModal() == IDOK)
    {
        m_strDatei = m_dFile.GetFileName();
    }
    delete[] szFilter;
    


  • char* CConvert::CStringtoChar(CString str)
    {
        int size = str.GetLength();
        charstr=new char[size+1];
        strcpy(charstr,str.GetBuffer(str.GetLength()));
        str.ReleaseBuffer();
        charstr[size]='\0';
        return charstr; 
    }
    

    So, das müsste klappen.

    Devil



  • Uff. Und wer kümmert sich um das freigeben des Speichers ?! 😮



  • Welcher Speicher? 😉

    Devil



  • Den, den du in der Funktion allokierst!



  • wie sollte ich ihn nach return löschen?
    vorher wäre auch keine gute idee... 🙄
    Oder was sollte die Funktion zurück geben?

    Devil



  • Eben, das ist das Problem bei deiner Funktion 🙂
    Ich würde folgende Möglichkeiten ok finden:
    1.) Meine 😃
    2.) Die Funktion erwartet einen Zeiger auf einen Char, welcher mit NULL initialisiert wurde, dem wird dann Speicher zugewiesen und dann wird er per return zurückgegeben. So könnte der User wissen, dass er den Zeiger selbst löschen muss ... Naja ... da würde aber wahrscheinlihc auhc nciht jeder draufkommen ... oder man übergibt einfach einen char-Zeiger, und die Grösse dieses chararrays und dann wird das dann halt dort reinformatiert. Also im Grunde wie bei funktionen wie strncpy oder strncat ...



  • Ich hab dEUs's Lösung benutzt. Funzt super. Thx


Anmelden zum Antworten