CFileDialog -> letzte Pfadangabe vormerken



  • Hi,
    Ich habe es gerade eingefügt, aber es klappt nicht! 😞
    Die Pfadangabe wird nciht angezeigt, wenn ich den Dialog aufrufe.
    Ich habe es direkt in dieselbe Methode eingefügt.

    Tanya



  • Schade, ich hatte das aus der MSDN geklaut. 😞

    Der Parameter für den Dateinamen ist halt auch für den Pfad zuständig. Probier nochmal ein wenig rum, vielleicht findet er nur den Pfad nicht.

    Was sagt dir der Debugger denn? sieht der Inhalt von m_text2 sinnvoll aus?



  • Wenn ich in der Methode bin, dann wurde der Pfad auch an die Membervariable übergeben. Das ist ja auch soweit einfach.
    Aber die Einstellung muss ja gespeichert werden, wenn der Dialog erneut initialiesiert wird.
    Und da ist logischerweise die Membervariable noch leer.
    Also, wie kann sich diese Variable den Inhalt merken?
    Ich habe da keine AHnung!

    Ich bin schon die ganze Zeit am rumprobieren, aber leider fällt mir nix mehr ein. 😡

    Tanya



  • kann das sein das deine mebervariable gar keine membervariable ist sonder nur eine einfache methodenvariable die natürlich wenn die methode zuende ist auch wieder weg ist bzw. beim erneuten methodenaufruf leer ist?



  • Genauer gesagt ist es ein TExtfeld im Dialog - also eine membervariable.
    Und bei jeder Initialisierung ist diese nicht mehr gefüllt.



  • Genauer gesagt ist es ein TExtfeld im Dialog - also eine membervariable.
    Und bei jeder Initialisierung ist diese nicht mehr gefüllt.



  • 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