我想以最小的努力将多个对象作为一个参数传递。
我有一些类型
TOpenMode = [omNew, omEdit, omBrowse]
一个程序
procedure OpenForm(Form: TForm; ANewWindow: boolean = false;
Datasets: TUniDataSet; TableOpenMode: TOpenMode);
我想传递多个数据集。没有数组或创建新对象,我可以这样做吗?如何让它们成对传递[UniTable1, TOpenMode], [UniTable2, TOpenMode]
?
答案 0 :(得分: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)]);
答案 1 :(得分: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;