Dateiauswahl, Pfad in Variable halten



  • Hallo Leute,

    ich bin gerade dabei ein kleines tool zu basteln.
    Dabei erstelle ich ein Mehrfachdialog in der Menüleiste, in dem ich ein Filename mit einem Durchsuchbutten in eine EditBox einlesen kann.

    So weit so gut, nur wenn ich auf ok klicke, ist diese Variable von der Editbox wieder leer.

    Wie mache ich es, dass diese Variable gespeichert bleibt und sogar bei Programmende noch erhalten bleibt.

    Hier einmal der Code...

    void CReg1Seite1::OnFileopen()
    {
    CFileDialog m_ldFile(TRUE);

    // Dialogfeld Öffnen zeigen und Ergebnis auffangen
    if (m_ldFile.DoModal() == IDOK)
    {
    // Gewählten Dateinamen ermitteln
    m_sResults = m_ldFile.GetPathName();
    // Dialogfeld aktualisieren
    UpdateData(FALSE);
    }
    }

    Des weiteren möchte ich noch, dass bei der Auswahl sochn die Dateiendung vorselektirt ist z.b. *.doc.

    Kann mir jemand helfen ??
    Vielen Dank
    Gruß
    andy_mann



  • hi,

    probier mal den Typ der Membervariable auf CEdit zustellen, also als Control. Und dann m_sResults.SetWindowText(m_ldFile.GetPathName());

    vielleicht liegt es ja daran..



  • mmhhh,

    habe ich gemacht, leider kein erfolg..

    hier der geänderte Code.....

    void CReg1Seite1::OnFileopen()
    {
    CFileDialog m_ldFile(TRUE);

    // Dialogfeld Öffnen zeigen und Ergebnis auffangen
    if (m_ldFile.DoModal() == IDOK)
    {
    // Gewählten Dateinamen ermitteln
    m_sResults.SetWindowText(m_ldFile.GetPathName());
    // Dialogfeld aktualisieren
    UpdateData(FALSE);
    }
    }

    Muß ich vielleicht noch was mit dem ok Butten machen ??

    Gruß
    andy_mann



  • Hallo,

    hat hierzu niemand eine Idee ??

    Gruß
    andy_mann



  • Hi

    Speichere den Inhalt der Editbox doch in einer Datei (CFile, oder ini),
    oder in der Registry 😉

    Grüße Rapha



  • Zur Dateiendung:
    Ich poste Dir mal nen Dialog, den ich zum Laden von Txt-Dateien verwende. Da müßtest dann nur alles durch doc ersetzen:

    int nRes = 0;
    
    	CFileDialog fdlg(TRUE,
    		"txt",
    		NULL,	//"*.txt",
    		OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
    		"Textdateien (*.txt)|*.txt|Alle Dateien (*.*)|*.*||");/**/
    	fdlg.m_ofn.lpstrInitialDir = "c:\\";
    	//fdlg.m_ofn.Flags = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST;
    	fdlg.m_ofn.lpstrTitle = fdlg.m_ofn.lpstrInitialDir;
    
    	nRes = fdlg.DoModal();
    	if(nRes == IDOK)
    	{
    		g_cstr_Path = fdlg.GetPathName();
    	}
    	else
    	{
    		g_cstr_Path = "";
    	}
    

    Zu der Sache mit dem Wert behalten auch nachdem die Anwendung geschlossen ist:
    Entweder ini-File oder Registry. Ich würde zu einem Ini-File tendieren.



  • Auf eine Ini-Datei greifst du (u.a.) mit folgen (relevanten) Funktionen zu:

    GetPrivateProfileInt
    GetPrivateProfileString
    WritePrivateProfileInt
    WritePrivateProfileString

    Grüße Rapha



  • Dank schön für den rat,

    habe aber noch ein Problem,

    in einem Dialogfeld, will ich ja natürlich den schon bestehenden pfad drin stehen haben.
    Darum:

    [.h]
    CString test;
    char EinPfad[500];
    WORD destSize;

    [cpp]
    CReg1Seite1::CReg1Seite1() : CPropertyPage(CReg1Seite1::IDD)
    {

    test = GetPrivateProfileString("common","EinPfad","NULL",EinPfad,destSize,"test.ini");
    //{{AFX_DATA_INIT(CReg1Seite1)
    m_sResults = _T(test);
    //}}AFX_DATA_INIT
    }

    Im Dialogfeld kommt nur immer ein eckige O heraus.
    Habe schon die ini an eine andere Stelle verschoben, aber keine besserung.

    Gruß
    andy_mann



  • Hi

    was ist destSize?? Das ist doch gar nicht initialisiert!!!
    Versuchs mal mit

    CReg1Seite1::CReg1Seite1() : CPropertyPage(CReg1Seite1::IDD) 
    { 
    
    test = GetPrivateProfileString("common","EinPfad","NULL",EinPfad,500,"test.ini"); 
    //{{AFX_DATA_INIT(CReg1Seite1) 
    m_sResults = _T(test); 
    //}}AFX_DATA_INIT 
    }
    

    Grüße Rapha



  • Hmmm..

    danke DIr, docj leider kein erfolg.
    Es erscheint eine Eckige 0.

    Was muß man den includen ??

    Gruß
    andy_mann



  • Ohhhh mann,
    ich habe es heraus bekommen.

    GetPrivateProfileString("common","EinPfad","NULL",EinPfad,500,"test.ini");
    //{{AFX_DATA_INIT(CReg1Seite1)
    m_sResults = _T(EinPfad);

    Ist die Lösung und die ini muß anscheinend im Pfad vom Betribssystem unter Windows liegen.

    Weis jemand wie man dass Ändert ??
    Ich möchte gerne, dass die .ini dort liegen muß von wo aus meine .exe aufgerufen wird.

    Gruß
    andy_mann



  • Servus,

    /////////// Pfad erfassen /////////
    CString strPath = GetCommandLine();// Pfad + Name der Exe holen
    int pos = strPath.ReverseFind( '\\'); // letztes '\' finden
    strPath = strPath.Mid(1, pos-1); // Name der Exe abtrennen, so dass nur noch der Pfad übrig bleibt
    //////////////////////////////////
    

    dann hast du dein aktuelles Verzeichnis indem deine *.exe liegt. Im strPath steht der komplette Pfad. Den kannst du ja dann weiterverwenden indem du z.B.

    CString strIni = strPath + "\\Test.ini";
    

    machst. Dann weiss er das die Test.ini in dein Verzeichnis zu liegen hat.

    *winke* 😃
    Hellsgore



  • Ich Danke Dir,

    dass Funzt ja super.

    Aber noch einmal eine Frage.....

    Ich möchte jetzt nicht in jeder .cpp den Pfad suchen lassen, sondern eine art Globale Variable Deklarieren.

    In welchen File erstelle ich denn dies Variable ??
    Habe zur Auswahl:
    file.cpp
    fileDoc.cpp
    fileView.cpp
    MainFrm.cpp
    Reg1.cpp
    Reg1Seite1.cpp
    StdAfx.cpp

    sorry für diese Frage, bin noch ziemlich neu in der MFC.

    Gruß und Danke
    andy_mann



  • Globale Variablen sind Gift in dier OOP 😉
    Machs anderes: Füge eine CString Variable in deiner Applikationklasse ein (die Klasse, die auf App endet und von CWinApp abgeleitet ist). Diese kannst du dann
    in InitInstance mit dem Pfad füllen.

    Du kannst nun von überall aus auf diese Variable zugreifen:
    (Angenommen deine App Klasse heißt CMyApp):

    CMyApp* pApp = (CMyApp*) AfxGetApp();
    pApp->DeineVariable;
    

    Grüße Rapha



  • Ich Danke Dir vielmals,

    wie fülle ich denn nun die Variable ??

    So sieht es jetzt bei mir aus..

    BOOL CFileApp::InitInstance()
    {
    AfxEnableControlContainer();
    pApp = "test.ini";
    ...
    ...
    ..
    .

    funzt aber nicht..

    Gruß und Danke
    andy_mann



  • Hi,

    angenommen du hast folgendes in deiner App "gemacht":

    class CMyApp : public CWinApp
    {
      //blablabla
    public:
      CString m_strIniFileName
    }
    

    Dann ist m_strIniFileName eine stinknormale Membervariable 😉 , auf die du in InitInstance einfach über m_strIniFile = "IniFile.ini" zugreifen kannst.

    Irgendwo anders in deinem Programm schreibst du dann:

    (CMyApp*) pApp = (CMyApp*) AfxGetApp();
    pApp->m_strIniFileName = "AnderesIniFile.ini";
    

    Grüße Rapha



  • Oh vilen Dank,

    Du hilfst mir sehr, dass klappt ja schon recht gut.

    Jetzt muß ich aber trotzdem Nerven, mir ist noch ein fehler aufgefallen.

    Wenn ich den Dialog aufrufe, eine Datei aufrufe, dies auf öffnen, dann auf ok Drücke, speichert er mir dieses in die ini datei.

    Wehle ich nun nochmals neu eine Datei aus, sage aber anschließend Abrechen, speichert er mir trotzdem den so eben ausgewählten string in die ini Datei...

    Ich habe ein Dialogfenster mit mehreren Dialogen intern.

    Hier der Source:

    void CReg1Seite1::OnFileopen()
    {
    CFileDialog m_ldFile(TRUE,
    "txt""csv",
    NULL, //".txt",
    OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
    "Textdateien (
    .txt)|.txt|Textdateien (.csv)|.csv|Alle Dateien (.)|.*||");

    // Dialogfeld Öffnen zeigen und Ergebnis auffangen
    if (m_ldFile.DoModal() == IDOK)
    {
    // Gewählten Dateinamen ermitteln
    m_sResults = m_ldFile.GetPathName();
    CFileApp* pApp = (CFileApp*) AfxGetApp();
    WritePrivateProfileString("common","EinPfad",m_sResults,fPfadZurExe(pApp->m_strIniFile));

    // Dialogfeld aktualisieren
    UpdateData(FALSE);
    }

    }

    Gruß und Danke....
    andy_mann



  • Hi

    speichere den Wert in dem Eingabefeld des Dialoges halt erst, wenn der Dialog beendet wurde (d.h. DoModal in InitInstance) und überprüfe vorher, ob DoModal (in InitInstance) IDOK zurückgegeben hat (wenn ja, speichere den Inhalt mit WritePrivateProfileString ansonsten tu nichts).

    Grüße Rapha



  • danke,

    ich finde nur nirgends einen hinweis, indem ich eine if Schleiffe einbringen kann.

    Ich habe kein einfaches Dialog sondern ein Dialog indem mehrere Dialoge beinhaltet sind. (CPropertySheet).

    Dies wird doch vom System erzeugt und ich weiss nicht wo meine ok abrechen und übernehmen butten sind.

    Mein Übernehmen Button ist auch nicht aktiv.

    Gruß
    andy_mann



  • Hi,

    du rufst den Dialog doch trotzdem in InitInstance mit DoModal auf, oder?

    Diesen Rückgabewert kannst du prüfen, z.B. so:

    int nRet = DeinDialog.DoModal();
    if(nRet == IDCANCEL) // der User hat auf Abbrechen geklickt
    if(nReg == IDOK) // der User hat auf OK geklickt
    

    Grüße Rapha


Anmelden zum Antworten