Присвоение масивов

Народ, интересует моментописал процедуру
publicprocedure WordReport(DSList:array of TDataSource);
вызвал ее:
WordReport([DSResult,DT_ADRBASE,DT_TEL]);
так работает, а если обьявить переменную DSList:array of TDataSource и пытаться сделать
DSList:=[DSResult,DT_ADRBASE,DT_TEL];
то дает ошибку [DCC Error] OsobaFrame.pas(3546): E2001 Ordinal type required - нужна переменная порядкового типа?
7 ответов

Вы путаете открытый массив (ваш первый пример) и динамический массив (второй пример).Конструктор открытых массивов может применяться только в момент вызова подпрограммы, принимающей в  параметра открытый массив.
Open array constructors allow you to construct arrays directly within function and procedure calls. They can be passed only as open array parameters or variant open array parameters.


type  TDSList = array of TDataSource;type  TForm1 = class(TForm)    procedure WordReport(ADSList: TDSList);  end;procedure TForm1.WordReport(ADSList: TDSList);begin  {...}end;procedure TForm1.Button1Click(Sender: TObject);var  lst: TDSList;begin  SetLength(lst,3);  lst[0] := DSResult;  lst[1] := DT_ADRBASE;  lst[2] := DT_TEL;  WordReport(lst);end;


Ясненько, я так и сделал, но думал существует версия покороче - много параметров надо передавать. Спасибо.


Ну создай метод с открытым массивом и в нём циклом прогони присвоение в динамический.


Ну создай метод с открытым массивом и в нём циклом прогони присвоение в динамический. 
Snowy, хорошая мысль.
type  TDSList = array of TDataSource;type  TForm1 = class(TForm)    Button1: TButton;    procedure Button1Click(Sender: TObject);  private    { Private declarations }  public    procedure WordReport(ADSList: TDSList); overload;    procedure WordReport(ADSList: array of TDataSource); overload;  end;var  Form1: TForm1;implementation{$R *.dfm}{ TForm1 }procedure TForm1.WordReport(ADSList: TDSList);begin  {...}end;procedure TForm1.WordReport(ADSList: array of TDataSource);var  lst: TDSList;  i: Integer;begin  SetLength(lst, Length(ADSList));  for i := Low(ADSList) to High(ADSList) do    lst[i] := ADSList[i];  WordReport(lst);end;procedure TForm1.Button1Click(Sender: TObject);var  lst: TDSList;begin  // 1  SetLength(lst,3);  lst[0] := DSResult;  lst[1] := DT_ADRBASE;  lst[2] := DT_TEL;  WordReport(lst);  // 2  WordReport([DSResult,DT_ADRBASE,DT_TEL]);end;


Спасибо друзья. Пока присваиваю данные вручную. Но доработаю БД и там буду хранить нужные записи - тогда сделаю динамику.


TDSList = array of TDataSource;...WordReport(TDSList.Create(DSResult, DT_ADRBASE, DT_TEL));