未声明的标识符 soAllDirectories

Mar*_*lot 5 delphi delphi-10.3-rio

我正在尝试使用 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;
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么 ?。我可以在 System.IOUtils 中看到该常量。

谢谢你。

And*_*and 8

你需要写

TDirectory.GetFiles('C:\Project', '*.pas', TSearchOption.soAllDirectories);
Run Code Online (Sandbox Code Playgroud)

原因是编译器指令{$SCOPEDENUMS ON}是在TSearchOption类型定义之前找到的。这恰恰意味着您需要使用类型名称来限定枚举的常量。

从文档:

$ SCOPEDENUMS指令启用或禁用在Delphi代码中使用范围的枚举。更具体地说,$SCOPEDENUMS 仅影响新枚举的定义,并且仅控制将枚举的值符号添加到全局范围。

{$SCOPEDENUMS ON}状态下,枚举是有范围的,并且枚举值不会添加到全局范围中。要指定作用域枚举的成员,您必须包含枚举的类型。

  • 如果编译器足够聪明,能够识别第三个参数是“TSearchOption”,并且如果它自己找不到“soAllDirectories”,则自动搜索“TSearchOption.soAllDirectories”,那就更好了。 (3认同)