| TStringGrid | BCB Tips! Last modified : 2006/07/06 |
// --- 0行目 StringGrid1->Cells[0][0] = "#"; StringGrid1->Cells[1][0] = "IP"; StringGrid1->Cells[2][0] = "Port"; // --- 1行目 StringGrid1->Cells[0][1] = "1"; StringGrid1->Cells[1][1] = "192.168.1.11"; StringGrid1->Cells[2][1] = "20200"; |
![]() Figure 1 |
void __fastcall TMainForm::StringGrid1DrawCell(TObject *Sender, int ACol,
int ARow, TRect &Rect, TGridDrawState State)
{
UINT opt=DT_VCENTER | DT_RIGHT | DT_SINGLELINE; // セルに描画するときのスタイル
if(ARow==0){ return; }
// if(StringGrid1->Cells[ACol][ARow].ToInt() >= 100){ // 100以上の場合
if (State.Contains(gdSelected)){
StringGrid1->Canvas->Brush->Color = TColor(RGB(240,220,220)); // clRed;
StringGrid1->Canvas->FillRect(Rect);
DrawText(StringGrid1->Canvas->Handle,StringGrid1->Cells[ACol][ARow].c_str(),-1,&Rect,opt);
}else{
StringGrid1->Canvas->FillRect(Rect);
DrawText(StringGrid1->Canvas->Handle,StringGrid1->Cells[ACol][ARow].c_str(),-1,&Rect,opt);
}
}
参考: TStringGridのOwnerDraw /C Magazine 98年8月号掲載 (C++Builderのお部屋)
void __fastcall TMainForm::StringGrid1DrawCell(TObject *Sender, int ACol,
int ARow, TRect &Rect, TGridDrawState State)
{
UINT opt=DT_VCENTER | DT_RIGHT | DT_SINGLELINE; // セルに描画するときのスタイル
if(ARow==0){ return; }
if(StringGrid1->Row == ARow){ // 現在の行と、このイベントが発生した際の行が一致
StringGrid1->Canvas->Brush->Color = TColor(RGB(240,220,220)); // clRed;
StringGrid1->Canvas->FillRect(Rect);
DrawText(StringGrid1->Canvas->Handle,StringGrid1->Cells[ACol][ARow].c_str(),-1,&Rect,opt);
}
}
// --- OnSelectCell イベントは,グリッド内のセルが選択される前に発生する
void __fastcall TMainForm::StringGrid1SelectCell(TObject *Sender, int ACol,
int ARow, bool &CanSelect)
{
// Invalidate メソッドはコントロールに、表面全体の再描画が必要であることを通知(予約)する
StringGrid1->Invalidate();
}
■ 選択セルのハイライトを非表示に(選択部分を無理やり枠外に)
void __fastcall TMainForm::FormActivate(TObject *Sender)
{
TGridRect myRect;
myRect.Left = -1;
myRect.Top = -1;
myRect.Right = -1;
myRect.Bottom = -1;
StringGrid1->Selection = myRect;
}
参考: StringGridで選択セルのハイライト表示を無くしたい (Delphi Tips)
void __fastcall TMainForm::Button1Click(TObject *Sender)
{
int i = StringGrid1->RowCount;
StringGrid1->RowCount = i + 1; //行を追加
StringGrid1->Cells[0][i] = IntToStr(i); // 適当にデータを入れる
StringGrid1->TopRow = i - StringGrid1->VisibleRowCount; // スクロール
}
■ Enter キーでセルを移動
void __fastcall TMainForm::StringGrid1KeyPress(TObject *Sender, char &Key)
{
if(Key == VK_RETURN){
if(StringGrid1->Col < StringGrid1->ColCount - 1){
StringGrid1->Col = StringGrid1->Col + 1; // 右セルへ移動
}else{
if(StringGrid1->Row < StringGrid1->RowCount - 1){
StringGrid1->Row = StringGrid1->Row + 1; // 次の行へ
StringGrid1->Col = 0; // 最初のセルへ
}
}
}
}
■ 指定の行を削除
void __fastcall TMainForm::Button1Click(TObject *Sender)
{
int index = 2; // 行の指定
SendMessage(StringGrid1->Handle, WM_SETREDRAW, FALSE, 0);
StringGrid1->Rows[index]->Clear(); // 指定行をクリア
for(int x=index; xRowCount; x++){
if(index < (StringGrid1->RowCount-1)){
StringGrid1->Rows[index] = StringGrid1->Rows[index+1]; // 行の移動
index++;
}
}
// if(StringGrid1->RowCount > 2){
// StringGrid1->RowCount--;
// }else{
// StringGrid1->Rows[ 1 ]->Clear();
// }
SendMessage(StringGrid1->Handle, WM_SETREDRAW, TRUE, 0);
StringGrid1->Refresh();
}