пример самого грязного кода, включенного в справку Delphi Rio. Есть ли что-то очевидное, что я пропустил? - PullRequest
3 голосов
/ 23 апреля 2019

Я заполнил форму необходимыми компонентами и вставил пример кода в событие нажатия кнопки.

Я добавил объявления типов TStringDynArrayarray и TSearchOption, но получаю ошибки компиляции, как показано ниже.

unit dirtest;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics, System.Types, Vcl.Controls, Vcl.Forms,
  Vcl.Dialogs, IOUtils, Vcl.StdCtrls;

type
  TStringDynArray = Array of String;
  TSearchOption = (soTopDirectoryOnly, soAllDirectories);
  TForm1 = class(TForm)
    OpenDialog1: TOpenDialog;
    Button1: TButton;
    mmResults: TMemo;
    cbIncludeDirectories: TCheckBox;
    cbIncludeFiles: TCheckBox;
    cbDoRecursive: TCheckBox;
    edtPath: TEdit;
    edtFileMask: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  LList: TStringDynArray;
  I: Integer;
  LSearchOption: TSearchOption;
begin
  { Select the search option }
  if cbDoRecursive.Checked then
    LSearchOption := TSearchOption.soAllDirectories
  else
    LSearchOption := TSearchOption.soTopDirectoryOnly;

  try
    { For all entries use GetFileSystemEntries method }
    if cbIncludeDirectories.Checked and cbIncludeFiles.Checked then
      LList := TDirectory.GetFileSystemEntries(edtPath.Text, LSearchOption, nil;

    { For directories use GetDirectories method }
    if cbIncludeDirectories.Checked and not cbIncludeFiles.Checked then
      LList := TDirectory.GetDirectories(edtPath.Text, edtFileMask.Text,
        LSearchOption);

    { For files use GetFiles method }
    if not cbIncludeDirectories.Checked and cbIncludeFiles.Checked then
      LList := TDirectory.GetFiles(edtPath.Text, edtFileMask.Text,
        LSearchOption);
  except
    { Catch the possible exceptions }
    MessageDlg('Incorrect path or search mask', mtError, [mbOK], 0);
    Exit;
  end;

  { Populate the memo with the results }
  mmResults.Clear;

  for I := 0 to Length(LList) - 1 do
    mmResults.Lines.Add(LList[I]);
end;

end.

Ошибки, которые я получаю, таким образом ...

[ошибка dcc32] dirtest.pas (51): E2250 Не существует перегруженной версии GetFileSystemEntries, которую можно вызывать с этими аргументами [ошибка dcc32] dirtest.pas (56): E2250 Не существует перегруженной версии GetDirectories, которую можно вызывать с этими аргументами [ошибка dcc32] dirtest.pas (61): E2250 Не существует перегруженной версии GetFiles, которая может быть вызвана с этими аргументами

Вы видите, что идет не так? Спасибо

1 Ответ

6 голосов
/ 23 апреля 2019

Ваше объявление типа вводит новые типы для TStringDynArray и TSearchOption, в то время как функции ожидают типы, объявленные во встроенных единицах (TStringDynArray = TArray<string>; из System.Types и TSearchOption из IOUtils)

Так что просто удалите собственное описание типа

...