那位高手能帮我编写个程序,动态生成20个编辑框,然后分别给对应的程序动态赋值!

解决方案 »

  1.   

    创建会吧,然后就是循环form上的组件
    var
      i:integer;
    begin
      for i := 0 to Self.ControlCount - 1 do
      begin
        if Self.Controls[i] is TEdit then
          TEdit(Self.Controls[i]).Text := 'abc';
      end;
    end;
      

  2.   

    帅哥,其实我的意思是先动态生成20个,然后再动态赋值,您的代码只能先创建在form然后才赋值的过程呀!
      

  3.   


    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);  private
        { Private declarations }
        procedure MyEditClick(Sender: TObject);
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
     Var
       MyEdit : Array of TEdit;
       i,j,k: Integer;
    begin
       SetLength(MyEdit,12);    '设置动态长度12
       for i := 0 to 11 do
       begin
         MyEdit[i] := TEdit.Create(Self);
         MyEdit[i].Width := 130;
         MyEdit[i].Height:= 80;
         MyEdit[i].Parent:=self;
         MyEdit[i].Text:=inttostr(i);       '赋值
         MyEdit[i].OnClick := MyEditClick;  '定义动态事件
         j:=Trunc(i/2);  //取整    行  设置为2列,要改5列对应3个2都改变为5
           K:=i mod 2 ;  //取余    列
           if i<2 then
           begin
             MyEdit[i].Top:=10;
             MyEdit[i].Left:=30+i*150;
           end else
           begin
             MyEdit[i].Top:=10+30*j;
             MyEdit[i].Left:=30+k*150;
           end;
       end;
    end;
    procedure TForm1.MyEditClick(Sender: TObject);
    var
      i:integer;
    begin
      for i := 0 to Self.ControlCount - 1 do
      begin
        if Self.Controls[i] is TEdit then
          TEdit(Self.Controls[i]).Text :='abc'+inttostr(i);
      end;
    end;
    end.
      

  4.   

    //动态创建Count个TEdit
    procedure TForm1.createEdit(Count: Integer);
    var
      I: Integer;
    begin
      for I := 0 to Count - 1 do
        with TEdit.Create(self) do
        begin
          parent := self;  //创建的TEdit显示在当前窗口上
          //根据需要设置Left和top值
          left := 位置值;   
          top := 位置值;
          tag := 100 + I;  //新创建TEdit的Tag值与自动创建的TEdit区别一下,Tag属性值从100开始
        end;
    end;//根据ATag值获取动态生成的TEdit;
    function TForm1.getEdit(ATag: Integer): TEdit;
    var
      I: Integer;
      AEdit: TEdit;
    begin
      Result := nil;  for I := 0 to ControlCount - 1 do
        if Controls[I] is TEdit then
        begin
          AEdit := Contols[I] as TEdit;
          if AEdit.Tag = 100 + ATag then
          begin
            Result := AEdit;
            Break;
          end;
        end;
    end;//获取TEdit
    {
      var
        AEdit: TEdit;
      begin
        AEdit := getEdit(0); //获取第1个动态创建的TEdit;
        //AEdit := getEdit(19); //获取第19个动态创建的TEdit;
      end;
    }
      

  5.   

    使用TStringList类的方法在窗口类的private段下面定义一个私有属性
       private
         ...
         FEditControls: TStringList;
         ...
      public
         ...
      end;
    //动态创建TEdit;procedure TForm1.CreateEdit(ACount: Integer);
    var
      I: Integer;
      AEdit: TEdit;
    begin
      for I := 0 to ACount - 1 do
      begin
        AEdit := TEdit.Create(Self);
        with AEdit do
        begin
          parent := self;
          Left := 值;
          top := 值;
        end;
        FEditControls.AddObject(IntToStr(I), AEdit);
      end;
    end;//获取TEdit
    function getEdit(Index: Integer): TEdit;
    begin
      Result := nil;
      if (Index < 0) or (Index >= FEditControls.Count) then exit;
      Result := FEditControls.Object[Index] as TEdit;
    end;//获取TEdit
    {
      var
        AEdit: TEdit;
      begin
        AEdit := getEdit(0); //获取第1个动态创建的TEdit;
        //AEdit := getEdit(19); //获取第19个动态创建的TEdit;
      end;
    }
      

  6.   

    使用TObjectList类的方法(需要添加Contnrs.pas单元)在窗口类的private段下面定义一个私有属性
      private
      ...
      FEditControls: TObjectList;
      ...
      public
      ...
      end;
    procedure TForm1.CreateEdit(ACount: Integer);
    var
      I: Integer;
      AEdit: TEdit;
    begin
      for I := 0 to ACount - 1 do
      begin
        AEdit := TEdit.Create(Self);
        with AEdit do
        begin
          parent := self;
          Left := 值;
          top := 值;
        end;
        FEditControls.Add(AEdit);
      end;
    end;
    //获取TEdit
    function getEdit(Index: Integer): TEdit;
    begin
      Result := nil;
      if (Index < 0) or (Index >= FEditControls.Count) then exit;
      Result := FEditControls.Items[Index] as TEdit;
    end;//获取TEdit
    {
      var
        AEdit: TEdit;
      begin
        AEdit := getEdit(0); //获取第1个动态创建的TEdit;
        //AEdit := getEdit(19); //获取第19个动态创建的TEdit;
      end;
    }
      

  7.   

    创建+赋值,一个循环,创建和赋值分开就用两个循环5、6楼的代码应该是可以满足LZ要求了,区别是一个利用了Tag属性来标识,一个是设置了一个TStringList作为控件集
      

  8.   

    使用一维数组的方法定义一个类型type
      TEditArray = array of TEdit;在窗口类的private段下面定义一个私有属性
      private
      ...
      FEditArray: TEditArray;
      ...
      public
      ...
      end;
    procedure TForm1.CreateEdit(ACount: Integer);
    var
      I: Integer;
      AEdit: TEdit;
    begin
      SetLength(FEditArray, ACount);  //设置动态数组大小  for I := 0 to ACount - 1 do
      begin
        AEdit := TEdit.Create(Self);
        with AEdit do
        begin
          parent := self;
          Left := 值;
          top := 值;
        end;
        FEditArray[I] := AEdit;
      end;
    end;//获取TEdit
    function getEdit(Index: Integer): TEdit;
    begin
      Result := nil;
      if (Index < Low(FEditArray)) or (Index > High(FEditArray)) then exit;
      Result := FEditArray[Index];
    end;//获取TEdit
    {
      var
        AEdit: TEdit;
      begin
        AEdit := getEdit(0); //获取第1个动态创建的TEdit;
        //AEdit := getEdit(19); //获取第19个动态创建的TEdit;
      end;
    }
     
      

  9.   

    9楼又改用一个动态数组代替TStringList来存放动态创建的Edit指针
    这么多方法本质上其实一样,不同的是标识Edit序列的方法有所区别
      

  10.   

    呵呵,还有两种不太常用一点的。 1. 不对Edit序列进行区分,根据Left和Top值来定位Edit
    2. 为Edit生成唯一的名字,通过FindComponent来找Edit
      

  11.   


    procedure TForm1.MyEditClick(Sender: TObject);
    var
      i:integer;
    begin
      for i := 0 to Self.ControlCount - 1 do
      begin
        if Self.Controls[i] is TEdit then
          TEdit(Self.Controls[i]).Text :='abc'+inttostr(i); 
      end;
    end;
    因为我又定义了个单击事件,单击后单元的值变为有'abc'了,你也可以不要
      

  12.   

    使用tag

    使用arr:array [1..20] of Tedit;自动创建时arr[i]:=Tedit.create(self);...