Delphi:实现DBGrid的多表头
来源:优易学  2011-10-20 9:58:21   【优易学:中国教育考试门户网】   资料下载   IT书店

  用法:
  设置DBGrid的Column的Caption属性
  例如:Column1的Caption为111|222
  Column2的Caption为111|333
  那么Column1和Column2公用一个表头111
  unit ADBGrid;
  interface
  uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Grids, DBGrids, Math;
  type
  TADBGrid = class(TDBGrid)
  private
  { Private declarations }
  //兄弟列子标题,当前列子标题
  BrerLayerTitles, CurLayerTitles: TStringList;
  SaveFont: TFont;
  //根据当前数据列号和表头的层号获取表头的区域
  function TitleLayerRect(LayerTitles: TStrings; TitleRect: TRect; LayerID, ACol: Integer): TRect;
  //解出当前数据列标题为子标题并返回标题层数(子标题数)
  function ExtractSubTitle(LayerTitles: TStrings; ACol: Integer): Integer;
  protected
  { Protected declarations }
  procedure DrawCell(ACol, ARow: Longint; ARect: TRect; AState: TGridDrawState); override;
  procedure Paint; override;
  public
  { Public declarations }
  constructor Create(AOwner: TComponent); override;
  destructor Destroy; override;
  published
  { Published declarations }
  end;
  procedure Register;
  implementation
  procedure Register;
  begin
  RegisterComponents(\'Samples\', [TADBGrid]);
  end;
  constructor TADBGrid.Create(AOwner: TComponent);
  begin
  inherited;
  BrerLayerTitles := TStringList.Create;
  curLayerTitles := TStringList.Create;
  SaveFont := TFont.Create;
  end;
  destructor TADBGrid.Destroy;
  begin
  BrerLayerTitles.Free;
  curLayerTitles.Free;
  SaveFont.Free;
  inherited;
  end;
  procedure TADBGrid.DrawCell(ACol, ARow: Integer; ARect: TRect;
  AState: TGridDrawState);
  var
  SubTitleRT, CaptionRt, IndicatorRT: TRect;
  Column: TColumn;
  SubTitle: string;
  i: Integer;
  begin
  if (ARow = 0) and (ACol > 0) then

  begin
  ExtractSubTitle(curLayerTitles, RawToDataColumn(ACol));
  for i := 0 to curLayerTitles.Count - 1 do
  begin
  SubTitleRT := TitleLayerRect(curLayerTitles, ARect, i, RawToDataColumn(ACol));
  CaptionRt := SubTitleRT;
  Canvas.Brush.Color := FixedColor;
  Canvas.FillRect(SubTitleRT);
  DrawEdge(Canvas.Handle, SubTitleRT, BDR_RAISEDINNER, BF_TOPLEFT);
  if i <> CurLayerTitles.Count - 1 then
  begin
  DrawEdge(Canvas.Handle, SubTitleRT, BDR_RAISEDOUTER, BF_BOTTOM);
  Dec(SubTitleRT.Bottom, 2);
  end else Dec(SubTitleRT.Bottom, 1);
  Canvas.Pen.Color := clWhite;
  Dec(SubTitleRT.Right, 1);
  Canvas.MoveTo(SubTitleRT.Right, SubTitleRT.Top);
  Canvas.LineTo(SubTitleRT.Right, SubTitleRT.Bottom);
  Canvas.LineTo(SubTitleRT.Left, SubTitleRT.Bottom);
  Column := Columns[RawToDataColumn(ACol)];
  SubTitle := \'\';
  if Assigned(Column) then
  begin
  SubTitle := CurLayerTitles[i];
  SaveFont.Assign(Canvas.Font);
  Canvas.Font.Assign(TitleFont);
  try
  InflateRect(SubTitleRT, -1, -1);
  DrawText(Canvas.Handle, PChar(SubTitle), Length(SubTitle),
  SubTitleRT, DT_CENTER or DT_SINGLELINE or DT_VCENTER);
  finally
  Canvas.Font.Assign(SaveFont);
  end;
  end;
  end;
  if dgIndicator in Options then
  begin
  IndicatorRT := Rect(0, 0, IndicatorWidth + 1, RowHeights[0]);
  Canvas.FillRect(IndicatorRT);
  IndicatorRT.Right := IndicatorRT.Right - 1;
  Canvas.Rectangle(IndicatorRT);
  IndicatorRT.Right := IndicatorRT.Right + 1;
  DrawEdge(Canvas.Handle, IndicatorRT, BDR_RAISEDOUTER, BF_RIGHT);
  end;
  end
  else begin
  inherited;
  if ACol = 0 then
  DrawEdge(Canvas.Handle, ARect, BDR_SUNKENOUTER, BF_BOTTOMRIGHT);
  end;
  end;

[1] [2] 下一页

责任编辑:小草

文章搜索:
 相关文章
热点资讯
资讯快报
热门课程培训