Delphi - 使用可选的VAR参数调用过程?

时间:2014-05-22 14:05:01

标签: delphi var procedures

Delphi 2010 - 我有一个例程,它接受一个字符串并处理它。有3种不同类型的处理,我可能需要任何组合,包括所有3种处理方式。我试图确定如何调用我的例程,但我尝试的一切都会导致问题。我想要做的就是调用这样的程序...

StringProcess(StartString1, VarProcess1, VarProcess2, VarProcess3);

但这很容易就是我只想要2个过程

StringProcess(StartString1, '', VarProcess2, VarProcess3);

程序定义类似于

procedure StringProcess(StartString: string; var S1:String; var S2:string; var S3:string);

总结一下......如何定义我的过程以返回1到3个VAR变量? Delphi希望我总是传递3个变量,如果我不需要它,我只需要忽略它。有没有办法传递“不存在的”VAR参数,只是根据需要忽略它们?

由于

3 个答案:

答案 0 :(得分:9)

问题是,只要您尝试修改这些值,您的StringProcess rountine就必须有 变量 来表示S1,S2和S3。毫无疑问,你不想经历为你不感兴趣的值声明变量的头痛。

要考虑的一个选项是将所有变量捆绑到记录结构中,如下所示:

type
  TStringData = record
    S1, S2, S3: string;
  end;

procedure StringProcess(StartString: string; var StringData: TStringData);

但是我会更进一步。我怀疑你并没有在StringProcess例程中使用S1,S2和S3的输入。这意味着它们也可能是 out 参数。在这种情况下,我宁愿建议你写:

function StringProcess(StartString: string): TStringData;

答案 1 :(得分:8)

var参数不能是可选的,必须传递一个变量。对于您要找的内容,请改用指针:

procedure StringProcess(StartString: string; S1:PString; S2:Pstring; S3:Pstring);
begin
  ...
  if S1 <> nil then
  begin
    // Use S1^ as needed...
  end;
  ...
end;

然后你可以这样做:

StringProcess(StartString1, @VarProcess1, @VarProcess2, @VarProcess3);
StringProcess(StartString1, nil, @VarProcess2, @VarProcess3);
StringProcess(StartString1, nil, nil, @VarProcess3);
StringProcess(StartString1, @VarProcess1, nil, @VarProcess3);
...

答案 2 :(得分:1)

var 参数不能是可选的。解决方案是为函数定义重载:

procedure StringProcess(StartString: string; var S1:String); overload;
procedure StringProcess(StartString: string; var S1:String; var S2:string); overload;
procedure StringProcess(StartString: string; var S1:String; var S2:string; var S3:string); overload;

您可以实现这样的重载:

procedure StringProcess(StartString: string; var S1:String); overload;
var
  S2, S3: String;
begin
  StringProcess(StartString, S1, S2, S3);
end;

一个进程的重载只调用大多数进程的重载,并使用虚拟变量来捕获输出。