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

請問stringgrid上色的問題

尚未結案
opium
一般會員


發表:22
回覆:11
積分:6
註冊:2003-02-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-05-31 16:46:53 IP:218.162.xxx.xxx 未訂閱
請問各位先進:    假設我在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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-05-31 18:14:31 IP:61.140.xxx.xxx 未訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-05-31 19:15:38 IP:61.219.xxx.xxx 未訂閱
謝謝RedSnow大大的指導 我這是簡化過的 沒錯 @@"" 因為我用thread rs232接收資料在運算 把Refresh();放在運算結果後 因為要即時的反應,會一直接收一直運算0和1會一直變來變去 就會變為一閃一閃的,而我想改變的不是0或1自已的cell而是 旁邊的cell所以必需要用refresh但卻會一閃一閃 是我一開始表達的不好 不好意思 不知大大是有更好的做法 謝謝指導 「好程式應與他人分享!」無疑是至理名言。 -Richard Stallman,GNU 計畫的創辦人 GNU宣言
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-05-31 21:29:40 IP:61.140.xxx.xxx 未訂閱
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-06-01 07:58:19 IP:218.162.xxx.xxx 未訂閱
StringGrid1->DoubleBuffered = true;    加上這行 就好很多了 真是謝謝大大 「好程式應與他人分享!」無疑是至理名言。 -
系統時間:2024-07-05 8:58:39
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!