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

2016-02-19 14:18 17 1 收藏

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

【 tulaoshi.com - 编程语言 】

 

  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

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

    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 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://www.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.

来源:http://www.tulaoshi.com/n/20160219/1606679.html

延伸阅读
标签: 电脑入门
关了灯的房间没有人会怕黑 是剩下的热咖啡没有人会喝醉 回忆后的过去被狠狠的撕碎 只剩下那些零碎的记忆 -------------------------------------------------------------------------------- /。       、  、        - ○ -       ′...
代码如下: public class MainActivity extends Activity {  TextView tv;  CheckBox cb1;  CheckBox cb2;  @Override  protected void onCreate(Bundle savedInstanceState) {   super.onCreate(savedInstanceState);   setContentView(R.layout.activity_main);   cb1 = (CheckBo...
标签: Web开发
在一个表单中有很多CheckBox,请问如何实现选种一个而让所有的都选中?   ---------------------------------------------------------------   function  selectAll(checkBoxName){              var  elms  = ...
产妇营养小贴示 经过辛苦的十月怀胎,孕妈们还要经历产后保养,生产会让妈妈们的身体状况很虚弱,怎样才能帮孕妈妈们快速恢复体力,又能让孕妈有充足的营养?一起看看图老师小编为妈妈们送上的产妇营养小贴示吧。   红糖 营养特点:含铁量高,给产妇补血。 营养作用:含多种微量元素和...
标签: ASP
全选/反选: <input type="checkbox" name="selAll" onclick="SelectAll(this,'DataGrid1',0);"全选/反选 注SelectAll參數說明:    DataGrid1:為DataGrid的ID    0:為checkbox在Datagrid中的列位置:從0開始,不顯示出來的列不算         function SelectAll(cur,obj,item) { var ...

经验教程

551

收藏

54
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部