non*_*one 16 delphi parameters delphi-2009
在Delphi中,程序写入可以处理:
write(TF,st1)
Run Code Online (Sandbox Code Playgroud)
和
write(TF,st1,st2,st3,st4);
Run Code Online (Sandbox Code Playgroud)
我想声明一个也可以这样做的程序,语法是什么?
和选项:
write(TF,[st1,st2,st3])
Run Code Online (Sandbox Code Playgroud)
虽然我知道如何做到这一点,但是不太可取.
主要目的是将ShortStrings 传递给函数,它将从文件进行读取调用,并将shortString按照定义的长度读取.然而,在将它作为变体或在开放数组中传递之后,它shortString失去了它的"大小"并变为255,这使得这个传递对我来说无法使用.但如果你想传递开放数组,答案仍然存在.
Fab*_*ujo 28
只是为了补充Cosmin的答案:如果参数列表的类型不同,您可以使用变量开放数组参数(也称为"const of array").有关Delphi文档的更多信息.
示例(来自文档):
function MakeStr(const Args: array of const): string;
var
I: Integer;
begin
Result := '';
for I := 0 to High(Args) do
with Args[I] do
case VType of
vtInteger: Result := Result + IntToStr(VInteger);
vtBoolean: Result := Result + BoolToStr(VBoolean);
vtChar: Result := Result + VChar;
vtExtended: Result := Result + FloatToStr(VExtended^);
vtString: Result := Result + VString^;
vtPChar: Result := Result + VPChar;
vtObject: Result := Result + VObject.ClassName;
vtClass: Result := Result + VClass.ClassName;
vtAnsiString: Result := Result + string(VAnsiString);
vtCurrency: Result := Result + CurrToStr(VCurrency^);
vtVariant: Result := Result + string(VVariant^);
vtInt64: Result := Result + IntToStr(VInt64^);
end;
end;
Run Code Online (Sandbox Code Playgroud)
Cos*_*und 27
首先,Inc和Write不好的例子,因为他们都得到编译器特别处理.你不能编写一个与你自己完全相同的函数.你应该调查一些替代方案.
您可以使用不同数量的参数和不同类型创建方法的多个版本.像这样的东西:
procedure MyInc(var i:Integer); overload;
procedyre MyInc(var i:Integer; const N:Integer); overload;
procedure MyInc(var i:Integer; const N1, N2: Integer); overload;
procedure MyInc(var i:Integer; const N1, N2, N3: Integer):overload;
Run Code Online (Sandbox Code Playgroud)
如果所需的过载次数不是那么大,这是可行的.编译器可能很容易处理大量的重载,但你可能不想写它们.当重载次数成为问题时,您可以切换到数组:
函数可以采用类型的参数array of YourType,当您调用该函数时,您可以传递尽可能多的参数:
procedure MyInc(var i:Integer; Vals: array of Integer);
Run Code Online (Sandbox Code Playgroud)
然后像这样使用它:
MyInc(i, []); // no parameters
MyInc(i, [1]);
MyInc(i, [1, 34, 43, 12]);
Run Code Online (Sandbox Code Playgroud)
JRL*_*JRL 12
仅用于ilustrative目的:
Delphi支持一种编写"真实"变量参数函数的方法,但它实际上很麻烦,主要用于使用像printf这样的可变参数声明外部C函数,因为它涉及到一些低级别的脏技巧来访问参数中的参数.堆.
它涉及使用cdecl和varargs修饰符:
procedure MyWrite_; cdecl;
begin
... some magic here ...
end;
var
MyWrite: procedure; cdecl varargs = MyWrite_;
begin
MyWrite(1);
MyWrite(1, 2);
MyWrite(1, 2, 3);
end;
Run Code Online (Sandbox Code Playgroud)
更详细的解释可以从答案中找到巴里·凯利于如何与功能"可变参数"获取栈的内容?