最近研究了下GRIDPANEL动态布局的方法,网上好像可用的资料比较少,自己研究了下,好像效果还不错,但实际每用到。记录在此,也许以后用得上。 procedure TForm1.DisplayControlGroup(GrpName:string;GrpText:string;ControlType:string;IsNessary:boolean; NeedButton:boolean;ColumnSpan:integer;RowSpan:integer); var Tmplbl:TLabel; TmpComb:TCombobox; Tmpedt:TEdit; Tmpbtn:TButton; TmpRow:TRowItem; i:integer; begin if ColNum>=7 then begin ColNum:=0; inc(RowNum); end; TmpRow:=GridPanel1.RowCollection.Add; TmpRow.SizeStyle:=ssAbsolute; // and here can be percent style TmpRow.Value:=30; Tmplbl:=TLabel.Create(nil); Tmplbl.Caption:=GrpText+':'; Tmplbl.Font.Size:=10; if IsNessary then Tmplbl.Font.Color:=clRed; gridPanel1.InsertControl(Tmplbl); Tmplbl.Anchors:=[akright]; Inc(ColNum); if ControlType='Edit' then begin Tmpedt:=TEdit.Create(nil); if ColumnSpan=1 then Tmpedt.Width:=200 else Tmpedt.Width:=600; GridPanel1.InsertControl(Tmpedt); end else if ControlType='Combobox' then begin TmpComb:=TCombobox.Create(nil); TmpComb.Width:=200; GridPanel1.InsertControl(TmpComb); end; if ColumnSpan=1 then begin GridPanel1.ControlCollection.ControlItems[ColNum,RowNum].ColumnSpan:=2; Inc(ColNum,2); end else if ColumnSpan>=2 then begin if ColNum<2 then begin GridPanel1.ControlCollection.ControlItems[ColNum,RowNum].ColumnSpan:=6; Inc(ColNum,6); end else // if there are not enough columns for ColumnSpan,use default begin GridPanel1.ControlCollection.ControlItems[ColNum,RowNum].ColumnSpan:=2; Inc(ColNum,2); end; end; // RowSpan not used here if NeedButton then begin Tmpbtn:=TButton.Create(nil); Tmpbtn.Caption:='...'; Tmpbtn.Width:=25; GridPanel1.InsertControl(Tmpbtn); Tmpbtn.Anchors:=[akLeft]; end else begin Tmplbl:=TLabel.Create(nil); GridPanel1.InsertControl(Tmplbl); end; Inc(ColNum); end;