StringGrid點擊則整行變色 |
答題得分者是:RootKit
|
aryoung
一般會員 發表:6 回覆:13 積分:8 註冊:2007-12-19 發送簡訊給我 |
各位前輩好,
小弟有個問題, 也看了不少文章, 但沒找到我需要的功能, 還是前輩們幫個忙, 我想在StringGrid中, 點選某一行, 其整行變色, 再點一次,則變回原色, 當然可能會一次點多行, 例如 如果點第一行、第三行、第五行, 則這三行都整行變色, 再點第一行的話, 則就只有第三行和第五行變色, 第一行回復色, 另外,StringGrid中都有其資料, 在變色後,資料要保持原數據, 請前輩指教, 謝謝各位。 以下為我的程式碼, [code cpp] void __fastcall TForm1::FormCreate(TObject *Sender) { pram[0] = false ; pram[1] = false ; pram[2] = false ; pram[3] = false ; pram[4] = false ; } //--------------------------------------------------------------------------- void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect, TGridDrawState State) { if (State.Contains(gdFixed)) return; //如果遇到固定列或行時不執行後續程式碼 if (pram[ACol] == true) StringGrid1->Canvas->Brush->Color=clLime ; StringGrid1->Canvas->TextRect (Rect, Rect.Left, Rect.Top,StringGrid1->Cells[ACol][ARow]); } //--------------------------------------------------------------------------- void __fastcall TForm1::FormActivate(TObject *Sender) { StringGrid1->RowCount=5; StringGrid1->ColCount=5; } //--------------------------------------------------------------------------- void __fastcall TForm1::StringGrid1SelectCell(TObject *Sender, int ACol, int ARow, bool &CanSelect) { pram[ACol] = !pram[ACol]; } //--------------------------------------------------------------------------- [/code] |
aryoung
一般會員 發表:6 回覆:13 積分:8 註冊:2007-12-19 發送簡訊給我 |
|
RootKit
資深會員 發表:16 回覆:358 積分:419 註冊:2008-01-02 發送簡訊給我 |
|
aryoung
一般會員 發表:6 回覆:13 積分:8 註冊:2007-12-19 發送簡訊給我 |
RootKit大您好, 我用Refresh確實會很閃, 能否教我該如何使用InvalidateCol呢, 謝謝, 以下是我的程式碼, [code cpp] void __fastcall TTwBelt_ToothCalFrm::StrG_BeltPramDrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect, TGridDrawState State) { if(State.Contains(gdFixed)) return; if(BeltPram[ACol] == true) { StrG_BeltPram->Canvas->Brush->Color = clLime; StrG_BeltPram->Canvas->FillRect(Rect); DrawText(StrG_BeltPram->Canvas->Handle, StrG_BeltPram->Cells[ACol][ARow].c_str(), StrG_BeltPram->Cells[ACol][ARow].Length(), &Rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE); } else { StrG_BeltPram->Canvas->Brush->Color = clWindow; StrG_BeltPram->Canvas->FillRect(Rect); DrawText(StrG_BeltPram->Canvas->Handle, StrG_BeltPram->Cells[ACol][ARow].c_str(), StrG_BeltPram->Cells[ACol][ARow].Length(), &Rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE); } if(NeedRefresh == true) { StrG_BeltPram->Refresh(); NeedRefresh = false; } } //--------------------------------------------------------------------------- void __fastcall TTwBelt_ToothCalFrm::StrG_BeltPramSelectCell( TObject *Sender, int ACol, int ARow, bool &CanSelect) { NeedRefresh = true; BeltPram[ACol] = !BeltPram[ACol]; } //--------------------------------------------------------------------------- [/code] ===================引 用 RootKit 文 章=================== 因該是 InvalidateRow 清除變更的行狀態->驅使重劃後劃上 or InvalidateRect 自行定義清除重劃的區塊。 refresh ..... 畫面會很閃吧........... 無言 ===================引 用 aryoung 文 章=================== 各位大大好, 小弟已找到解決方法, 原因為畫面更新的問題, 在程式內加入 StringGrid1->Refresh(); 即可解決, 謝謝。 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |