我想在GroupBox中根据数据库中的记录数动态生成CheckBox后,按照每行4个,n行的方式将这些生成的控件进行排列,请大家给予帮助!谢谢!
图示:
    CheckBox1,   CheckBox2,   CheckBox3,   CheckBox4,
   CheckBox5,    CheckBox6, ...

解决方案 »

  1.   

    const
      G_ITEMS_PEER_ROW = 4;CheckBox放到一个容器上,比如一个Panel上,然后:var
      nTmp : Integer;
      nLeft: Integer;
      nWidth: Integer;
    begin
      nLeft := 0;
      nTop  := 0;
      nWidth:= Panel1.Width div G_ITEMS_PEER_ROW;  for nTmp:= 0 to CheckBox个数 - 1 do
      begin
        with TCheckBox.Create(Panel1) do
        begin
          Left  := nLeft;
          Top   := nTop;
          Width := nWidth;
          Height:= 20;           //这里假设高度都为20,其实也可以计算出来然他平均的      Parent:= Panel1;      OnClick:= 控件点击事件。
           // 其他属性设置
        end;    inc(nLeft, nWidth);
        if (((nTmp + 1) mod G_ITEMS_PEER_ROW) = 0) then
        begin
          nLeft:= 0;
          inc(nTop , 20);
        end;
      end;
    end;
      
      

  2.   


    var
      Form1: TForm1;
      checkbox: array of Tcheckbox;
    procedure TForm1.checkboxpositon(num:integer);
    var
      i:integer;
      w,h:integer;
      col:integer;
    begin
     //这里是调节间距的,你可以自己调整
      col:=num div 4;
      if (num mod 4)<>0 then
        col:=(num div 4 )+1
      else
        col:=num div 4;
      w:=GroupBox1.ClientWidth div (4+1);
      h:=GroupBox1.ClientHeight div  (col+1);
      //排列位置
      for i:=0 to num-1 do
      begin
        checkbox[i].Left:=w+(i mod 4)*w;
        checkbox[i].Top:=h+(i div 4)*w;
      end;
    end;
    procedure TForm1.Button3Click(Sender: TObject);
    var
      i:integer;
      num:integer;
    begin
      num:=7;  //可以自己设定
      setlength(checkbox,num);
      for i:=0 to num-1 do
      begin
        checkbox[i]:=Tcheckbox.Create(self);
        checkbox[i].Show;
        checkbox[i].Parent:=groupbox1;
      end;
     checkboxpositon(num);
    end;
      

  3.   

    写循环写控件Left Top,排列位置就行