CFileDialog::GetFolderPath
-
Call this member function to retrieve the path of the currently open folder or directory for an Explorer-style Open or Save As common dialog box.
CFileDialog dlg(TRUE,NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, NULL, NULL);
m_TASM_Pfad = dlg.GetFolderPath();
so leider bekomme ich eine Absage wenn ich den Pfad haben will, ich kann mir aber nicht erklären was falsch ist
-
Absage?
-
funktioniert nicht
-
funktioniert nicht??
-
hä?? schrieb:
funktioniert nicht??
Troll
-
Borher auch dlg.DoModal() gemacht?
Gruss
EB
-
ja hab ich, es gibt beim Anwenden ein problem
if (GetParent()->SendMessage(CDM_GETFOLDERPATH, (WPARAM)MAX_PATH, (LPARAM)strResult.GetBuffer(MAX_PATH)) < 0)
in
dlgfile.cppwenn es jemand ganz genau wissen will
ich kann mir ja auch ohne Probleme die Endung oder den Namen der gewählten Datei anzeigen lassen, also bis dahin ist alles richtig... nur den Pfad kann ich mir nicht anzeigen lassen
-
steff3 schrieb:
hä?? schrieb:
funktioniert nicht??
Troll
*LOL*
-
Was mich immer wieder erschüttert sind Programmierer, die keine brauchbare Fehlerbeschreibung liefern können. Was du da bekommst heißt nicht "Absage", sondern "Assert".
CDM_GETFOLDERPATH liefert dir den ausgewählten Pfad während der Dialog offen ist (wenn du eine Callback-Funktion angegeben hast), und dann auch nur wenn der Dialog mit OFN_EXPLORERSTYLE erzeugt wurde.
Nach dem DoModal-Aufruf mußt du den Pfad aus dlg.GetPathName() herausziehen.
-
peterchen schrieb:
Was mich immer wieder erschüttert sind Programmierer, die keine brauchbare Fehlerbeschreibung liefern können. Was du da bekommst heißt nicht "Absage", sondern "Assert".
CDM_GETFOLDERPATH liefert dir den ausgewählten Pfad während der Dialog offen ist (wenn du eine Callback-Funktion angegeben hast), und dann auch nur wenn der Dialog mit OFN_EXPLORERSTYLE erzeugt wurde.
Nach dem DoModal-Aufruf mußt du den Pfad aus dlg.GetPathName() herausziehen.
und wie erzeuge ich einen Dialog mit OFN_EXPLORERSTYLE?
-
steff3 schrieb:
peterchen schrieb:
Was mich immer wieder erschüttert sind Programmierer, die keine brauchbare Fehlerbeschreibung liefern können. Was du da bekommst heißt nicht "Absage", sondern "Assert".
CDM_GETFOLDERPATH liefert dir den ausgewählten Pfad während der Dialog offen ist (wenn du eine Callback-Funktion angegeben hast), und dann auch nur wenn der Dialog mit OFN_EXPLORERSTYLE erzeugt wurde.
Nach dem DoModal-Aufruf mußt du den Pfad aus dlg.GetPathName() herausziehen.
und wie erzeuge ich einen Dialog mit OFN_EXPLORERSTYLE?
ist das eine scherzfrage?
-
Hi, ich habe mir den MFC-Quelltext einmal angesehen. Die Assertion kommt,
weil das FileDialog-Window nicht mehr existiert.
GetFolderPath wird also intern vom Control verwendet, während der Dialog
angezeigt wird. Die Funktion sollte eigentlich eher protected statt public sein!Was tun? Entweder GetPathName verwenden, oder du leitest deine eigene Klasse
von CFileDialog ab und überschreibst OnFolderChange und GetFolderPath.Header:
#pragma once // CMyFileDialog class CMyFileDialog : public CFileDialog { DECLARE_DYNAMIC(CMyFileDialog) public: CMyFileDialog(BOOL bOpenFileDialog, // TRUE for FileOpen, FALSE for FileSaveAs LPCTSTR lpszDefExt = NULL, LPCTSTR lpszFileName = NULL, DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, LPCTSTR lpszFilter = NULL, CWnd* pParentWnd = NULL); virtual ~CMyFileDialog(); virtual CString GetFolderPath(); protected: DECLARE_MESSAGE_MAP() CString m_strPath; protected: virtual void OnFolderChange(); };
Implementierung:
// MyFileDialog.cpp : implementation file // #include "stdafx.h" #include ".\myfiledialog.h" // CMyFileDialog IMPLEMENT_DYNAMIC(CMyFileDialog, CFileDialog) CMyFileDialog::CMyFileDialog(BOOL bOpenFileDialog, LPCTSTR lpszDefExt, LPCTSTR lpszFileName, DWORD dwFlags, LPCTSTR lpszFilter, CWnd* pParentWnd) : CFileDialog(bOpenFileDialog, lpszDefExt, lpszFileName, dwFlags, lpszFilter, pParentWnd) { } CMyFileDialog::~CMyFileDialog() { } BEGIN_MESSAGE_MAP(CMyFileDialog, CFileDialog) END_MESSAGE_MAP() // CMyFileDialog message handlers CString CMyFileDialog::GetFolderPath() { return m_strPath; } void CMyFileDialog::OnFolderChange() { m_strPath = CFileDialog::GetFolderPath(); CFileDialog::OnFolderChange(); }
Finde ich eigentlich am saubersten, die Abgeleitete Version.
Zudem kann man einen optimierten Konstruktor schreiben, damit der Aufruf
im Programm nicht ständig alle lästigen Parameter benötigt.Gruss
EB
-
@Steff3: was willst du eigentlich erreichen?
-
peterchen schrieb:
@Steff3: was willst du eigentlich erreichen?
der benutzer soll nicht den pfad von hand eintippen müssen, sondern soll ihn sich mit hilfe des dialoges suchen und wenn er dann seine wahl getroffen hat würde ich ihn gerne haben
-
Dann mußt du (wie schon vorgeschlagen) GetPathName() auswerten, und diesen beim nächsten Aufruf wieder reingeben.
-
EB schrieb:
Hi, ich habe mir den MFC-Quelltext einmal angesehen. Die Assertion kommt,
weil das FileDialog-Window nicht mehr existiert.
GetFolderPath wird also intern vom Control verwendet, während der Dialog
angezeigt wird. Die Funktion sollte eigentlich eher protected statt public sein!Was tun? Entweder GetPathName verwenden, oder du leitest deine eigene Klasse
von CFileDialog ab und überschreibst OnFolderChange und GetFolderPath.Header:
#pragma once // CMyFileDialog class CMyFileDialog : public CFileDialog { DECLARE_DYNAMIC(CMyFileDialog) public: CMyFileDialog(BOOL bOpenFileDialog, // TRUE for FileOpen, FALSE for FileSaveAs LPCTSTR lpszDefExt = NULL, LPCTSTR lpszFileName = NULL, DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, LPCTSTR lpszFilter = NULL, CWnd* pParentWnd = NULL); virtual ~CMyFileDialog(); virtual CString GetFolderPath(); protected: DECLARE_MESSAGE_MAP() CString m_strPath; protected: virtual void OnFolderChange(); };
Implementierung:
// MyFileDialog.cpp : implementation file // #include "stdafx.h" #include ".\myfiledialog.h" // CMyFileDialog IMPLEMENT_DYNAMIC(CMyFileDialog, CFileDialog) CMyFileDialog::CMyFileDialog(BOOL bOpenFileDialog, LPCTSTR lpszDefExt, LPCTSTR lpszFileName, DWORD dwFlags, LPCTSTR lpszFilter, CWnd* pParentWnd) : CFileDialog(bOpenFileDialog, lpszDefExt, lpszFileName, dwFlags, lpszFilter, pParentWnd) { } CMyFileDialog::~CMyFileDialog() { } BEGIN_MESSAGE_MAP(CMyFileDialog, CFileDialog) END_MESSAGE_MAP() // CMyFileDialog message handlers CString CMyFileDialog::GetFolderPath() { return m_strPath; } void CMyFileDialog::OnFolderChange() { m_strPath = CFileDialog::GetFolderPath(); CFileDialog::OnFolderChange(); }
Finde ich eigentlich am saubersten, die Abgeleitete Version.
Zudem kann man einen optimierten Konstruktor schreiben, damit der Aufruf
im Programm nicht ständig alle lästigen Parameter benötigt.Gruss
EBso funktioniert es
-
Hallo,
ich möchte dass wenn ich ein Verzeichnis ausgewählt habe und auf "Öffnen" klicke, der Dialog geschlossen wird, so dass ich mir dann mit GetFolderPath den Pfad holen kann. Jetzt ist das aber so, dass nicht der Dialog geschlossen wird, sondern er wechselt in das ausgewählte Verzeichnis.
-
Sachma, kann es sein, das du einen Dialog zum öffnen eines Ordners und nicht einer DAtei haben willst?! Dann geb ich dir nen Tipp: SHBrowseForFolder
CFileDialog´, sollte net funzen...
-
Vielleicht etwas spät, aber es geht auch anders. Übergeb bei *Cwnd einfach nicht "NULL" sondern das hwnd deines fensters und es klapt
CFileDialog fileDlg(TRUE, _T("*txt"), _T("Text"),OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, m_dlgFilter, this); ... m_edit_output = fileDlg.GetPathName();