如何控制stringgrid某一列的颜色 |
尚未結案
|
huyang
一般會員 ![]() ![]() 發表:23 回覆:26 積分:9 註冊:2003-11-20 發送簡訊給我 |
|
hagar
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
參考 Peter Below 大大的兩個解答: http://www.lmc-mediaagentur.de/dpool/tips/0520.htm
1.
type TGridCracker = Class( TStringGrid ); {required to access protected method InvalidateRow} procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); begin with TGridCracker( Sender as TStringGrid ) do begin InvalidateRow( Row ); InvalidateRow( aRow ); end; end; procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); var grid: TStringGrid; begin if gdFixed In State then Exit; grid := Sender As TStringGrid; if grid.Row = aRow then begin with Grid.Canvas.Brush do begin Color := $C0FFFF; {pale yellow} Style := bsSolid; end; grid.Canvas.FillRect( Rect ); grid.Canvas.Font.Color := clBlack; grid.Canvas.TextRect( Rect, Rect.Left 2, Rect.Top 2, grid.Cells[acol, arow]); Grid.Canvas.Brush := grid.Brush; end; end;2. unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, StdCtrls, Grids; const UM_INVALIDATEROW = WM_USER 321; type TForm1 = class(TForm) StatusBar: TStatusBar; Button1: TButton; OpenDialog1: TOpenDialog; Label1: TLabel; StringGrid1: TStringGrid; Edit1: TEdit; procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); procedure StringGrid1Enter(Sender: TObject); procedure StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); procedure StringGrid1Exit(Sender: TObject); private { Private declarations } FGridActive: Boolean; procedure UMInvalidateRow( var msg: TMessage ); message UM_INVALIDATEROW; public { Public declarations } end; var Form1: TForm1; dummy: Integer; implementation {$R *.DFM} type TGridCracker = class( TStringgrid ); { gives access to protected methods } procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); var grid: TStringgrid; begin {Task: color the current row} grid := Sender as TStringgrid; if FGridActive and (aRow = grid.Row) and (aCol >= grid.FixedCols) then begin grid.Canvas.brush.Color := clBlue; grid.canvas.font.color := clWhite; grid.canvas.FillRect( Rect ); InflateRect( rect, - 2, - 2 ); grid.Canvas.TextRect( Rect, rect.left, rect.top, grid.cells[aCol, aRow]); end else if (gdSelected In State) and not grid.Focused then begin grid.Canvas.brush.Color := grid.color; grid.canvas.font.color := grid.font.color; grid.canvas.FillRect( Rect ); InflateRect( rect, - 2, - 2 ); grid.Canvas.TextRect( Rect, rect.left, rect.top, grid.cells[aCol, aRow]); end; end; procedure TForm1.StringGrid1Enter(Sender: TObject); begin if Sender is TStringgrid then with TGridCracker( sender ) do PostMessage( self.handle, UM_INVALIDATEROW, Row, Integer(sender)); FGridActive := true; { Cannot rely on grid.focused here, it is not yet true when the message send above is processed for some reason. } end; procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); var grid: TStringgrid; begin grid := Sender as TStringgrid; if grid.Row <> aRow then PostMessage( handle, UM_INVALIDATEROW, grid.Row, Integer(grid)); PostMessage( handle, UM_INVALIDATEROW, aRow, Integer(grid)); end; procedure TForm1.UMInvalidateRow(var msg: TMessage); begin TGridCracker( msg.lparam ).InvalidateRow( msg.wparam ); end; procedure TForm1.StringGrid1Exit(Sender: TObject); begin if Sender is TStringgrid then with TGridCracker( sender ) do PostMessage( self.handle, UM_INVALIDATEROW, Row, Integer(sender)); FGridActive := false; end; end.--- Everything I say is a lie. |
huyang
一般會員 ![]() ![]() 發表:23 回覆:26 積分:9 註冊:2003-11-20 發送簡訊給我 |
|
hagar
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
|
azurecloud
中階會員 ![]() ![]() ![]() 發表:52 回覆:108 積分:92 註冊:2003-09-04 發送簡訊給我 |
這位發言的先生,敬人者人恒敬之,我查過您所有的發問明細,沒有一篇是
給分的,而且發問問題,連個
「請」字都捨不得說 這種態度是正確的嗎? 看看這一句 「這是控制行 我需要一個控制整列的顏色」, 再說你問的這個 Stringgrid 上色的問題,站內隨便搜尋一下少說也上百篇 ,其他的大大是提供您一個思考的方向,而沒有要幫忙解決問題的義務! 我不是在說大話,雖然我是程式新手,但參照 hagar 大大提供的程式碼,10 分鐘不到就改好了,有圖為証我要努力向上======================== |
azurecloud
中階會員 ![]() ![]() ![]() 發表:52 回覆:108 積分:92 註冊:2003-09-04 發送簡訊給我 |
|
huyang
一般會員 ![]() ![]() 發表:23 回覆:26 積分:9 註冊:2003-11-20 發送簡訊給我 |
|
azurecloud
中階會員 ![]() ![]() ![]() 發表:52 回覆:108 積分:92 註冊:2003-09-04 發送簡訊給我 |
|
hahalin
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:295 回覆:1698 積分:823 註冊:2002-04-14 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |