请教调用不限定个数参数的问题

静远 2010-02-26 10:33:09
在过程或函数中,参数个数不定。
比如有:
procedure proc1(aa: array of TControl); //不指定类型控件

procedure proc2(bb: array of Variant); //不指定类型变量

procedure proc3(cc: array of string); //指定类型变量string

如果我想调用的是TEdit、TButton等指定类型的控件呢?又该如何写?
...全文
125 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
静远 2010-02-26
  • 打赏
  • 举报
回复
引用 7 楼 harryfin 的回复:
Delphi(Pascal) codeprocedure CalculateAvg(ALabel: TCustomLabel; AEdits:arrayof TCustomEdit);var
i, iSum: integer;begin
iSum :=0;for i :=0to High(AEdits)do
iSum := iSum+ StrToInt(AEdits[i].Text?-


是这样的了。
在提问前,我这里不能这样写:function MyFunc(aa: array of TEdit): Double;会报错;
吃完饭,看了这段回复,再去写又发现可以这么写了………………
我…………
Harryfin 2010-02-26
  • 打赏
  • 举报
回复
不知道,其实我还是没看明白他想要什么,主要是不懂他楼顶的三个函数间有什么关系
IDWB 2010-02-26
  • 打赏
  • 举报
回复
楼上的就是楼主想要的吗?
Harryfin 2010-02-26
  • 打赏
  • 举报
回复

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;
静远 2010-02-26
  • 打赏
  • 举报
回复
引用 2 楼 idwb 的回复:
procedure proc(var aa);
或者
procedure proc(const aa);


谢谢!
但是我想知道是否可以调用不定个数的某一个类型的如TEdit或TButton等。
也就是说,当我调用该参数所在的过程或函数时,是通过指定相应类型的控件名称,而不是相应控件的文本内容之类的,来执行函数或过程。
不知道我有没有说清楚。。。
静远 2010-02-26
  • 打赏
  • 举报
回复
可能我没有说清楚,我再补充一下吧。
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函数中,通过调用该函数来实现下面的计算。

当然:如果仅仅说是实现上面的问题用不着这么麻烦,仅仅是举一个不怎么恰当的例子。
IDWB 2010-02-26
  • 打赏
  • 举报
回复
Variant open array parameters(Variant 开放数组参数)
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” 。
IDWB 2010-02-26
  • 打赏
  • 举报
回复
(aa as TEdit).text:='hi!';
IDWB 2010-02-26
  • 打赏
  • 举报
回复
procedure proc(var aa);
或者
procedure proc(const aa);
金卯刀 2010-02-26
  • 打赏
  • 举报
回复
if aa[i] is TEdit then
TEdit(aa[i]).Text := 'dasdasd'
else if aa[i] is TButton then
TButton(aa[i]).Caption := ''
....

大致是这么做,具体如何做,应有取巧的地方...

16,749

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