加载中…
个人资料
李恒星_释永思
李恒星_释永思
  • 博客等级:
  • 博客积分:0
  • 博客访问:32,004
  • 关注人气:67
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
谁看过这篇博文
加载中…
正文 字体大小:

DELPHI的DBGRID有两个难点

(2011-10-25 10:17:53)
标签:

杂谈

DELPHI的DBGRID有两个难点:
一,每行都是一个BUTTON,且CAPTION不同
二,每行不同行高,且由用户拖动而不同高的
这两点我用CXGRID全做到了
一,

uses  cxGridRows;
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[i] is tbutton then
    begin
        tbutton(AViewInfo.GridView.Site.Components[i]).Tag := -1;
        if tbutton(AViewInfo.GridView.Site.Components[i]).Caption =
          TcxGridDataCellViewInfo(AViewInfo).DisplayValue then
        begin
          www := tbutton(AViewInfo.GridView.Site.Components[i]);
        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.SendToBack;
        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

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

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

procedure TForm1.cxGrid1DBTableView1LeftPosChanged(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

        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;

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
前一篇:优化SQL
后一篇:相识也是缘份
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

    < 前一篇优化SQL
    后一篇 >相识也是缘份
      

    新浪BLOG意见反馈留言板 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有