您的位置:首页 > 编程语言 > Delphi

DELPHI的DBGRID有两个难点

2012-12-08 17:43 573 查看
DELPHI的DBGRID有两个难点:

一,每行都是一个BUTTON,且CAPTION不同

二,每行不同行高,且由用户拖动而不同高的

这两点我用CXGRID全做到了

一,

procedure TForm1.cxGrid1DBTableView1Column1CustomDrawCell(

Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;

***iewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);

var

www: tbutton;

i, j: integer;

begin

www:=nil;

try



for i := ***iewInfo.GridView.Site.ComponentCount - 1 downto 0 do

begin

if ***iewInfo.GridView.Site.Components[i] is tbutton then

begin

tbutton(***iewInfo.GridView.Site.Components[i]).Tag := -1;

if tbutton(***iewInfo.GridView.Site.Components[i]).Caption =

TcxGridDataCellViewInfo(***iewInfo).DisplayValue then

begin

www := tbutton(***iewInfo.GridView.Site.Components[i]);

end;

end;



end;

if TcxGridDataCellViewInfo(***iewInfo).Item.Caption = 'NAME' then

begin

if www = nil then

begin

www := tbutton.Create(***iewInfo.GridView.Site);

www.Visible:=false;

www.Parent := ***iewInfo.GridView.Site;

www.Caption := TcxGridDataCellViewInfo(***iewInfo).DisplayValue; //inttostr(iii);

www.Tag := 1;

end;

www.SetBounds(***iewInfo.ClientBounds.Left, ***iewInfo.ClientBounds.Top,

***iewInfo.ClientBounds.Right - ***iewInfo.ClientBounds.Left, ***iewInfo.ClientBounds.Bottom

-

***iewInfo.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[i] is tbutton then

begin

tbutton(cxgrid1.ActiveView.Site.Components[i]).Tag := -1;

for j := 0 to TcxGridDBtableView(cxgrid1.ActiveView).ViewInfo.RecordsViewInfo.VisibleCount do

begin

if tbutton(cxgrid1.ActiveView.Site.Components[i]).Caption =

TcxGridDataRowViewInfo(TcxGridDBtableView(cxgrid1.ActiveView).ViewInfo.RecordsViewInfo.Items[j]).CellViewInfos[0].DisplayValue then

tbutton(cxgrid1.ActiveView.Site.Components[i]).Tag := 1;

end;

if tbutton(cxgrid1.ActiveView.Site.Components[i]).Tag = -1 then

tbutton(cxgrid1.ActiveView.Site.Components[i]).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[i] is tbutton then

begin

tbutton(cxgrid1.ActiveView.Site.Components[i]).Tag := -1;

end;

if tbutton(cxgrid1.ActiveView.Site.Components[i]).Tag = -1 then

tbutton(cxgrid1.ActiveView.Site.Components[i]).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[i])=FRow.RecordIndex then

begin

www[i]:='-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[i])=arecord.RecordIndex then

begin

j:=strtoint(www[i]);

break;

end;

end;

if j<>0 then

begin



if j=-1 then

www[i]:=inttostr(cxGrid1DBTableView1.OptionsView.DataRowHeight);



j:=strtoint(www[i]);

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[i] is tbutton then

begin

tbutton(cxgrid1.ActiveView.Site.Components[i]).Tag := -1;

end;

if tbutton(cxgrid1.ActiveView.Site.Components[i]).Tag = -1 then

tbutton(cxgrid1.ActiveView.Site.Components[i]).Free;

end;

except

end;

end;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: