未声明的标识符soAllDirectories

6

我正在尝试使用TDirectory.GetFiles函数,但是当我添加第三个参数TSearchOptions来强制递归搜索时,编译器会引发错误,指出soAllDirectories未被声明。

uses System.IOutils,
     System.Types;

procedure TfrmConversio.btnConversioClick(Sender: TObject);
var FilesPas: TStringDynArray;
begin
  FilesPas := TDirectory.GetFiles('C:\Project', '*.pas', soAllDirectories);
  ProgressBar1.Max := Length(FilesPas);
end;

我做错了什么?我可以在System.IOUtils中看到常量。
谢谢。
1个回答

8

您需要编写

TDirectory.GetFiles('C:\Project', '*.pas', TSearchOption.soAllDirectories);

原因是在定义 TSearchOption 类型之前,编译器指令 {$SCOPEDENUMS ON} 被找到。这意味着您需要使用类型名称来限定枚举常量。
根据文档: $SCOPEDENUMS 指令可以启用或禁用 Delphi 代码中的作用域枚举。更具体地说,$SCOPEDENUMS 仅影响新枚举的定义,并仅控制将枚举值符号添加到全局作用域中。
{$SCOPEDENUMS ON} 状态下,枚举是有作用域的,枚举值不会被添加到全局作用域中。为了指定作用域枚举的成员,必须包括枚举的类型。

1
太棒了。我想知道编译器在“未声明”消息中提到SCOPEDENUMS状态会有多难?我想不会很难... - MartynA
3
如果编译器足够聪明,能够识别第三个参数是一个 TSearchOption 并且在找不到 soAllDirectories 的情况下自动搜索 TSearchOption.soAllDirectories,那就更好了。 - Remy Lebeau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接