Mehrfachauswahl bei CFileDialog



  • hi Leute,

    also folgendes Problem: Ich möchte auf Button Klick, das sich ein CFileDialog zum öffnen von Dateien öffnet, wo ich mehrere Dateien auswählen kann. Ich habe einfach ein CFileDialog angelegt
    CFileDialog dlg(true,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_ALLOWMULTISELECT ,szFilter);
    Mehrere Dateien kann ich dank des "OFN_ALLOWMULTISELECT" Flags schon auswählen. Aber wie fange ich das in einer Variablen auf??? Ziel ist es die gewählten Dateien in ein Listfeld zu bekommen. Aber mit welcher Methode kann ich alle Werte zurückbekommen??? und was für eine Variable muss ich anlegen um die Dateinamen dort zu speichern???

    Hoffe mir kann jemand helfen.

    MFG Spaxx



  • Servus,

    das kannste z.B. so machen:

    TCHAR cFileNames[512];
    	memset(cFileNames,0,sizeof(cFileNames));
    	CString strFileName;
    
    	CFileDialog fileDialog(TRUE, NULL,_T("*.*"), OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_ALLOWMULTISELECT
    							,_T("All files (*.*)|*.*|"));
    	fileDialog.m_pOFN->lpstrFile = (LPSTR)cFileNames;
    	fileDialog.m_pOFN->nMaxFile = sizeof(cFileNames);
    
    	if (fileDialog.DoModal() == IDOK)
    	{
                 //mach was
    	}
    

    in cFileNames stehen nun die Dateinamen mit einer abschließenden \0 drin. Baust dir jetzt noch eine Funktion die dir den cFilenNames auseinander baut. Sieht z.B. so aus:

    cFileNames: Datei.exe\0Datei2.dat\0 usw.
    Suchst in cFileNames nach jeder '\0' und schneidest den kram von \0 aus. Dann hast du die erste Datei. Dann wieder bis zur nächsten '\0' usw.

    Bei Hilfe in die MSDN steht so geschrieben. Hatte das mal vor längerer Zeit gemacht und hatte das auch aus der MSDN.

    Viel Spass
    *winke*
    Hellsgore



  • also mein Problem ist jetzt nur noch: wie bekomme ich die Anzahl der ausgewählten Dateien???

    POSITION pos=fileDialog.GetStartPosition();
    CListBox* pListBox=(CListBox*)GetDlgItem(IDC_LIST1);
    for(int i=0;i<DateienAnzahl;i++)
    {
    temp=fileDialog.GetNextPathName(pos);
    pListBox->AddString(temp);
    }

    dann könnte ich das ja so machen. aslo in einer Schleife. Wenn ich das 3 mal untereinander schreibe kann ich 3 Dateien auswählen. Ich will das aber variabel machen. steht das in einer Variablen von fileDialog?? oder einer Methose???



  • Servus,

    ich habe hier ein kleines Bsp. wie man es machen könnte. Du solltest es aber überprüfen ich hab noch keinen Kaffee *g*:

    TCHAR cFileNames[512];
    memset(cFileNames,0,sizeof(cFileNames));
    CStringArray m_str_arrList; // Das ist ne Member von deiner Klasse natürlich in der .h deklarieren
    
    if (fileDialog.DoModal() == IDOK)
    {
             GetFiles(cFileNames);
    
    	for(int i = 1; i < m_str_arrList.GetCount(); i++)
    	{
    		m_ctrListBox.AddString(m_str_arrList.GetAt(i));
    	}
    }
    

    und dann die Funkion GetFiles:

    void CDeinDlg::GetFiles(TCHAR cFileNames[512])
    {
    	CString strFileName;
    	for (int i = 0; i <= 512; i++)
    	{
    		strFileName += cFileNames[i];
    		if(strFileName == "\0")
    			break;
    
    		if(cFileNames[i] == '\0')
    		{
    			m_str_arrList.Add(strFileName);
    			strFileName.Empty();
    		}	
    	}
    }
    

    Sollte funzen ist aber bestimmt keine Ideallösung. Musst mal gucken....

    *kaffeeholengeht*
    Hellsgore



  • ja soweit funktioniert das. im ersten (0.) Element des CStringArray steht der Pfad drin. Ich hab jetzt den Pfad und den Dateinamen in eine Variable getan, damit man alles komplett im Listenfeld angezeigt bekommt. Aber das sieht so aus: D:\Programme\Microsoft...\My Project\Test\Test Datei.dat
    also zwischen Test und Datei.dat ist ein Leerzeichen. Aber ich brauche ein \
    Habe also das folgender Maßen gemacht:
    for(int i = 1; i < m_str_arrList.GetUpperBound()+1; i++)
    {
    CString t="";
    t.Format("%s%s%s",m_str_arrList.GetAt(0)," ",m_str_arrList.GetAt(i));
    pListBox->AddString(t);
    }

    wenn ich statt " " ein "\" machen, dann kommt ein fehler. sowas mit Zeilenumbruch innerhalb einer Zeile. Aber ich brauche das \ um die Datei am ende zu kopieren.



  • The path of the filename includes the file's title plus the entire directory path. For example, GetPathName will return "C:\FILES\TEXT.DAT" for the file C:\FILES\TEXT.DAT.

    If m_ofn.Flags has the OFN_ALLOWMULTISELECT flag set, this string contains a sequence of null-teminated strings, with the first string being the directory path of the file group selected, followed by the names of all files selected by the user. For this reason, use the GetStartPosition and GetNextPathName member functions to retrieve the next file name in the list.


Anmelden zum Antworten