CFile - eine Datei wählen
-
Hallo zusammen!
Ich habe einen stinknormalen Dateiauswahldialog mit der Möglichkeit mehrere Dateien auszuwählen. In meinem Prog können bestimmte Dateien geladen werden etc. manchmal mehr, manchmal weniger.
Die gute Nachricht: Es klappt wunderbar wenn ich >= 2 Dateien auswähle.
Die schlechte Nachricht: Wenn ich nur eine Datei öffnen will funzt das net.
void CDlgPage1::OnButtonHANLaden() { SetModified(TRUE); CString pathname; TCHAR cFileNames[1024]; memset(cFileNames,0,sizeof(cFileNames)); CFileDialog fileDialog(TRUE,NULL,NULL,OFN_ALLOWMULTISELECT,("CPA-ErgebnisDatei (*.han)|*.han|")); fileDialog.m_ofn.lpstrFile = (LPSTR)cFileNames; fileDialog.m_ofn.nMaxFile = sizeof(cFileNames); if (fileDialog.DoModal() == IDOK) { GetFiles(cFileNames); for(int i=1; i<m_str_arrList.GetSize(); i++) { pathname = fileDialog.GetPathName(); StartLoadData(m_str_arrList.GetAt(i),pathname); // hier wird die eigentliche Funktion zum "Laden" der Datei aufger. // ich übergebe ihr gleich den Dateinamen und den Pfad } } } void CDlgPage1::GetFiles(TCHAR cFileNames[1024]) { CString strFileName; for (int i=0; i<=1024; i++) { strFileName += cFileNames[i]; if(strFileName == "\0") break; if(cFileNames[i] == '\0') { m_str_arrList.Add(strFileName); strFileName.Empty(); } } }Meine -noch- Vermutung ist das die Trennung der Files im TCHARFeld schuld ist. Bei mehreren Dateien wird ja \0 sozusagen dazwischengeschrieben. Wenn ich nur eine Datei öffne brauch ja gar keine Trennung vorgenommen werden und deshalb findet er auch kein \0 wieder beim Auslesen des Arrays.
Wer kann mit dem Problem was anfangen. Für Lösungsvorschläge oder Ideen wie ich dieses Problem - in welcher Art und Weise auch immer - in den Griff bekomme bin ich verdammt dankbar.
Mit freundlichen sozialistischen Grüßen
RunSeb
-
Du hast schon den ersten Schritt mit der
memset(cFileNames, 0, 1024)gemacht.
Nun must du auch diese Funktion ändern:
void CDlgPage1::GetFiles(TCHAR cFileNames[1024]) { CString strFileName; for (int i=0; i<1024; i++) { strFileName += cFileNames[i]; if(cFileNames[i] == '\0') { if(strlen(strFileName) == 0) break; m_str_arrList.Add(strFileName); strFileName.Empty(); } } }
-
Nee, also das tuts auch nicht.
Wenn ich nen Debug mache und mir dieses Feld mit den Dateinamen anschau fällt mir auf das es mit dem Pfad/Directory der Datei beginnt an die gleich die erste ausgewählte Datei angehängt wird. Weitere Dateien werden dann einfach durch \0 getrennt angehängt ( ohne Pfad ). Also der Pfad steht nur einmal am Anfang, das bedeutet auch das erst nach dem ersten Dateinamen eine Trennung erfolgt. Wenn ich jetzt aber nur eine Datei auswähle brauch gar nichts getrennt
werden.

-
Hast du es ausprobiert?
Die Funktion, die ich geschrieben habe stopt, wenn nichts mehr da ist... Es solte eigentlich funktionieren.... Versuch es damit:
void CDlgPage1::GetFiles(TCHAR cFileNames[1024]) { CString strFileName; for (int i=0; i<1024; i++) { strFileName += cFileNames[i]; if(cFileNames[i] == '\0') { if(strFileName[0] == 0) break; m_str_arrList.Add(strFileName); strFileName.Empty(); } } }Ich hoffe diesmal klappt es.
-
Klar hab ich es probiert. Das was du progst ist verdammt gut gemeint, und auch ne Verkürzung des Progs um 3 Zeilen aber es löst mein Problem mit der Auswahl von nur einer Datei in keinster Weise.
Natürlich habe ich deine Vorschläge auch ausprobiert Squeel, vielen Dank!Ich hab mich nochmal damit befasst und bin dem Error denke ich etwas näher:
Er liegt in der for-Schleife:// blabla.... if (fileDialog.DoModal() == IDOK) { GetFiles(cFileNames); for(int i=1; i<m_str_arrList.GetSize(); i++) // und zwar hier { pathname = fileDialog.GetPathName(); StartLoadData(m_str_arrList.GetAt(i),pathname); } } // ...pallaber pallaber...i wird eins gesetzt und läuft solang durchs Array bis kleiner GetSize()!!!!!

Na, klingelts???

Klar gibts da Probleme wenn ich nur eine Datei auswähle!
Dann ist GetSize() nämlich auch eins wie i!
Leider funzt es aber auch genausowenig wenn ich i auf 0 setze oder GetSize() um 1 inkrementiere.
Falls ich was funzendes hinbekomm, post ich es!
Mit freundlichen sozialistischen Grüßen

RunSeb
-
Liebe Genossen und Genossinnen,
ich freue mich Ihnen mitteilen zu können das Problem soeben gelöst wurde:
memset(cFileNames,0,sizeof(cFileNames)); CFileDialog fileDialog(TRUE,NULL,NULL,OFN_ALLOWMULTISELECT,("CPA-ErgebnisDatei (*.han)|*.han|")); fileDialog.m_ofn.lpstrFile = (LPSTR)cFileNames; fileDialog.m_ofn.nMaxFile = sizeof(cFileNames); if (fileDialog.DoModal() == IDOK) { int size = 0; GetFiles(cFileNames); size = m_str_arrList.GetSize(); if ( size == 1 ) { pathname = fileDialog.GetPathName(); StartLoadData(m_str_arrList.GetAt(0),pathname); } else { for(int i=1; i<m_str_arrList.GetSize(); i++) { pathname = fileDialog.GetPathName(); StartLoadData(m_str_arrList.GetAt(i),pathname); } } }Is zwar noch nicht besonders elegant, aber es funkt erstmal suuper.
Eigentlich simple!Danke nochmal,
RunSeb