加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

delphi 实现 TreeView Grid (树形表格) 源代码

(2009-10-28 15:48:34)
标签:

delphi

代码

treeview

grid

冯思锐

it

已经有最新版本,请查看

http://blog.sina.com.cn/s/blog_426dbc190100lbxy.html

delphi <wbr>实现 <wbr>TreeView <wbr>Grid <wbr>(树形表格) <wbr>源代码

以下是源代码

//  冯思锐于2009年9月

  TcolTreeView = class;

  TTreeColumn = class(TCollectionItem)
  private
    FColWidth: integer;
    FTitle: string;
    FColor: TColor;
    FTransParent: boolean;
    FAlign: TAlignment;
    procedure SetColor(const Value: TColor);
    procedure SetTitle(const Value: string);
    procedure SetcolWidth(const Value: integer);
    procedure setTransparent(const Value: boolean);
  protected
    function GetDisplayName: string; override;
  public
    constructor Create(Collection: TCollection); override;
    procedure Assign(Source: TPersistent); override;
  published
    property TiTle: string read FTitle write SetTitle;
    property Colwidth: integer read FColWidth write SetcolWidth;
    property Color: TColor read FColor write SetColor;
    property Align: TAlignment read FAlign write FAlign;
    property Transparent: boolean read FTransParent write setTransparent;
  end;

  TTreeColumnClass = class of TTreeColumn;

  TTreeColumns = class(TCollection)
  private
    FTreeView: TcolTreeView;
    function GetColumn(Index: Integer): TTreeColumn;
    procedure SetColumn(Index: Integer; Const Value: TTreeColumn);
  protected
    procedure Update(Item: TCollectionItem); override;
  public
    constructor Create(TreeView: TcolTreeView; ColumnClass: TTreeColumnClass);
    property Items[Index: Integer]: TTreeColumn read GetColumn write SetColumn;
  end;

  TcolNode=class(TTreeNode)
  private
    FisBottomLevel: Boolean;
    FTexts: TStrings;
  protected
    //
  public
    constructor Create(AOwner: TTreeNodes);
    destructor Destroy; override;
    property isBottomLevel: Boolean read FisBottomLevel write FisBottomLevel;
    property Texts: TStrings read FTexts write FTexts;
  end;

  TcolTreeView = class(TTreeView)
  private
    { Private declarations }
    FTextoffSet: integer;
    FclSelected: TColor;
    FclTitleEnd: TColor;
    FclTitleBegin: TColor;
    FclBegin: TColor;
    FclFrame: TColor;
    FCloumns: TTreeColumns;
    FColumns: TTreeColumns;
    FHeadHeight: integer;
    FFlatHead: boolean;
    procedure WMNCPAINT(var Message: TWMNCPAINT); message WM_NCPAINT;
    procedure WMNCCalcSize(var Message: TWMNCCalcSize); message WM_NCCALCSIZE;
    procedure SetclSelected(const Value: TColor);
    procedure SetclTitleBegin(const Value: TColor);
    procedure SetclTitleEnd(const Value: TColor);
    procedure SetTextoffSet(const Value: integer);
    procedure SetclBegin(const Value: TColor);
    procedure SetclFrame(const Value: TColor);
    procedure SetColumns(const Value: TTreeColumns);
  protected
    { Protected declarations }
    function CreateNode: TTreeNode; override;
//    function CreateNodes: TTreeNodes; override;
  public
    { Public declarations }
    procedure invalidate; override;
    function HeadRect: TRect;
    function getTitleRect(index: integer): TRect;
    constructor Create(Aowner: TComponent); override;
    destructor Destroy; override;
  published
    { Published declarations }
    property clTitleBegin: TColor read FclTitleBegin write SetclTitleBegin;
    property clTitleEnd: TColor read FclTitleEnd write SetclTitleEnd;
    property clSelected: TColor read FclSelected write SetclSelected;
    property TextoffSet: integer read FTextoffSet write SetTextoffSet;
    property clBegin: TColor read FclBegin write SetclBegin;
    property clFrame: TColor read FclFrame write SetclFrame;
    property Columns: TTreeColumns read FColumns write SetColumns;
    property HeadHeight: integer read FHeadHeight write Fheadheight;
    property FlatHead: boolean Read FFlatHead write FFlatHead;

  end;

 

