【发布时间】:2013-05-17 04:30:58
【问题描述】:
在一个小应用程序中,我想在创建主窗体之前显示一个打开的文件对话框。我在 *.dpr 中这样做:
begin
Application.Initialize;
Init; // <=========================================
Application.MainFormOnTaskbar := True;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
当我使用以下初始化过程时:
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 调用。当然,泄漏的抽象问题仍然存在。
【问题讨论】:
-
我无法重现您所描述的内容。它也不正确,因为在
Application.Initialize中调用了CoInitialize。 -
我也会这么认为。但事实不同。 :-)
-
FWIW:InitProc 在对
Application.Initialize的调用中为零。 -
...除非我使用
ComObj- 请参阅编辑。 -
见
documentation。 "In Delphi, you can include a unit that assigns a procedure to InitProc in its initialization section, such as the ComObj unit."
标签: delphi com delphi-2007 fileopendialog