線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1494
推到 Plurk!
推到 Facebook!

stringgrid的选择控制问题

尚未結案
bolidehi
一般會員


發表:11
回覆:11
積分:4
註冊:2004-03-10

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-03-19 17:35:18 IP:218.88.xxx.xxx 未訂閱
请问: 如STRINGGRID有8列,当我单击前四列时,只使所单击的该行前四列的底色改 变,而后四列的底色不变; 同样,当我单击后四列时,只使所单击的该行后四列的底色改 变,而前四列的底色不变。 请问以上控制怎么实现?
deity
尊榮會員


發表:90
回覆:876
積分:678
註冊:2003-05-09

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-03-19 18:57:40 IP:218.15.xxx.xxx 未訂閱
你好,参照下面做法 http://delphi.ktop.com.tw/topic.php?topic_id=40964 摘录P.D.大大的回答: procedure TForm_Part.stgSpecDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); var xCol, xWidth: integer; xRow, xHeight: integer; begin with Sender as TStringGrid do begin // 拖曳時 if State=[gdSelected] then begin Canvas.Brush.Color:= $0080FFFF; //底色 Canvas.Font.Color:= clBlack; //字體顏色 end // 如果 cell 為 √ else if (Cells[ACol, ARow]='√') then begin Canvas.Brush.Color:= clGreen; //底色 Canvas.Font.Color:= clWhite; //字體顏色 end // 其他狀況 else begin if (ACol<>0) and (ARow<>0) then begin Canvas.Brush.Color:= clGray; Canvas.Font.Color:= clBlack; end; end; // nRow, nCol 在 onSelect 中指定, 並以 private 存在 // 當focus在某一cell時 if (ARow=nRow) and (ACol=nCol) then begin Canvas.Brush.Color:= $00C08080; Canvas.Font.Color:= clBlack; end; // 以下是將文字置中的計算(以 font=9為基礎) xRow:= Round(stgSpec.DefaultRowHeight); xCol:= Round(stgSpec.DefaultColWidth); xHeight:= Abs(stgSpec.Font.Height); xWidth:= 9 * Length(Cells[ACol,ARow]); xRow:= Round((xRow-xHeight)/2); if (ARow=0) or ((ARow<>0) and (ACol<>0)) then xCol:= Round((xCol-xWidth)/2) else xCol:= 2; Canvas.FillRect(Rect); //繪底色 Canvas.textout(Rect.Left xCol,Rect.Top xRow,Cells[ACol,ARow]); //output text end; end; procedure TForm_Part.stgSpecSelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); begin nRow:= ARow; nCol:= ACol; end; 试试看 ——行径窄处,留一步与人行——
jest0024
高階會員


發表:11
回覆:310
積分:224
註冊:2002-11-24

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-03-20 13:54:29 IP:211.74.xxx.xxx 未訂閱
引言: 请问: 如STRINGGRID有8列,当我单击前四列时,只使所单击的该行前四列的底色改 变,而后四列的底色不变; 同样,当我单击后四列时,只使所单击的该行后四列的底色改 变,而前四列的底色不变。 请问以上控制怎么实现?
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); begin //以4為一列重新繪製 with StringGrid1 do begin Canvas.Brush.Color:=clWhite; //背影顏色 if(Row div 4)=(ARow div 4)then Canvas.Brush.Color:=clGreen; Canvas.FillRect(Rect); Canvas.TextOut(Rect.Left,Rect.Top,Cells[ACol,ARow]); end; end; procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); begin //表格重新繪製 StringGrid1.Invalidate; end;
bolidehi
一般會員


發表:11
回覆:11
積分:4
註冊:2004-03-10

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-03-22 10:07:01 IP:218.88.xxx.xxx 未訂閱
非常感谢jest0024!只是应该改一下,因为我要的是:如果选择前 4 COL,则被选择的该ROW的底色改变;同样,如果选择后 4 COL,则被选择的该ROW的底色改变。 不过只要修改以下程式:    procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); begin //以4為一列重新繪製 with StringGrid1 do begin Canvas.Brush.Color:=clWhite; //背影顏色 if((col div 4)=(Acoldiv 4)) and r(ow=arow)then Canvas.Brush.Color:=clGreen; Canvas.FillRect(Rect); Canvas.TextOut(Rect.Left,Rect.Top,Cells[ACol,ARow]); end; end;    procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); begin //表格重新繪製 StringGrid1.Invalidate; end;    
系統時間:2024-06-29 16:35:02
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!