灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:4170回复:0

DELPHI的DBGRID有两个难点

楼主#
更多 发布于:2012-09-08 13:04

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;


喜欢0 评分0
游客

返回顶部