在Delphi中,程序写入可以处理:
write(TF,st1)
和
write(TF,st1,st2,st3,st4);
我想声明一个也可以这样做的程序,语法是什么?
和选项:
write(TF,[st1,st2,st3])
虽然我知道如何做到这一点,但是不太可取.
主要目的是将ShortString
s 传递给函数,它将从文件进行读取调用,并将shortString
按照定义的长度读取.然而,在将它作为变体或在开放数组中传递之后,它shortString
失去了它的"大小"并变为255,这使得这个传递对我来说无法使用.但如果你想传递开放数组,答案仍然存在.
只是为了补充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;
首先,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]);
仅用于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;
更详细的解释可以从答案中找到巴里·凯利于如何与功能"可变参数"获取栈的内容?