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(); }