DELPHI的DBGRID有两个难点

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[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.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有两个难点)