提问人:Mark Di Val 提问时间:7/27/2022 更新时间:7/27/2022 访问量:335
如何让OpenDialog在选择文件时更改当前目录?
How to get OpenDialog to change the current directory when a file is selected?
问:
我已经移植了一个 C++Builder 6 应用程序以使用 C++Builder 11 进行编译。
我在测试中发现的一个问题是 TOpenDialog 在两个版本之间的行为不同。
C++Builder 6 版本在单击“打开”时更改当前目录,而 C++Builder 11 版本保持当前目录不变。
我尝试设置 OpenDialog 选项以确保它们不包括 ofNoChangeDir,但这没有区别。
C++ Builder 6 和 11 版本都在 Windows 10 上运行。
我想让 C++ Builder 11 版本更改 Open 上的当前目录,以便下游的所有内容都以相同的方式工作,但到目前为止,通过清除和设置选项,我没有运气。
我可以在 OpenDialog->Execute() 返回后更改当前目录,但是当有应该决定对话框行为的选项时,这似乎有点笨拙。
// Check the current directory before and after the OpenDialog executes ...
String CurrentDirectory = GetCurrentDir();
OpenDialog1->Options.Clear();
OpenDialog1->Options << ofHideReadOnly << ofEnableSizing; // seems to be the default
if (OpenDialog1->Execute())
{
// do whatever
}
CurrentDirectory = GetCurrentDir(); // no change!? :|
答:
行为上的差异是因为这两个版本在后台使用不同的 Win32 API。
在 C++ Builder 6 中,使用 GetOpenFileNameA(),
它有一个默认未启用的标志,因此除非在 .TOpenDialog
OFN_NOCHANGEDIR
ofNoChangeDir
Options
而在 C++ Builder 11 中,在 Vista+ 上使用 IFileOpenDialog
1,它有一个默认启用的标志,因此工作目录不会更改。但是,如果未在 中指定,则禁用。不过,出于安全原因,对话框可能忽略了这一点。因此,在您的情况下,最好在退出后自行设置工作目录。阿拉伯数字TOpenDialog
FOS_NOCHANGEDIR
TOpenDialog
FOS_NOCHANGEDIR
ofNoChangeDir
Options
TOpenDialog::Execute()
1:在 Vista 之前的系统上,或者在 VCL 不支持使用的某些配置下,将改用 - 但这只会在 Vista+ 内部使用。IFileOpenDialog
TOpenDialog
GetOpenFileNameW()
IFileOpenDialog
2:你真的不应该一开始就依赖工作目录。还有其他因素可以在运行时更改工作目录。应始终仅使用绝对路径。
评论
OpenDialog1->Options.Clear();
OpenDialog1->Options = TOpenOptions();
OpenDialog1->Options = TOpenOptions() << ofHideReadOnly << ofEnableSizing;
Options.Clear()
Options
Clear()
Options
Options << ofHideReadOnly << ...
Options
=