最近才用上动态创建多个组件(比如多个edit, panel, stringgrid什么的)
今天是动态创建 stringgridvar
  ArrStringGrid: array [0..5] of TStringGrid;//-------- StringGrid初始化
procedure TForm1.StringDridInitial;
var
  I, J: Integer;
  StringGrid: TStringGrid;
begin
  for I := 0 to 5 do
  begin
    StringGrid := TStringGrid.Create(ScrollBox1);
    StringGrid.Name := 'StringGrid'+ IntToStr(I + 1);
    StringGrid.Parent := ScrollBox1;
    StringGrid.Align := alTop;
    StringGrid.BorderStyle := bsNone;
    StringGrid.Height := 475;
    StringGrid.Options := [goEditing, goAlwaysShowEditor, goFixedVertLine, goFixedHorzLine,
                           goVertLine, goHorzLine];
    StringGrid.RowCount := 21;
    StringGrid.ColCount := 4;
    StringGrid.DefaultColWidth := 78;
    StringGrid.DefaultRowHeight := 20;
    StringGrid.ColWidths[0] := 35;
    StringGrid.Cells[0, 0] := IntToStr(I + 1)+'号';
    StringGrid.Cells[1, 0] := '百位';
    StringGrid.Cells[2, 0] := '十位';
    StringGrid.Cells[3, 0] := '个位';
    for J := 1 to 20 do
      StringGrid.Cells[0, J] := IntToStr(J);    ArrStringGrid[I] := StringGrid;
  end;
end;创建6个 并algin到ScrollBox1中
name从StringGrid1到StringGrid6 顺序正常
然后再用combobox来动态设置显示或隐藏的数量//------- 控制显示或隐藏的过程
procedure TForm1.ControlStringGrid(VisbleCount, ColCount: Integer);
var
  I, J: Integer;
begin
  for I := 0 to 5 do
  begin
    if I <= VisbleCount -1 then
      begin
        ArrStringGrid[I].Visible := True;
        ArrStringGrid[I].RowCount := ColCount + 1;
        ArrStringGrid[I].ClientHeight := 10 + (ArrStringGrid[I].DefaultRowHeight+1)
                                           * (ColCount+1);
      end
    else ArrStringGrid[I].Visible := False;
  end;
end;正常情况下 name的显示顺序是stringgrid1至stringgrid6
但是现在设置显示6个的话 它的顺序会是 651423(还有其它顺序 反正不是升序也不是降序)请问这样的情况怎么办呢?
有网友说是aligin属性影响 不用它 自己设置StringGrid的top和left
但是这样的话 设置方面太多了 stringgrid的个数 行数 高度 都要动态设置太复杂了特此请教 怎么能动态显示隐藏stringgrid时让它的顺序正常呢?
谢谢

解决方案 »

  1.   


    procedure TForm1.ControlStringGrid(VisbleCount, ColCount: Integer);
    var
      I: Integer;
    begin
      for i:= low(ArrStringGrid) to high(ArrStringGrid) do
        ArrStringGrid[I].Visible := False;  for i:= high(ArrStringGrid) downto low(ArrStringGrid) do
      begin
        if i < VisbleCount then
        begin
          ArrStringGrid[I].Visible := True;
          ArrStringGrid[I].RowCount := ColCount + 1;
          ArrStringGrid[I].ClientHeight := 10 + (ArrStringGrid[I].DefaultRowHeight+1)
                                          * (ColCount+1);
        end;
      end;
    end;
    可以结帖了
      

  2.   

    一般就是動態創建後,再去寫它的visible屬性...
          
    ....
    qry_kyesb.Active:=True;
          i:=qry_kyesb.Fields.Count;
          cxGrid1.BeginUpdate;
          cxGrid1DBTableView1.BeginUpdate;
          cxGrid1DBTableView1.ClearItems;
          for  iLoop:=0 to i-1 do
          begin
            FColumn:=cxGrid1DBTableView1.CreateColumn;
            FColumn.DataBinding.FieldName:=qry_kyesb.Fields[iLoop].FieldName;
            FColumn.HeaderAlignmentHorz:=taCenter;
            FColumn.Name:='cxGrid1DBTableView1Column'+ IntToStr(iLoop+1);
            FColumn.Width:=95;
            FColumn.OnGetDisplayText:=nil;
          end;
          cxGrid1DBTableView1.DataController.Refresh;
          cxGrid1DBTableView1.EndUpdate;
          cxGrid1.EndUpdate;
        finally
          Screen.Cursor:=crDefault;                                    
          FreeAndNil(RES_LOADING_F);
        end;
    ....