A StringGrid class that can display Checkbox or Radiobuttons.

xiaoxiao2021-03-06  82

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]);

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

Destructor TstringGridex.destroy; var i: integer; begin for i: = 0 to rowcount-1 do fselrows [i] .free; ftitles.free; inherited;

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); begininherited 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;

Function TstringGridEx.getrowSelected (Rowindex: Integer): boolean; begin result: = fselarray [rowindex];

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; fselaRay [RowIndex]: = value;

Function TStringGridEx.getcurrentrow: integer; begin result: = row;

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)...........................

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] .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;

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;

Procedure tstringgridex.selectall; var i: integer; begin for i: = 1 to rowcount-1 do begin setrowselected (i, true);

ISDBLCLICKED: = false; row: = 0; invalidate;

Procedure tstringgridex.unselectall; var i: integer; begin for i: = 1 To RowCount-1 Do Begin SetrowSelected (i, false); fselrows [i] .clear;

Row: = 0; isdblclicked: = false; invalidate;

Procedure TstringGridex.Settitles (Value: Tstrings); Begin if ftitles <> value kilure; rows [0] .assign (ftitles); invalidate;

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]. INC (R); Result: = r; end;

End.

转载请注明原文地址:https://www.9cbs.com/read-96440.html

New Post(0)