CFileDialog -> letzte Pfadangabe vormerken



  • ich glaueb jetzt verstehe ich dein problem (hoffe ich zumindest...)

    du brauchst in der klasse in der deine methode ist die den filedialog aufruft eine membervariable (vom Typ CString) die dann mit dem pfad gefüllt wird, der von CFileDialog zurückgegeben wird. diese kannst du dann deinem filedialog als initdir übergeben, weil die bleibt solange gültig wie dein programm läuft.



  • Genau!
    allerdings möchte ich die Gültigkeit auch nach einem neuen Aufruf des Dialogs behalten.
    Damit ich immer sehen kann, was der aktuelle Pfad ist.

    Tanya



  • ist jetzt dein problem damit gelöst? 😕



  • Eigentlich nicht.
    Ich weiss immer noch nicht, wie ich das am besten umsetze.
    Hast du nicht vielleicht ein Code-Beispiel?

    Tanya



  • ich glaube es wäre besser wenn du noch etwas mehr code posten könntest, da ich noch immer nicht ganz sicher bin, ob ich dein problem richtig erfasst habe.

    wie sieht denn der methodenaufruf aus und in welcher klassen findet der statt? ist deine anwendung dialogbasiert oder sdi/mdi?



  • Hi,
    Ich habe eine dialogbasierte Anwendung.
    In der Methode:

    void CAPIDlg::OnEingabeText1() 
    {
    szFilter ="Text-Dateien|*.txt|HTML-Dateien|*.htm|Word-Dateien|*.doc||";
    	CString sfilename;
    	CFileDialog *m_dlgFile = new CFileDialog(FALSE, NULL, "Repository_Eingabe.txt", OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, szFilter);
    	m_dlgFile->m_ofn.lpstrInitialDir = "C:\\apps\\Flatfiles";
    	m_dlgFile->m_ofn.lpstrTitle = "Datei-speichern...";
    
    	if(m_dlgFile->DoModal() == IDOK)
    	{
    		sfilename = m_dlgFile->GetPathName();
                      m_text1 = m_dlgFile.GetPathName();
    
    	}
    UpdateData(FALSE);
    

    ist ein Button mit dieser Funktion ausgestattet worden.
    Die Variable m_text1 ist ein Edit-Feld, das den aktuellen Pfad sichern soll.
    m_text1 wird dann aber an eine andere Mehtode übergeben, damit die gespeicherte DAtei ausgelesen werden kann.

    Methode:

    CStdioFile fileR(m_text1, CFile::modeRead);
    
    	UpdateData(FALSE);
    	CString fileRep;
    
    	int p1 = 0, p2, zeile = 0;
    
        while(fileR.ReadString(fileRep)) //Einlesen einer Zeile
        {
            for(j=0; j < 5; j++)
            {
                p2 = fileRep.Find(';', p1);
                if (p2 < 0) p2 = fileRep.GetLength();
                array[zeile][j] = fileRep.Mid(p1, p2-p1); 
                p1 = p2+1;
            }
    
            zeile++;
            p1 = 0;
    
        }
        for ( j = 0; j < zeile; j++ )
            m_repository.AddString(array[j][0]);
    
        fileR.Close();
    

    Diese Methode hat als Pfadangabe m_text1.
    Wenn diese Reihenfolge eingehalten wird, klappt das alles auch, aber ich möchte, dass wenn die Anwendung beendet wird, und nochmals aufgerufen wird,
    dieser Pfad automatisch angezeigt wird.

    Wie mach ich das?

    Tanya



  • Wenn du das Nach einem Beenden und erneuten Starten der Anwendung noch "wissen" willst, musst du das auf Platte speichern.

    Dazu nimmst du entweder eine Datei oder die Registry. (Guck dir mal WriteProfileString und ReadProfileString an. Datei kann du ja wie ich vermute.)



  • un diesem zeile solltest du dir auch anschauen, die bereits in deinem programm enthalten sein müsste:

    SetRegistryKey(_T("Vom lokalen Anwendungs-Assistenten generierte Anwendungen"));
    


  • Danke zunächst für die antworten.
    Ich schau mir mal das mal alles an, aber was hat das mit der SetRegistryKey auf sich???
    Wo muss ich die einbinden, und was macht die denn genau??? 😕

    Tanya



  • in der msdn-doku steht:

    Causes application settings to be stored in the registry instead of INI files.

    der mfc-anwendugsassi generiert diese normal automatisch. such doch einfachmal in deinem ganzen projekt nach der methode. (bei mir taucht sie in der MyProgApp::InitInstance() auf)



  • Vielen lieben Dank, hat wunderbar geklappt. 👍

    Grüße Tanya



  • Wenn ich richtig verstanden habe, initialisierst du die Variable in der Dialogklasse, damit ist die Variable natürlich nach Schliessen des Dialogs weg. Da du Textdateien bearbeitest kannst du den Pfad auch nicht in der Datei selber speichern. Also entweder eine Globale Variable anlegen, was auch nicht schön ist, weil nach dem Schliessen des Programms die Einstellung auch wieder weg ist. Also bleibt das Speichern in der Registry:

    SetRegistryKey(_T("R-Section R-Item"));
    CWinApp* pApp = AfxGetApp();
    pApp -> WriteProfileString(R - Section,R - Item, zu speichernder Text);

    und wiederholen mit
    pApp -> ReadProfileString(R - Section



  • hi,

    Vielen Dank, das ist eine sehr schicke Lösung, und funktioniert einwandfrei.
    🙂

    Ich habe aber ein weiteres problem:
    Ich habe ein Datei-speichern-unter-Fenster, das aber nicht speichern kann.
    WEiss net warum!

    Hier ist mal der Code dazu:

    szFilter ="Text-Dateien|*.txt|HTML-Dateien|*.htm|Word-Dateien|*.doc||";
    	CString sfilename;
    	CFileDialog *m_dlgFile = new CFileDialog(FALSE, NULL, "Repository_Eingabe.txt", OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT , szFilter);
    	m_dlgFile->m_ofn.lpstrInitialDir = "C:\\apps\\Flatfiles";
    	m_dlgFile->m_ofn.lpstrTitle = "Datei-speichern...";
    
    	if(m_dlgFile->DoModal() == IDOK)
    	{
    			sfilename = m_dlgFile->GetPathName();	
    	}	
    
    	UpdateData(FALSE);
    

    Kann mir jemand sagen, warum es nicht tut, was es soll?
    Im Explorer wird diese Datei nicht im anderen Pfad angezeigt, sondern bleibt immer noch im selben.

    Tanya



  • Der Filedialog speichert gar nichts, er liefert nur den eingestellten Pfad zurück. Woher sollte er wissen welche Daten wie zu speichern sind? Folgender Code ist bei mir in der IDOK eingebaut um eine Liste von Stings in eine Textdatei zu speichern.

    CString strpath;

    strpath = dlg.GetPathName();

    CStdioFile f;

    int i=0;

    if(f.Open( strpath, CFile::modeWrite |CFile::modeCreate | CFile::typeText|CFile::modeNoTruncate ,NULL ))
    {

    if(f.GetLength( )>2)
    {

    if(AfxMessageBox ("Datei überschreiben ? ", MB_YESNO,0)==IDNO)
    {
    f.Close();
    m_pDlg1 -> OnCancel();
    return;
    }
    else
    {
    f.Close();
    f.Open( strpath, CFile::modeWrite |CFile::modeCreate | CFile::typeText,NULL );
    }
    }

    f.SeekToBegin();

    while(i < num)
    {

    i++;

    f.WriteString(m_strArray.GetAt(i));

    }
    m_pDlg1 -> OnCancel();
    }
    else
    {
    AfxMessageBox ("Datei konnte nicht geöffnet werden !", MB_ICONEXCLAMATION,0);
    }
    f.Close();


Anmelden zum Antworten