DELPHI的DBGRID有两个难点
4987 点击·0 回帖
![]() | ![]() | |
![]() | delphi的DBGRID有两个难点: 一,每行都是一个BUTTON,且CAPTION不同 二,每行不同行高,且由用户拖动而不同高的 这两点我用CXGRID全做到了 一, procedure TForm1.cxGrid1DBTableView1Column1CustomDrawCell( Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); var www: tbutton; i, j: integer; begin www:=nil; try for i := AViewInfo.GridView.Site.ComponentCount - 1 downto 0 do begin if AViewInfo.GridView.Site.Components is tbutton then begin tbutton(AViewInfo.GridView.Site.Components).Tag := -1; if tbutton(AViewInfo.GridView.Site.Components).Caption = TcxGridDataCellViewInfo(AViewInfo).DisplayValue then begin www := tbutton(AViewInfo.GridView.Site.Components); end; end; end; if TcxGridDataCellViewInfo(AViewInfo).Item.Caption = 'NAME' then begin if www = nil then begin www := tbutton.Create(AViewInfo.GridView.Site); www.Visible:=false; www.Parent := AViewInfo.GridView.Site; www.Caption := TcxGridDataCellViewInfo(AViewInfo).DisplayValue; //inttostr(iii); www.Tag := 1; end; www.SetBounds(AViewInfo.ClientBounds.Left, AViewInfo.ClientBounds.Top, AViewInfo.ClientBounds.Right - AViewInfo.ClientBounds.Left, AViewInfo.ClientBounds.Bottom - AViewInfo.ClientBounds.Top); www.Visible:=true; end; except on e:exception do begin end end; end; procedure TForm1.cxGrid1DBTableView1TopRecordIndexChanged(Sender: TObject); var i,j:integer; begin try for i := cxgrid1.ActiveView.Site.ComponentCount - 1 downto 0 do begin if cxgrid1.ActiveView.Site.Components is tbutton then begin tbutton(cxgrid1.ActiveView.Site.Components).Tag := -1; for j := 0 to TcxGridDBtableView(cxgrid1.ActiveView).ViewInfo.RecordsViewInfo.VisibleCount do begin if tbutton(cxgrid1.ActiveView.Site.Components).Caption = TcxGridDataRowViewInfo(TcxGridDBtableView(cxgrid1.ActiveView).ViewInfo.RecordsViewInfo.Items[j]).CellViewInfos[0].DisplayValue then tbutton(cxgrid1.ActiveView.Site.Components).Tag := 1; end; if tbutton(cxgrid1.ActiveView.Site.Components).Tag = -1 then tbutton(cxgrid1.ActiveView.Site.Components).Free; end; end; except end; end; procedure TForm1.cxGrid1DBTableView1ColumnSizeChanged( Sender: TcxGridTableView; AColumn: TcxGridColumn); var i,j:integer; begin try for i := cxgrid1.ActiveView.Site.ComponentCount - 1 downto 0 do begin if cxgrid1.ActiveView.Site.Components is tbutton then begin tbutton(cxgrid1.ActiveView.Site.Components).Tag := -1; end; if tbutton(cxgrid1.ActiveView.Site.Components).Tag = -1 then tbutton(cxgrid1.ActiveView.Site.Components).Free; end; except end; end; 二, CXGRID中,只要GetCellHeight事件不为NIL,且optionsview中columnautowidth设为FALSE,即可以实现自动每行行高不同也。 如果要手工用户拖动而每行行高不同,可用下面代码 ////////// procedure TcxGridRowSizingObject.Init(const P: TPoint; AParams: TcxCustomGridHitTest); var www:tstringlist; i,j:integer; begin inherited; FRow := TcxCustomGridRow((AParams as TcxGridRowSizingEdgeHitTest).GridRecord); if AParams.ViewInfo is tcxgridindicatorrowitemviewinfo then begin www:= tstringlist(tcxgridindicatorrowitemviewinfo( AParams.ViewInfo).GridView.Site.Tag); if (www<>nil) then begin j:=0; for i:=0 to www.Count-1 do begin if integer(www.Objects)=FRow.RecordIndex then begin www:='-1'; j:=1; break; end; end; if j=0 then www.AddObject('-1',pointer(FRow.RecordIndex)); end; end; end; ////////// procedure TForm1.Button1Click(Sender: TObject); var www:tstringlist; begin adotable1.active := true; www:=tstringlist.Create; cxgrid1.ActiveView.Site.Tag:=integer(pointer(www)); end; ////////// procedure TForm1.cxGrid1DBTableView1GetCellHeight( Sender: TcxCustomGridTableView; ARecord: TcxCustomGridRecord; AItem: TcxCustomGridTableItem; ACellViewInfo: TcxGridTableDataCellViewInfo; var AHeight: Integer); var www:tstringlist; i,j:integer; begin www:=tstringlist(cxgrid1.activeview.site.tag); if ((www<>nil) and (www.Count>0)) then begin j:=0; for i:=0 to www.Count-1 do begin if integer(www.Objects)=arecord.RecordIndex then begin j:=strtoint(www); break; end; end; if j<>0 then begin if j=-1 then www:=inttostr(cxGrid1DBTableView1.OptionsView.DataRowHeight); j:=strtoint(www); aheight:=j; /////////////// cxGrid1DBTableView1ColumnSizeChanged(nil,nil); end; end; end; /////////// procedure TForm1.cxGrid1DBTableView1ColumnSizeChanged( Sender: TcxGridTableView; AColumn: TcxGridColumn); var i,j:integer; begin try for i := cxgrid1.ActiveView.Site.ComponentCount - 1 downto 0 do begin if cxgrid1.ActiveView.Site.Components is tbutton then begin tbutton(cxgrid1.ActiveView.Site.Components).Tag := -1; end; if tbutton(cxgrid1.ActiveView.Site.Components).Tag = -1 then tbutton(cxgrid1.ActiveView.Site.Components).Free; end; except end; end; | |
![]() | ![]() |