delphi - Delphi文件目录选择(来自DLL)在当前应用程序前面带来了其他窗口?
问题描述
我是维护 Delphi 6 旧版软件,它使用 Delphi 2009 DLL 中的以下文件目录选择功能:
function _SelectDirectory(ADirPath: ShortString): ShortString;
var OpenDlg: TFileOpenDialog;
begin
Result:='';
OpenDlg:=TFileOpenDialog.Create(nil);
try
OpenDlg.Options:=OpenDlg.Options+[fdoPickFolders];
if DirectoryExists(ADirPath) then
OpenDlg.DefaultFolder:=ADirPath;
if OpenDlg.Execute then begin
Result:=OpenDlg.FileName;
end;
finally
OpenDlg.Free;
end;
end;
我不能使用Delphi 6的文件目录选择功能,因为Delphi 6没有这个功能,如果有的话,它已经过时且无法使用。所以 - 我正在使用 DLL 中的函数。但在调用此函数后,另一个窗口(可能是 Windows 资源管理器或其他应用程序)变为活动状态并停留在我当前调用目录选择功能的 Delphi 6 应用程序前面。发生了什么以及如何避免这种情况?
当我从 Delphi 2009 应用程序(而不是从 DLL)调用我的 _SelectDirectory 函数时,一切正常,当前应用程序仍然是活动的。因此,使用 DLL 会导致问题。我使用动态加载我的 DLL:
ImpLib:=LoadLibrary(LibraryName);
@TmpSelectDirectory:=GetProcAddress(ImpLib, '_SelectDirectory');
TmpSelectDirectory(ADirPath);
也许我可以通过这种方式将 Delphi 2009 DLL 加载到 Delphi 6 应用程序中,以使当前的 Delphi 6 应用程序在调用 DLL 函数后仍然保持活动状态。
解决方案
我不能使用文件目录选择 Delphi 6 功能,因为 Delphi 6 没有这个功能
是的,它确实:FileCtrl.SelectDirectory()
. 请务必使用具有Root
参数的第二个重载版本。SHBrowseForFolder()
该重载使用 Win32函数显示一个现代系统对话框。另一个重载改为显示较旧的 Win3.1 样式的 VCL 对话框。
或者,TFileOpenDialog.Execute()
有一个可选HWND
参数来指定对话框的所有者窗口。让您的调用 D6 代码在该TForm.Handle
窗口的活动中传递。
function _SelectDirectory(Owner: HWND; ADirPath: ShortString): ShortString;
var
...
begin
...
if OpenDlg.Execute(Owner) then
...
end;
ImpLib := LoadLibrary(LibraryName);
@TmpSelectDirectory := GetProcAddress(ImpLib, '_SelectDirectory');
TmpSelectDirectory(MyForm.Handle, ADirPath);
当我从 Delphi 2009 应用程序(而不是从 DLL)调用我的 _SelectDirectory 函数时,一切正常,当前应用程序仍然是活动的。
在这种情况下,TFileOpenDialog
可以访问应用程序TApplication
和活动对象,并且可以从它们之间TForm
选择一个默认所有者。HWND
但是当您TFileOpenDialog
从 DLL 内部调用时,它不能再这样做了,因此您必须更明确地确定HWND
要使用哪个所有者。
推荐阅读
- flutter - 如何划分实体并在干净的架构中共享它
- python - 我想用我的数据库运行一个不和谐的机器人
- php - macOS Big Sur 上缺少 ext-zip 扩展
- java - 如何在 Java 中更改 TImeStamp 的格式?
- mysql - BIGINT UNSIGNED 值超出范围 [尝试强制转换功能]
- javascript - 使用 onchange 事件显示数组中的几个项目
- r - 在R中合并两个数据集,使用其中一个数据集作为参考,并多次使用
- python - 我只想转换使用 Openpyxl 创建的 excel,我想使用 sqlite3 将数据存储在数据库中。下面是我的代码
- python - 是否可以从配置文件中传递 python 对象?
- matlab - 如何在 Matlab 中绘制 Pd - SNR 图?