比如要动态添加10个控件,按没列5个控件,排成两列,如果把窗体缩小放大的话,控件根据窗体大小改变行列数,可以做到吗

解决方案 »

  1.   

    楼主的问题可以分为两个问题:1、动态创建控件,并按每列固定个数排列;    ----这个,我有一篇编程笔记,请移步到这里看:http://hi.baidu.com/382943850/blog/item/2fb067084fed65d562d9868d.html2、控件排列根据窗体的大小随时调整。    ----这个,我给你一个提示:把这一组控件放入一个数组,然后在Form的OnResize里写一个循环,循环里的算法参考1中的算法。
      

  2.   

    {下面是给楼主重新整理的代码(以创建Button为例)}(* 初始创建显示时并不一定是每行5个,请楼主运行后调整Form的大小看效果*)const
      iHtoH = 20; //行间距
      iWtoW = 10; //列间距
      iWidth = 80; //按钮宽度
    var
      iPerLine : integer;//每行个数
      BtnArr : array[1..10] of TButton;procedure TForm1.FormCreate(Sender: TObject);
    var
      I : integer;
    begin
      iPerLine := Self.Width div (iWidth+iWtoW);
      for I := 1 to 10 do begin
        BtnArr[I] := TButton.Create(Self);
        with BtnArr[I] do begin
          Name := 'Btn' + InttoStr(I);
          Parent := Self;
          Caption := Name;
          Top := iHtoH + (30+iHtoH) * (I div iPerLine - integer((I mod iPerLine)=0));
          Left := iWtoW + (iWidth+iWtoW) * ((I-1) mod iPerLine);
          Show;
        end;
      end;
    end;procedure TForm1.FormResize(Sender: TObject);
    var
      I : integer;
    begin
      iPerLine := Self.Width div (iWidth+iWtoW);
      for I := 1 to 10 do
        with BtnArr[I] do begin
          Top := iHtoH + (30+iHtoH) * (I div iPerLine - integer((I mod iPerLine)=0));
          Left := iWtoW + (iWidth+iWtoW) * ((I-1) mod iPerLine);
        end;
    end;
      

  3.   

    把上面代码中的Self.Width改为Self.ClientWidth。
    其他的细节修饰,楼主自行处理吧,算法已经表达得很清楚了,已经可以实现了。
      

  4.   

    谢谢 lihuasoft 
    以上代码可以实现.