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',po
inter(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;