【问题标题】:Compling SelectDirectory Third Overload with Delphi 10使用 Delphi 10 编译 SelectDirectory 第三次重载
【发布时间】:2015-08-31 23:54:39
【问题描述】:

为什么不能编译?看起来很简单,但我不明白......是字符串数组的问题吗?错误是:

[dcc32 Error] Unit1.pas(94): E2250 There is no overloaded version of 'SelectDirectory' that can be called with these arguments. 

代码如下:

{
function SelectDirectory(const StartDirectory: string; out Directories: TArray<string>; Options: TSelectDirFileDlgOpts = [];
  const Title: string = ''; const FolderNameLabel: string = ''; const OkButtonLabel: string = ''): Boolean; overload;
}

procedure TForm2.Browse1Click(Sender: TObject);
var
  iStartFolder: string;
  iDirectories: Array of string;
  iSelectedFolder: string;
begin
  iStartFolder := DesktopFolder;
  if SelectDirectory(iStartFolder, iDirectories,
    [sdHidePinnedPlaces, sdNoDereferenceLinks, sdForceShowHidden,
    sdAllowMultiselect], 'Select Folder', 'Folder', 'Ok') then
    ShowMessage(iDirectories[0]);
end;

【问题讨论】:

  • 好吧,杰森……你是对的。谢谢你
  • 因为TArray&lt;string&gt;Array of string的类型不同。

标签: delphi delphi-10-seattle


【解决方案1】:

第三个SelectDirectory()重载的第二个参数是out参数,所以你必须提供一个与参数类型相同的变量。您正在尝试传递一个 array of string 变量,其中应该有一个 System.TArray&lt;String&gt; 变量,因此会出现错误。改用这个:

procedure TForm2.Browse1Click(Sender: TObject);
var
  iStartFolder: string;
  iDirectories: TArray<string>;
  iSelectedFolder: string;
begin
  iStartFolder := DesktopFolder;
  if SelectDirectory(iStartFolder, iDirectories,
    [sdHidePinnedPlaces, sdNoDereferenceLinks, sdForceShowHidden,
    sdAllowMultiselect], 'Select Folder', 'Folder', 'Ok') then
    ShowMessage(iDirectories[0]);
end;

虽然TArray&lt;String&gt; 只是array of string 的别名,但与out 参数一起使用时,它们实际上是不同的类型。

【讨论】:

  • 为什么投反对票?如果没有人消极而不是积极,几乎不可能在这里发布任何内容......
  • @Bill:首先,你为什么要问 Remy?他显然没有投反对票,否则他不会回答。其次,我没有投反对票,但这可能是因为您发布了一个函数声明,要求您提供TArray&lt;string&gt; 和完全不同的代码(使用array of string);对函数声明的简单(仔细)阅读应该可以回答您的问题。 Delphi 是强类型的。 TArray&lt;string&gt;array of string 不一样 - 第一个是通用字符串数组,第二个是动态字符串数组。
  • @KenWhite: TArray&lt;String&gt; 只是 array of String: type TArray&lt;T&gt; = array of T; 的别名。但是,在这种情况下,如果涉及 out 参数,它们的处理方式会有所不同。
  • 你必须提供一个与参数类型相同的变量,你也可以在那里进行类型转换,但最好传递确切的类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多