Delphi 将多个对象作为一个参数传递
我希望以最小的努力将多个对象作为一个参数传递 我有一些类型Delphi 将多个对象作为一个参数传递,delphi,oop,delphi-xe2,Delphi,Oop,Delphi Xe2,我希望以最小的努力将多个对象作为一个参数传递 我有一些类型 TOpenMode = [omNew, omEdit, omBrowse] 还有一个程序 procedure OpenForm(Form: TForm; ANewWindow: boolean = false; Datasets: TUniDataSet; TableOpenMode: TOpenMode); 我想传递多个数据集。在没有阵列或创建新对象的情况下,我可以做到这一点吗?如何使它们
TOpenMode = [omNew, omEdit, omBrowse]
还有一个程序
procedure OpenForm(Form: TForm; ANewWindow: boolean = false;
Datasets: TUniDataSet; TableOpenMode: TOpenMode);
我想传递多个数据集。在没有阵列或创建新对象的情况下,我可以做到这一点吗?如何使它们成对传递
[UniTable1,TOpenMode],[UniTable2,TOpenMode]
?如果要将多个对作为一个参数传递,我不知道如何避免至少声明一个记录来定义对,至少声明一个开放数组参数来将这些记录的多个实例作为一个参数传递
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;
在单个复合类型中组合多个对象的最简单方法是记录:
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)]);
使用开放数组参数的主要原因之一是避免使用
SetLength
,并按照我的示例调用函数。这就是说,在现代Delphi中,你可以使用tdatasetmodepairray.Create(DatasetModePair1,DatasetModePair2)
@DavidHeffernan:是的,我在我可怜的ol'D5中试过,但是messages视图已经过时了,如果没有错误信息,我就无法正确地获取语法:-),因此我退出并选择了SetLength版本。您为什么使用单独的函数而不是记录构造函数?只是好奇。@Uwe我不喜欢使用TDataSetAndOpenMode.Create
语法。当您阅读该代码时,它会让您认为需要对该对象调用Free
。对于通常是编译器错误的记录,您将受到保护。但是,如果你碰巧在FreeAndNil
阵营,那么将记录传递给FreeAndNil
会带来痛苦。例如,查看TRegEx
。您可以使用一个实例方法,可能名为Initialise
。但这不允许问题中的函数调用语法。因此有了一个助手函数。我当然接受你的偏好。您仍然可以使初始化成为静态类函数(例如TStopWatch.StartNew)。实际上,我更喜欢那些记录方法来保持作用域的完整性。“这通常是一个品味问题。”Uwerabe说,这种方法非常好。我对这种风格也很满意。早在记录有方法之前,我就形成了自己的观点。我同意您所描述的范围界定好处是非常重要的。