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

大镰诱

大镰诱

2016-02-19 14:18

下面,图老师小编带您去了解一下一個可以顯示CheckBox或RadioButtons的StringGrid類.,生活就是不断的发现新事物,get新技能~
 

  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;

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

  procedure TStringGridEx.SizeChanged(OldColCount, OldRowCount: Longint);
  var i:integer;
  begin
    inherited SizeChanged(OldColCount,oldRowCount);
    SetLength(FSelArray,RowCount);
    if RowCountOldrowCount 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;

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

  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 FTitlesValue then FTitles.Assign(Value);
    Rows[0].Assign(Ftitles);
    Invalidate;
  end;

  function TStringGridEx.GetSelCells(ColIndex,RowIndex:integer):String;
  var i,SelRow:integer;
  begin
    SelRow := 0;
    for i:=1 to RowCount-1 do
    begin
     if RowSelected[I] then inc(SelRow);
     if SelRow = RowIndex then Break;
    end;
    Result := FSelRows[i].Strings[ColIndex];
  end;

  function TStringGridEx.GetSelCnt:Integer;
  var i,R:integer;
  begin
    R:=0;
    for i:=0 to Rowcount-1 do
     if RowSelected[i] then Inc(R);
    Result := R;
  end;

  end.

展开更多 50%)
分享

猜你喜欢

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

编程语言 网络编程
一個可以顯示CheckBox或RadioButtons的StringGrid類.

StringGrid制作只读列

编程语言 网络编程
StringGrid制作只读列

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

一個Ajax.NET的查詢實例

电脑网络
一個Ajax.NET的查詢實例

SysListView控件類的消息常量

编程语言 网络编程
SysListView控件類的消息常量

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

创建一个带有CheckBox的TreeView

编程语言 网络编程
创建一个带有CheckBox的TreeView

創建一個簡單的"專家"

编程语言 网络编程
創建一個簡單的"專家"

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

CSS+DIV制作页面圆角效果

CSS+DIV制作页面圆角效果

Delphi中MIDAS是什么(MIDAS之一)

Delphi中MIDAS是什么(MIDAS之一)
下拉加载更多内容 ↓