全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2719
推到 Plurk!
推到 Facebook!

StringGrid點擊則整行變色

答題得分者是:RootKit
aryoung
一般會員


發表:6
回覆:13
積分:8
註冊:2007-12-19

發送簡訊給我
#1 引用回覆 回覆 發表時間:2010-01-18 13:33:30 IP:125.230.xxx.xxx 訂閱
各位前輩好,
小弟有個問題,
也看了不少文章,
但沒找到我需要的功能,
還是前輩們幫個忙,
我想在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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2010-01-18 15:56:49 IP:125.230.xxx.xxx 訂閱
各位大大好,
小弟已找到解決方法,
原因為畫面更新的問題,
在程式內加入
StringGrid1->Refresh();
即可解決,
謝謝。
RootKit
資深會員


發表:16
回覆:358
積分:419
註冊:2008-01-02

發送簡訊給我
#3 引用回覆 回覆 發表時間:2010-01-19 09:48:05 IP:61.222.xxx.xxx 訂閱

因該是 InvalidateRow 清除變更的行狀態->驅使重劃後劃上
or InvalidateRect 自行定義清除重劃的區塊。

refresh ..... 畫面會很閃吧........... 無言

===================引 用 aryoung 文 章===================
各位大大好,
小弟已找到解決方法,
原因為畫面更新的問題,
在程式內加入
StringGrid1->Refresh();
即可解決,
謝謝。
aryoung
一般會員


發表:6
回覆:13
積分:8
註冊:2007-12-19

發送簡訊給我
#4 引用回覆 回覆 發表時間:2010-01-27 12:18:10 IP:125.230.xxx.xxx 訂閱

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();
即可解決,
謝謝。
系統時間:2024-04-25 23:37:40
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!