Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.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 - Fatal编程技术网

Delphi 以随机顺序将参数值传递给函数或过程

Delphi 以随机顺序将参数值传递给函数或过程,delphi,Delphi,Delphi中是否有一种方法可以将参数值以随机顺序传递给函数或过程,这样我就不必确保顺序正确 例如: procedure InsertEmp(ID: Integer;Name: String;Gender: String); begin //Content end 然后我会像这样使用这个过程: InsertEmp(1,'Zemmy','Male'); procedure InsertEmp(ID: Integer;NickName:String;Name: String;Gender:

Delphi中是否有一种方法可以将参数值以随机顺序传递给函数或过程,这样我就不必确保顺序正确

例如:

procedure InsertEmp(ID: Integer;Name: String;Gender: String);
begin
  //Content
end
然后我会像这样使用这个过程:

InsertEmp(1,'Zemmy','Male');
procedure InsertEmp(ID: Integer;NickName:String;Name: String;Gender: String);
begin
  //Content
end
InsertEmp(Gender = 'Male',NickName = 'Jim',ID = 1,Name = 'Zemmy');
但如果在另一个时间我像这样更改函数参数顺序:

InsertEmp(1,'Zemmy','Male');
procedure InsertEmp(ID: Integer;NickName:String;Name: String;Gender: String);
begin
  //Content
end
InsertEmp(Gender = 'Male',NickName = 'Jim',ID = 1,Name = 'Zemmy');
我必须对我的功能进行如下位置修正:

InsertEmp(1,'Jim','Zemmy','Male');
我可以在不更正顺序的情况下传递参数值吗?也许是这样一种方式:

InsertEmp(1,'Zemmy','Male');
procedure InsertEmp(ID: Integer;NickName:String;Name: String;Gender: String);
begin
  //Content
end
InsertEmp(Gender = 'Male',NickName = 'Jim',ID = 1,Name = 'Zemmy');

谢谢你的帮助。

不,你不能。如果你想做类似的事情,你可以传递一个键值格式的字符串

InsertEmp('Gender=Male,NickName=Jim,ID=1,Name=Zemmy');
然后在函数内部解析它

您可以有多个略有不同的参数

procedure InsertEmp(id: Integer; name: String; gender: String); overload;
procedure InsertEmp(id: Integer; nickName,name: String; gender: String); overload;

对于随机参数顺序,有一些序列化库将字符串作为输入,然后解析它们以获取输入值。简单的键值对或JSON就是例子。

如果您只能使用一种变量类型,那么还有另一种选择。使用开放数组。申报

procedure InsertEmp(values: array of string);
然后像这样传递任何参数

InsertEmp(['Gender = Male', 'NickName = Jim', 'Name = Zemmy' ...]);

由于具有两个或多个相同类型的参数,被调用的过程无法确定它们的含义

我认为答案可能是多种因素的混合

对记录构造函数使用重载,可以获得智能解决方案

type
  TEmployee = record
    ID: Integer;
    NickName,
    Name,
    Gender: String;
    constructor Create(const AID: Integer; const ANickname, AName, AGender: String); overload;
    constructor Create(const AID: Integer; const AName, AGender: String); overload;
end;

procedure InsertEmp(const AEmployee: TEmployee);
begin
  //Content
end;

constructor TEmployee.Create(const AID: Integer; const ANickname, AName, AGender: String);
begin
  ID := AID;
  Nickname := ANickName
  Name := AName;
  Gender := AGender;
end;

constructor TEmployee.Create(const AID: Integer; const AName, AGender: String);
begin
  Create(AID, '', AName, AGender);
end;


你可以通过传递一个对象/记录来绕过这个问题我的问题的目的是让我不要对我的代码做任何错事。但从所有的答案来看,解决方案对我来说变得更加复杂D我想我会接受@fantaghirocco的回答,因为他给出了所有的结论。我会考虑使用记录来组织他给出的样本参数,你的动机是错误的。您不应该试图设计能够以任意顺序接受参数的函数。嗯。。对不起,我的英语。。我的意思是,如果我改变函数参数的顺序,我希望是安全的,这样现有的调用者就不会将值填充到错误的参数中。使用指针的原因是什么?为什么不
procedure InsertEmp(const员工:TMyRec)?重载构造函数没有意义。将问题的问题转移到构造函数中。如果您真的需要构造函数,只需使用它们(f.i.保护ID值)。使用字段或属性填充所有其他值。@Rufo爵士没有理由使用指针事实上,使用Win API是一种习惯。。。但我不明白重载构造函数在这里毫无意义的原因:在我看来,它可以通过一点重构以优雅的方式解决问题,不是吗?这里的构造函数毫无意义,因为这里的用例是DTO。如果它是一个值对象,那么构造函数就有意义了,因为值对象必须是不可变的。@Rufo爵士我同意他的观点:在我看来,这只是写更少代码的一种方式:-p