Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 将多个对象作为一个参数传递_Delphi_Oop_Delphi Xe2 - Fatal编程技术网

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说,这种方法非常好。我对这种风格也很满意。早在记录有方法之前,我就形成了自己的观点。我同意您所描述的范围界定好处是非常重要的。