-------

 

{ TTreeColumn }

procedure TTreeColumn.Assign(Source: TPersistent);
begin
  if Source is TTreeColumn then
  begin
    if Assigned(Collection) then Collection.BeginUpdate;
    try
      Colwidth:=TTreeColumn(Source).Colwidth;
      TiTle:=TTreeColumn(Source).TiTle;
      Color:=TTreeColumn(Source).Color;
      Transparent:=TTreeColumn(Source).Transparent;
    finally
      if Assigned(Collection) then Collection.EndUpdate;
    end;
  end
  else
    inherited Assign(Source);
end;

constructor TTreeColumn.Create(Collection: TCollection);
begin
  inherited create(Collection);
  FColWidth:=60;
  FColor:=clWhite;
  FTransParent:=True;
end;

function TTreeColumn.GetDisplayName: string;
begin
  result:='第 '+inttoStr(index+1)+' 列  '+FTitle;
end;

procedure TTreeColumn.SetColor(const Value: TColor);
begin
  FColor:=value;
end;

procedure TTreeColumn.SetcolWidth(const Value: integer);
begin
  FColWidth:=value;
end;

procedure TTreeColumn.SetTitle(const Value: string);
begin
  FTitle:=value;
end;

procedure TTreeColumn.setTransparent(const Value: boolean);
begin
  FTransParent:=value;
end;

{ TcolTreeView }

constructor TcolTreeView.Create(Aowner: TComponent);
begin
  inherited create(Aowner);
  FTextoffSet:=3;
  FclSelected:=clBlue;
  FclTitleBegin:=clwhite;
  FclTitleBegin:=clGray;
  FclFrame:=clBlack;
  FHeadHeight:=22;
  FColumns:=TTreeColumns.Create(self, TTreeColumn);
end;

function TcolTreeView.CreateNode: TTreeNode;
begin
  Result := TcolNode.Create(Items);
end;
{
function TcolTreeView.CreateNodes: TTreeNodes;
begin
  //Result := TTreeNodes.Create(Self);
end;
}
procedure TcolTreeView.SetclBegin(const Value: TColor);
begin

end;

procedure TcolTreeView.SetclFrame(const Value: TColor);
begin
  FclFrame:=value;
end;

procedure TcolTreeView.SetColumns(const Value: TTreeColumns);
begin
  TCollection(Columns).Assign(value);
end;

procedure TcolTreeView.SetclSelected(const Value: TColor);
begin
  FclSelected:=value;
//  InvalidateRect(Handle, nil, True);
end;

procedure TcolTreeView.SetclTitleBegin(const Value: TColor);
begin
  FclTitleBegin:=value;
  invalidate;
 // self.Update;
 // updateWindow(handle);
 // Invalidate;
end;

procedure TcolTreeView.SetclTitleEnd(const Value: TColor);
begin
  FclTitleEnd:=value;
  invalidate;
end;

procedure TcolTreeView.SetTextoffSet(const Value: integer);
begin
  FTextoffSet:=value;
end;

procedure TcolTreeView.WMNCPAINT(var Message: TWMNCPAINT);
var
  DC: HDC;
  cs: TControlCanvas;
  R, Rb, Hr: TRect;
  bmp: TbitMap;
  i: integer;
  s: string;
