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;
一,每行都是一个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;
相关文章推荐
- DELPHI的DBGRID有两个难点
- Delphi中的操作二进制文件的两个重要函数
- Delphi DBGRID中 根据不同的字段值显示不同的小图标
- Delphi DBGrid双击事件、单元格操作
- Delphi TdxDBGrid 使用简介
- Delphi中比较两个对象是否一致及地址是否相同
- Delphi+DBGrid导出Excel文件代码 (适合没有安装excel的机器)
- Delphi两个遍历指定目录下指定类型文件的函数
- Delphi 读取dbgrid中的选中一行的代码及定位函数
- 在Delphi中DBGrid有一个MouseMove事件,当鼠标移动时怎么知道光标在哪个单元格上面
- 清除delphi 控件DBgrid 的记录
- 他山之石 网上Delphi DBGrid总结
- 只言碎语总结,今后发展web前端,并分享两个项目难点解决方案。
- 让Delphi的DBGrid支持鼠标轮
- Delphi关于DBGrid选中行自动变色的问题
- DELPHI中DBGrid中行的定位及着色实现
- Delphi excel 复制粘贴到dbgrid
- Delphi 两个应用程序(进程)之间的通信
- delphi 如何比较两个二维数组是否相等
- 彻底解决Delphi的DBGrid控件鼠标滚轮问题(转)