未声明的标识符soAllDirectories

问题描述

我正在尝试使用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中看到该常量。

谢谢。

解决方法

您需要写

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

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

从文档中:

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

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