2

我想以最小的努力将多个对象作为一个参数传递。

我有一些类型

TOpenMode = [omNew, omEdit, omBrowse] 

和一个程序

procedure OpenForm(Form: TForm; ANewWindow: boolean = false; 
                   Datasets: TUniDataSet; TableOpenMode: TOpenMode);

我想传递多个数据集。我可以在没有数组或创建新对象的情况下做到这一点吗?我怎样才能让它们成对通过[UniTable1, TOpenMode], [UniTable2, TOpenMode]

4

2 回答 2

5

将多个对象组合成单个复合类型的最简单方法是记录:

type
  TDataSetAndOpenMode = record
    DataSet: TUniDataSet;
    OpenMode: TOpenMode;
  end;

为方便起见,提供一个函数来初始化这些记录之一:

function DataSetAndOpenMode(DataSet: TUniDataSet; 
    OpenMode: TOpenMode): TDataSetAndOpenMode;
begin
  Result.DataSet := DataSet;
  Result.OpenMode := OpenMode;
end;

然后您的OpenForm函数可以接收此类记录的开放数组:

procedure OpenForm(Form: TForm; const Datasets: array of TDataSetAndOpenMode;
    NewWindow: Boolean=False);

请注意,我已将NewWindow参数放在最后。由于它有一个默认值,因此该默认值仅在出现在列表末尾时才有用。

现在,要调用该函数,您可以编写如下代码:

OpenForm(Form, [DataSetAndOpenMode(DataSet1, OpenMode1), 
    DataSetAndOpenMode(DataSet2, OpenMode2)]);
于 2012-10-27T18:29:04.773 回答
3

如果您想将多对作为一个参数传递,我看不出如何避免声明至少一条记录来定义该对,并且至少声明一个开放数组参数以将这些记录的多个实例作为一个参数传递。

type
 TDatasetModePair = record
   DS: TUniDataSet;
   Mode: TOpenMode;
 end;

procedure OpenForm(Form: TForm; ANewWindow: boolean = false; 
               Datasets: array of TDatasetModePair);

但是您可能会发现声明自己的数组类型会容易得多:

type
  TDatasetModePairArray: array of TDatasetModePair;

然后程序声明变为:

procedure OpenForm(Form: TForm; ANewWindow: boolean = false; 
               Datasets: TDatasetModePairArray);

尽管如此,在您将其传递给您的函数之前,必须创建数组:

var
  MyArray: TDatasetModePairArray;
begin
  SetLength(MyArray, 2);
  MyArray[0].DS := SomeDataSet;
  MyArray[0].Mode := omEdit;
  MyArray[1].DS := SomeOtherDataSet;
  MyArray[1].Mode := omBrowse;
于 2012-10-27T17:38:38.580 回答