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.