mehrfachauswahl in CFileDialog



  • Hallo

    Wie kann man bei einem Ladendialog (CFileDialog)mit aktivierter Mehrfachauswahl alle Dateinamen in ein CStringArray speichern? Ich habe in der MSDN geschaut und gelesen, das es mit GetStartPosition und GetNextPathName geht aber ich hab nicht genau verstanden wie man das in eine Schleife packt.

    chrische


  • Mod

    CFileDialog dlg;
    ...
    CStringArray astrFiles;
    for (POSITION pos=dlg.GetStartPosition(); pos; )
        astrFiles.Add(dlg.GetNextPathName(pos));
    


  • So in etwa:

    CStringArray strarray;
    CFilDialog FD(...);
    if(FD.DoModal() == IDOK)
    {
        POSITION pos = FD.GetStartPosition( );
        while(pos != NULL)
            strarray.AddTail(FD.GetNextPathName(pos);
    }
    

    is nicht getestet sollte aber so laufen

    gruß



  • Hallo

    Vielen Dank!

    Das wäre vielleicht mal was für die FAQ.

    chrische



  • aber wenn man vorher kein bzw zu wenig buffer reserviert wird das gar nix

    const int BufferSize = 32*1024;
    std::vector<CString>vFiles;
    CFileDialog fOpen(TRUE, NULL, NULL, OFN_ALLOWMULTISELECT | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, "All Files *.*|*.*", NULL, 0);
    fOpen.GetOFN().nMaxFile = BufferSize;
    TCHAR *tcBuffer = new TCHAR[BufferSize];
    SecureZeroMemory(tcBuffer, BufferSize);
    fOpen.GetOFN().lpstrFile = tcBuffer;
    if(IDOK == fOpen.DoModal())
    {
        POSITION pos = fOpen.GetStartPosition();
        while(pos != NULL){
            vFiles.push_back(fOpen.GetNextPathName(pos));
    }
    delete[] tcBuffer;
    tcBuffer = NULL;
    

    //edit, delete vergessen #gg


  • Mod

    @Mr Evil: Warum allokierst Du die 32KB vom Heap und verwendest nicht den Stack? Das spart die die Allokiererei.



  • Martin Richter schrieb:

    @Mr Evil: Warum allokierst Du die 32KB vom Heap und verwendest nicht den Stack? Das spart die die Allokiererei.

    einfach weil ich das so aus der MSDN hab - wuesste nicht was daran verkehrt sein sollte - nachdem es ausgelesen ist und in den vector geschmissen wirds doch eh wieder gekillt

    was wuerdest du vorschlagen ?


  • Mod

    Ist ja in Ordnung. Alerdings vermeide ich die Benutziung des Heaps, wenn es eben auch mit einer Variable auf dem Stack geht.
    Da CFileDialog auf dem Stack liegt hätte ich den entsprechenden Puffer auch auf den Stack gelegt.

    Ist eine reine Stil und Geschmachsfrage:

    const int BufferSize = 32*1024;
    TCHAR cBuffer[BufferSize];
    cBuffer[0] = _T('\0');
    std::vector<CString> vFiles;
    CFileDialog fOpen(TRUE, NULL, NULL, OFN_ALLOWMULTISELECT | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, "All Files *.*|*.*", NULL, 0);
    fOpen.GetOFN().nMaxFile = BufferSize;
    fOpen.GetOFN().lpstrFile = tcBuffer;
    if(IDOK == fOpen.DoModal())
    {
        POSITION pos = fOpen.GetStartPosition();
        while(pos != NULL){
            vFiles.push_back(fOpen.GetNextPathName(pos));
    }
    


  • und 32 kb reichen in jedem Fall?


  • Mod

    Das musst Du Dir selbst beantworten, wieviele Namen hier returniert werden können. In der reinen Theorie kann hier unendlich viel returniert werden.

    Aber auch hir kann man über CommDlgExtendedError und Analyse der ersten beiden Zeichen, die absolut benötigte Buffergröße ermitteln.
    D.h. aber auch: Mehr als 64kb geht sowieso nicht!


Anmelden zum Antworten