在过程或函数中,参数个数不定。
比如有:
procedure proc1(aa: array of TControl); //不指定类型控件procedure proc2(bb: array of Variant); //不指定类型变量procedure proc3(cc: array of string); //指定类型变量string如果我想调用的是TEdit、TButton等指定类型的控件呢?又该如何写?
比如有:
procedure proc1(aa: array of TControl); //不指定类型控件procedure proc2(bb: array of Variant); //不指定类型变量procedure proc3(cc: array of string); //指定类型变量string如果我想调用的是TEdit、TButton等指定类型的控件呢?又该如何写?
TEdit(aa[i]).Text := 'dasdasd'
else if aa[i] is TButton then
TButton(aa[i]).Caption := ''
....大致是这么做,具体如何做,应有取巧的地方...
或者
procedure proc(const aa);
Variant 开放数组参数允许你向一个过程或函数传递由不同类型的元素构成的数组。要定义这样一个例
程,指定 array of const作为参数的类型,这样
procedure DoSomething(A: array of const);
声明了一个叫做 DoSomething 的过程,它能接收不同类型的数组。
array of const结构等同于 array of TVarRec。TVarRec 在 System单元定义,表示一个拥有变体部分的记录,它能存储整数、布尔、字符、实数、字符串、指针、类、类引用、接口和变体类型的值。TVarRec
记录的 VType 字段指示数组中每个元素的类型。一些类型以指针而不是以数值形式进行传递,特别是,
长字符串以指针类型传递,必须被转换为 string。
下面的函数使用 Variant开放数组参数,它把传给它的每个元素用字符串表示,并把它们连接成一个单一
的字符串。函数中使用的字符串处理例程在 SysUtils 单元定义。
function MakeStr(const Args: array of const): string;
const
BoolChars: array[Boolean] of Char = ('F', 'T');
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 + BoolChars[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;
我们可以传递一个开放数组构造器来调用这个函数(参考 Open array constructors) 。比如,
MakeStr(['test', 100, ' ', True, 3.14159, TForm])
返回字符串“test100 T3.14159TForm” 。
function MyFun(aa: array of ...): Double; //假定这里声明一个函数,可以调用不指定个数的TEdit;当然或许并不是(不能?)这么写的;实现:
在Form1有5个Edit:Edit1,Edit2,Edit3,Edit4,Edit5,
两个Label:LbAvg,LbSomething;
其中LbAvg是计算Edit1-Edit5的平均值,LbSomrthing是获取Edit1和Edit3的平均值;
现在我把计算平均值的方法放在MyFun函数中,通过调用该函数来实现下面的计算。当然:如果仅仅说是实现上面的问题用不着这么麻烦,仅仅是举一个不怎么恰当的例子。
谢谢!
但是我想知道是否可以调用不定个数的某一个类型的如TEdit或TButton等。
也就是说,当我调用该参数所在的过程或函数时,是通过指定相应类型的控件名称,而不是相应控件的文本内容之类的,来执行函数或过程。
不知道我有没有说清楚
procedure CalculateAvg(ALabel: TCustomLabel; AEdits: array of TCustomEdit);
var
i, iSum: integer;
begin
iSum := 0;
for i := 0 to High(AEdits) do
iSum := iSum + StrToInt(AEdits[i].Text); //假设你的EDIT都是数字文本了
ALabel.Caption := FloatToStr(iSum / Length(AEdits));
end;begin
CalculateAvg(LbAvg, [Edit1, Edit2, Edit3, Edit4, Edit5]);
CalculateAvg(LbSomrthing, [Edit1, Edit2, Edit3]);
end;
是这样的了。
在提问前,我这里不能这样写:function MyFunc(aa: array of TEdit): Double;会报错;
吃完饭,看了这段回复,再去写又发现可以这么写了………………
我…………