stringgrid的选择控制问题 |
尚未結案
|
bolidehi
一般會員 發表:11 回覆:11 積分:4 註冊:2004-03-10 發送簡訊給我 |
|
deity
尊榮會員 發表:90 回覆:876 積分:678 註冊:2003-05-09 發送簡訊給我 |
你好,参照下面做法
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 發送簡訊給我 |
引言: 请问: 如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 發送簡訊給我 |
非常感谢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;
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |