gpt4 book ai didi

delphi - 在创建主窗体之前使 Vista+ 文件对话框起作用

转载 作者:行者123 更新时间:2023-12-03 15:30:46 25 4
gpt4 key购买 nike

在一个小应用程序中,我想在创建主窗体之前显示一个打开的文件对话框。我在 *.dpr 中这样做:

begin
Application.Initialize;
Init; // <=========================================
Application.MainFormOnTaskbar := True;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.

当我使用以下 Init 过程时:

procedure Init;
var
OpenDialog: TOpenDialog;
begin
TheFileName := '(nix)';

OpenDialog := TOpenDialog.Create(nil);
try
if OpenDialog.Execute then
TheFileName := OpenDialog.FileName
else
Exit;
finally
OpenDialog.Free;
end;
end;

Windows 7 下不显示对话框。我可以通过将 UseLatestCommonDialogs 设置为 False 来解决此问题,但我想避免这种情况。将 Init 过程更改为

procedure Init;
var
OpenDialog: TOpenDialog;
begin
TheFileName := '(nix)';

CoInitialize(nil);
try
OpenDialog := TOpenDialog.Create(nil);
try
if OpenDialog.Execute then
TheFileName := OpenDialog.FileName
else
Exit;
finally
OpenDialog.Free;
end;
finally
CoUninitialize;
end;
end;

有效。但是我不确定 CoInitialize/CoUninitialize 是否正确,例如:

  • 这么早就调用 CoUninitialize 会不会把事情搞砸了?
  • 必须“知道”TOpenDialog 在内部(有时)使用 COM 的事实听起来像是有漏洞的抽象,我宁愿避免这种情况。

编辑:我发现了一个稍微更好的方法:如果我将 ComObj 添加到 dpr 的 uses 子句中,我可以省略 CoInitialize /CoUninitialize 调用。当然,抽象泄漏问题仍然存在。

最佳答案

问题似乎是 COM 没有被初始化。这通常发生在 Application.Initialize 中,因为初始化过程是使用 ComObj 添加的。但是您在注释中报告 InitProcApplication.Initialize 内的 nil,这表明 ComObj 不包含在您的项目。

因此,您可以通过在项目中包含 ComObj 轻松解决该问题。或者,如果您想明确说明这一点,只需在 .dpr 文件的开头调用 CoInitilize(nil) 即可。

关于delphi - 在创建主窗体之前使 Vista+ 文件对话框起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16686402/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com