【问题标题】:Undeclared identifier soAllDirectories未声明的标识符 soAllDirectories
【发布时间】:2020-12-09 02:17:38
【问题描述】:

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

谢谢。

【问题讨论】:

    标签: delphi delphi-10.3-rio


    【解决方案1】:

    你需要写

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

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

    来自文档:

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

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

    【讨论】:

    • 太棒了。我想知道编译器在“未声明”消息中提及 SCOPEDENUMS 的状态会有多困难?不太好,我希望...
    • 如果编译器足够聪明,能够识别出第三个参数是TSearchOption,并在它自己找不到soAllDirectories时自动搜索TSearchOption.soAllDirectories,那就更好了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    • 1970-01-01
    • 2021-06-07
    • 2016-04-09
    • 2016-04-22
    • 2012-12-10
    相关资源
    最近更新 更多