請問stringgrid上色的問題 |
尚未結案
|
opium
一般會員 發表:22 回覆:11 積分:6 註冊:2003-02-23 發送簡訊給我 |
請問各位先進: 假設我在cells[0][arow]=0, 當資料變為0後
就把cells[1][arow]底色變為紅色,試了許多方法也看了站上的許多文章
都不行,需要在加上 StringGrid1->Repaint(); 才能是我需要的,
可是這樣畫面就會一閃一閃的,請問有半法改進嗎?
void __fastcall TForm1::Button1Click(TObject *Sender) { StringGrid1->Cells[1][1]="1"; } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { StringGrid1->Cells[1][1]="0"; } //--------------------------------------------------------------------------- void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect, TGridDrawState State) { if(ARow>0 && ACol>0) { if(StringGrid1->Cells[1][ARow]=="1") StringGrid1->Canvas->Brush->Color=clSkyBlue; StringGrid1->Canvas->FillRect(Rect); } } //--------------------------------------------------------------------------- void __fastcall TForm1::Button3Click(TObject *Sender) { StringGrid1->Refresh(); }謝謝各位指導 「好程式應與他人分享!」無疑是至理名言。 -Richard Stallman,GNU 計畫的創辦人 GNU宣言 發表人 - opium 於 2005/05/31 17:18:27 |
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
opium 您好: 我這邊測試的結果,畫面並不會閃動,如果您那邊有這個問題,不妨試著在 Form 的 OnCreate 事件中加上 StringGrid1->DoubleBuffered = true; 的設定,看看會不會好一些?
另外為了求得修改資料後能夠立即看到底色的變化效果,您可以考慮直接將 Refresh() 的敘述放在變更 Cells 資料後的敘述之後,例如:
void __fastcall TForm1::Button1Click(TObject *Sender) { StringGrid1->Cells[1][1]="1"; StringGrid1->Refresh(); } void __fastcall TForm1::Button2Click(TObject *Sender) { StringGrid1->Cells[1][1]="0"; StringGrid1->Refresh(); }如果您貼上來的程式碼僅是為了述明重點而予以簡化掉的,那就沒有問題,否則您的 DrawCell 事件尚需加上一些處哩,否則欄位內的資料將不會顯示出來。 |
opium
一般會員 發表:22 回覆:11 積分:6 註冊:2003-02-23 發送簡訊給我 |
謝謝RedSnow大大的指導 我這是簡化過的 沒錯 @@"" 因為我用thread rs232接收資料在運算 把Refresh();放在運算結果後
因為要即時的反應,會一直接收一直運算0和1會一直變來變去
就會變為一閃一閃的,而我想改變的不是0或1自已的cell而是
旁邊的cell所以必需要用refresh但卻會一閃一閃
是我一開始表達的不好
不好意思 不知大大是有更好的做法
謝謝指導 「好程式應與他人分享!」無疑是至理名言。
-Richard Stallman,GNU 計畫的創辦人
GNU宣言
|
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
opium 您好: 我用 Timer 來模擬您的 "即時" 狀況,觸發週期為千分之一秒 (Timer Interval = 1),畫面會開始發生閃爍現象,後來我在 Form 的 OnCreate 事件中加上 StringGrid1->DoubleBuffered = true; 的設定後,狀況明顯改善,以下是我的測試碼:
void __fastcall TForm1::FormCreate(TObject *Sender) { StringGrid1->DoubleBuffered = true; randomize(); } void __fastcall TForm1::Timer1Timer(TObject *Sender) { int row = (rand() % (StringGrid1->RowCount-1)) 1; int no = (rand() % 2); if(StringGrid1->Cells[1][row] != no){ // 加上此行以減少不必要的欄位更新與 Refresh() 動作 StringGrid1->Cells[1][row] = no; StringGrid1->Refresh(); } }您參考一下吧。 |
opium
一般會員 發表:22 回覆:11 積分:6 註冊:2003-02-23 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |