Каталоги с необъявленным идентификатором soAllDirectories

#delphi #delphi-10.3-rio

#дельфы #delphi-10.3-rio #delphi

Вопрос:

Я пытаюсь использовать 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;
  

Что я делаю не так ?. Я вижу эту константу в Системе.IOUtils.

Спасибо.

Ответ №1:

Вам нужно написать

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

Причина в том, что директива компилятора {$SCOPEDENUMS ON} найдена перед определением TSearchOption типа. Это точно означает, что вам нужно указать константы перечисления с именем типа.

Из документации:

Директива $SCOPEDENUMS разрешает или запрещает использование ограниченных перечислений в коде Delphi. Более конкретно, $SCOPEDENUMS влияет только на определения новых перечислений и управляет только добавлением символов значений перечисления в глобальную область.

В состоянии {$SCOPEDENUMS ВКЛЮЧЕНО} область перечислений ограничена, а значения перечислений не добавляются в глобальную область. Чтобы указать элемент перечисления с ограниченной областью, необходимо указать тип перечисления.

Комментарии:

1. Браво. Интересно, насколько сложно было бы компилятору указать состояние SCOPEDENUMS в сообщении «не объявлено»? Я ожидаю, что не очень…

2. Было бы еще лучше, если бы компилятор был достаточно умен, чтобы распознать, что 3-й параметр является a TSearchOption и автоматически выполнять поиск, TSearchOption.soAllDirectories если он не может найти soAllDirectories сам.