分享
 
 
 

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

王朝delphi·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

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;

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.

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有