begin
  { Get window DC that is clipped to the non-client area }
    DC := GetWindowDC(Handle);
    cs:=TcontrolCanvas.Create;
    cs.Handle:=Dc;
    bmp:=Tbitmap.Create;
    try
      cs.Brush.Color:=FclTitleBegin;
      Hr:=HeadRect;
      cs.FillRect(Hr);
      for i:=0 to FColumns.Count-1 do
      begin
        R:=getTitleRect(i);
        bmp.Width:=R.Right-R.Left;
        bmp.Height:=R.Bottom-R.Top;
        Rb:=Rect(0, 0, bmp.Width, bmp.Height);
        if FFlathead then
        begin
          bmp.Canvas.Brush.Color:=FclTitleBegin;
          bmp.Canvas.FillRect(rb);
        end else
          FillTubeGradientRect(bmp.Canvas.Handle, Rb, FclTitleBegin, FclTitleEnd, false);
        if Columns.Items[i].Color<>clWhite then BlendBmp(Bmp, Columns.Items[i].color, 32);
        s:=Columns.Items[i].TiTle;
        bmp.Canvas.Brush.Style:=bsClear;
        inc(Rb.Left, FTextoffSet);
        DrawText(bmp.Canvas.Handle, pchar(s), length(s), Rb, DT_VCENTER OR DT_SINGLELINE);
        cs.Draw(R.Left, R.Top, bmp);
      end;
      cs.Pen.Color:=FclFrame;
      lineRect(Hr, cs, [shsBottom]);
    finally
      ReleaseDC(Handle, DC);
      cs.Free;
      bmp.Free;
    end;
end;

destructor TcolTreeView.Destroy;
begin
  FColumns.Free;
  inherited;
end;

procedure TcolTreeView.WMNCCalcSize(var Message: TWMNCCalcSize);
begin
  inherited;
  inc(Message.CalcSize_Params^.rgrc[0].Top, FHeadHeight);

end;

function TcolTreeView.HeadRect: TRect;
var
  RW: Trect;
begin
  GetWindowRect(Handle, RW);
  Result:=Rw;
  Result.Bottom:=Result.Top + FHeadHeight;
  offsetRect(Result, -Rw.Left, -Rw.Top);
end;

function TcolTreeView.getTitleRect(index: integer): TRect;
  function pleft(pid: integer): integer;
  var
    i: integer;
  begin
    Result:=0;
    for i:=0 to pid do Result:=Result+ Columns.Items[i].Colwidth;
  end;
var
  R: Trect;
begin
  R:=HeadRect;
  result:=R;
  if index = 0 then
    Result:=Rect(R.Left, R.Top, R.Left+Columns.Items[0].FColWidth, R.Bottom)
  else
    Result:=Rect(R.Left+pleft(index-1), R.Top, R.Left+pleft(index), R.Bottom);
end;

procedure TcolTreeView.invalidate;
begin
  inherited;
  sendmessage(handle, WM_NCPAINT, 0, 0);
end;

{ TcolNode }

constructor TcolNode.Create(AOwner: TTreeNodes);
begin
  inherited create(AOwner);
  FTexts:=TStringList.Create;
end;

destructor TcolNode.Destroy;
begin
  FTexts.Free;
  inherited;
end;

{ TTreeColumns }

constructor TTreeColumns.Create(TreeView: TcolTreeView; ColumnClass: TTreeColumnClass);
begin
  inherited Create(ColumnClass);
  Add;
  FTreeView:=TreeView;
end;

function TTreeColumns.GetColumn(Index: Integer): TTreeColumn;
begin
  Result :=TTreeColumn(inherited Items[Index]);
end;

procedure TTreeColumns.SetColumn(Index: Integer; const Value: TTreeColumn);
begin
  Items[Index].Assign(Value);
end;

procedure TTreeColumns.Update(Item: TCollectionItem);
begin
  inherited;
  if assigned(FTreeView) then FTreeView.Invalidate;
end;

end.

 

0

阅读 收藏 喜欢 打印举报/Report
  

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

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

新浪公司 版权所有