gjzneng
2018-01-22 10:12
采纳率: 69.2%
浏览 1.3k
已采纳

delphi xe10,控件可以根据名称下标动态调用吗?

例如:需要对edit1.text、edit2.text......edit100.text赋值。能不能用类似以下形式:
for I:=1 to 100 do
edit(I).text:='.......';

例如:

aa[1]:='123';

aa[2]:='中国';
...
aa[100]:='洛杉矶';

for I:=1 to 100 do
edit(I).text:=aa[i];

CaoZhy: 你的方法可以对edit赋值,但不能将aa[25]赋值给edit25,而是将aa[25]赋值给了某一个edit。这不能满足程序设计的要求。
对这个问题的一个解是:先判断搜索到的edit的名字是不是edit25,然后再赋值。
有没有更好的方案?
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

3条回答 默认 最新

  • 堕落恶魔_Delphi 2018-01-23 01:43
    已采纳

    首先 根据edit(i)方式来访问控件是不可能的, 你的需求只是为了懒得写代码 嘿嘿........
    可以使用其他方式(FindComponent)来达到目的

     var
      i: integer;
      nEdt: TComponent;
    begin
      for i := 1 to 100 do
      begin
        nEdt := FindComponent('edit' + IntToStr(i));
        if nEdt = nil then
          Continue;
        if not (nEdt is TEdit) then
          Continue;
        TEdit(nEdt).Text := aa[i];
      end;
    end;
    
    

    另外, 个人建议, 类似你这种100个edit的需求:
    1.不应该在界面里扔那么多edit给用户, 很乱, 如果真有这么多输入框应该分页
    2.界面应该是少量, 有明确对象的输入框, 每个输入框都需要对应的值, 这时应该每个输入框有自己的可维护名称(比如 edtCity)
    3.如果真的需要很多并且不能预知值得输入框, 建议动态创建, 这样在创建的时候就可以使其和一个了列表对应上, 也就实现你的需求了

    已采纳该答案
    打赏 评论
  • threenewbee 2018-01-22 10:34
     可以
    for i:= 0 to form1.ControlCount - 1 do
    if form1.Controls[i] is TEdit then
    ((form1.Controls[i]) as TEdit).Text:='...';
    end;
    

    注意,如果有groupbox panel之类的,需要递归遍历它的controls,以上代码只能找到直接在窗体上的textbox,不能找嵌套在别的控件中的。

    打赏 评论
  • beyoos 2018-02-10 15:57

    function GetEdit(idx: Integer): TEdit;
    begin
    Result := FindComponent('Edit'+IntToStr(idx));

    end;

    for i := 0 to 100
    begin
    GetEdit(i).Text := 'xxx';
    ....
    end;

    打赏 评论

相关推荐 更多相似问题