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参数,只是根据需要忽略它们?
由于
答案 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;
一个进程的重载只调用大多数进程的重载,并使用虚拟变量来捕获输出。