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
-
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
-
@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 ?
-
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?
-
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!