【问题标题】:Make Vista+ file dialogs work before main form is created在创建主窗体之前使 Vista+ 文件对话框工作
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • 这就是我现在要做的。出于好奇:您不必在系统上执行此操作吗?你用D2007吗? Emba 可能在 D2007 之后修复了 Dialogs.pas 以自行设置所有要求。
猜你喜欢
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 2010-12-05
  • 1970-01-01
  • 1970-01-01
  • 2011-02-08
相关资源
最近更新 更多