#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
сам.