转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件开发 >> Delphi程序 >> 正文
一個可以顯示CheckBox或RadioButtons的StringGrid類.         ★★★★

一個可以顯示CheckBox或RadioButtons的StringGrid類.

作者:闵涛 文章来源:闵涛的学习笔记 点击数:1450 更新时间:2009/4/23 18:30:35

unit StringGridEx;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Grids;

type TBtns = (CheckBoxes,RadioButtons);

type
  TStringGridEx = class(TStringGrid)
  private
    { Private declarations }
    FTickCol:Integer;
    FShowTick:Boolean;
    FSelArray:Array of Boolean;
    FSelRows:Array of TStrings;
    FRowHeight:integer;
    FDblClick:TNotifyEvent;
    FSelectCell:TSelectCellEvent;
    FBtns : TBtns;
    IsDblClicked:Boolean;
    FTitles:TStrings;

    procedure SetTickCol(Value : integer);
    procedure SetShowTick(Value : Boolean);
    procedure SetRowHeight(Value:Integer);
    procedure SetBtns(Value : TBtns);
    procedure SetRowSelected(RowIndex:integer;Value:Boolean);
    procedure DoSelectCell(Sender: TObject; ACol, ARow: Longint;
     var CanSelect: Boolean);
    procedure DoDblClick(Sender:TObject);

    function GetCurrentRow:integer;
    function GetRowSelected(RowIndex : Integer):Boolean;
    function GetSelCells(ColIndex,RowIndex:integer):String;
    function GetSelCnt:Integer;
    procedure SetTitles(Value : TStrings);
  protected
    { Protected declarations }
    procedure SizeChanged(OldColCount, OldRowCount: Longint);override;
    procedure DrawCell(ACol, ARow: Longint; ARect: TRect;
      AState: TGridDrawState);override;
  public
    { Public declarations }
    constructor Create(AOwner:Tcomponent);override;
    destructor Destroy;override;
    property ColWidths;
    property RowHeights;

    procedure SelectAll;
    procedure UnSelectAll;

    property CurrentRow :Integer read GetCurrentRow;
    property SelectCount:Integer read GetSelCnt;
    property RowSelected[RowIndex:Integer]:Boolean read GetRowSelected write SetRowSelected;
    property CellsOfSelection[Col,Row:Integer]:String read GetSelCells;

  published
    { Published declarations }
    property ShowTick:Boolean read FShowTick write SetShowTick default false;
    property TickCol:integer read FTickCol write SetTickCol default -1;
    property TickButton : TBtns read FBtns write SetBtns default CheckBoxes;
    property Titles:TStrings read FTitles write SetTitles;
    property RowHeight:Integer read FRowHeight write SetRowHeight default 18;

    property OnCellDblClick:TNotifyEvent read FDblClick write FDblClick;
    property OnCellSelected:TSelectCellEvent read FSelectCell write FSelectCell;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents(''''MyControls'''', [TStringGridEx]);
end;

constructor TStringGridEx.Create(AOwner:Tcomponent);
var i:integer;
begin
  inherited;
  FTitles := TStringList.Create;
  FTitles.Clear;
  SetLength(FSelArray,RowCount);
  SetLength(FSelRows,RowCount);
  for i:=0 to Rowcount-1 do
   FSelRows[i] := TStringList.Create;
  IsDblClicked := False;
  OnDblClick := DoDblClick;
  OnSelectCell := DoSelectCell;
  for i:=0 to RowCount -1 do
    if FRowHeight < RowHeights[i] then FRowHeight := RowHeights[i];
end;

destructor TStringGridEx.Destroy;
var i:integer;
begin
  for i:=0 to RowCount-1 do
   FSelRows[i].Free;
  FTitles.Free;
  inherited;
end;

procedure TStringGridEx.DrawCell(ACol, ARow: Longint; ARect: TRect;
  AState: TGridDrawState);
var Checked:Boolean;
const
  CheckBox : array[Boolean] of Integer = (DFCS_BUTTONCHECK,
  DFCS_BUTTONCHECK or DFCS_CHECKED);
  RadioButton : array[Boolean] of Integer = (DFCS_BUTTONRADIO,
  DFCS_BUTTONRADIO or DFCS_CHECKED);
begin

  inherited DrawCell(ACol, ARow,ARect,AState);
  if FShowTick and (ACol = FTickCol) and (ARow >= FixedRows) then 
  begin
    Checked := FSelArray[ARow];
    Canvas.FillRect(ARect);
    if FBtns = CheckBoxes then
      DrawFrameControl(Canvas.Handle,ARect,DFC_BUTTON,
          CheckBox[Checked])
    else
    DrawFrameControl(Canvas.Handle,ARect,DFC_BUTTON,
        RadioButton[Checked]);
  end;

end;

procedure TStringGridEx.SetTickCol(Value : Integer);
begin
  FTickCol := Value;
end;

procedure TStringGridEx.SetShowTick(Value : Boolean);
begin
  FShowTick := Value;
end;

function TStringGridEx.GetRowSelected(RowIndex : Integer):Boolean;
begin
  Result := FSelArray[RowIndex];
end;

procedure TStringGridEx.SetRowSelected(RowIndex:integer;Value:Boolean);
var i:integer;
begin
  Row := RowIndex;
  if Value then begin
    FSelRows[RowIndex].Clear;
    for i:=0 to ColCount-1 do
     FSelRows[RowIndex].Add(Cells[i,RowIndex]);
  end;
  FSelArray[RowIndex] := Value;
end;

function TStringGridEx.GetCurrentRow : Integer;
begin
  Result := Row;
end;

procedure TStringGridEx.DoDblClick(Sender : TObject);
begin
  if FShowTick and (Col = FTickCol) then
    FSelArray[Row] := not FSelArray[Row];
  If FSelArray[Row] then
    SetRowSelected(Row,FSelArray[Row]);
  if Assigned(FDblClick) then FDblClick(Sender);
  IsDblClicked := True;
end;

procedure TStringGridEx.DoSelectCell(Sender: TObject; ACol, ARow: Longint;
    var CanSelect: Boolean);
var i:integer;
begin
  if IsDblClicked then
  begin
   if FShowTick and (ACol = FTickCol) then
    FSelArray[ARow] := not FSelArray[ARow];
  end;
  If FSelArray[ARow] then begin
    FSelRows[ARow].Clear;
    for i:=0 to ColCount-1 do
     FSelRows[ARow].Add(Cells[i,ARow]);
  end;
  if Assigned(FSelectCell) then FSelectCell(Sender,ACol,ARow,CanSelect);
end;

procedure TStringGridEx.SetRowHeight(Value : Integer);
var i:integer;
begin
  for i:=0 to RowCount -1 do
    RowHeights[i] := Value;
  FRowHeight := Value;
  Invalidate;
end;

procedure TStringGridEx.SetBtns(Value : TBtns);
begin
  FBtns := value;
  Invalidate;
end;

procedure TStringGridEx.SizeChanged(OldColCount, OldRowCount: Longint);
var i:integer;
begin
  inherited SizeChanged(OldColCount,oldRowCount);
  SetLength(FSelArray,RowCount);
  if RowCount<>OldrowCount then
   for i:=0 to OldRowCount-1 do
     FSelRows[i].Free;
  SetLength(FSelRows,RowCount);
  for i:=0 to Rowcount-1 do
   FSelRows[i] := TStringList.Create;
  IsDblClicked := False;
end;

procedure TStringGridEx.SelectAll;
var i:integer;
begin
  for i:=1 to RowCount-1 do
  begin
    SetRowSelected(i,True);
  end;

  IsDblClicked := False;
  Row := 0;
  invalidate;
end;

procedure TStringGridEx.UnSelectAll;
var i:integer;
begin
  for i:=1 to RowCount-1 do
  begin
    SetRowSelected(i,False);
    FSelRows[i].Clear;
  end;

  Row :=0;
  IsDblClicked := False;
  invalidate;
end;

procedure TStringGridEx.SetTitles(Value : TStrings);
begin
  if FTitles<>Value then FTitles.Assign(Value);
  Rows[0].Assign(Ftitles);
  Invalidate;
end

[1] [2]  下一页


没有相关教程
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · C语言系列  · VB.NET程序
    · JAVA开发  · Delphi程序
    · 脚本语言
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台