write(TF,st1)
和
write(TF,st1,st2,st3,st4);
我想声明一个也可以这样做的过程,语法是什么?
和选项:
write(TF,[st1,st2,st3])
不太可取,但我知道该怎么做。
主要目的是将ShortString
传递给函数,该函数将从文件进行读取调用,并按照定义的shortString
读取。然而,在将它作为变体或在开放数组中传递之后,shortString
失去了它的“大小”并变为255,这使得这个传递对我来说无法使用。
但如果你想传递开放数组,答案仍然存在。
答案 0 :(得分:27)
只是为了补充Cosmin的答案:如果参数列表的类型不同,您可以使用变量开放数组参数(也称为“const of array”)。 More on Delphi documentation.
示例(来自documentation):
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;
答案 1 :(得分:26)
首先,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;
如果所需的过载次数不是那么大,这是可行的。编译器可能很容易处理大量的重载,但你可能不想写它们。当重载数量成为问题时,您可以切换到数组:
函数可以使用array of YourType
类型的参数,当您调用该函数时,您可以传递尽可能多的参数:
procedure MyInc(var i:Integer; Vals: array of Integer);
然后像这样使用它:
MyInc(i, []); // no parameters
MyInc(i, [1]);
MyInc(i, [1, 34, 43, 12]);
答案 2 :(得分:12)
仅用于目的:
Delphi支持一种编写“真实”变量参数函数的方法,但它实际上非常麻烦,主要用于声明带有变量参数的外部C函数,如printf,因为它涉及到一些低级别的脏技巧来访问堆栈中的参数。
它涉及使用 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;
更详细的解释可以在 Barry Kelly 到How can a function with 'varargs' retrieve the contents of the stack?的答案中找到