フリーソフト

TStringGrid

[BCB] StringGridを列を指定してソートする(バブルソート)

以下はStringGridで列を指定してソートする手続きです。1つ目の引数にはソートするStringGridを、2つ目の引数には何列目でソートするかを指定します。なお、以下の例ではデータを文字列としてソートしていますが、データを比較するif文を書き換えれば数値としてソートすることも可能です。その場合は、比較する2つデータをStrToIntなどで整数に直してから比較することになります。

void __fastcall TForm1::StringGridSort(TStringGrid *Grid, int SortCol)
{
 for (int i=Grid->FixedRows;iRowCount-1;i++) {
  for (int j=Grid->RowCount-1;j>i;j--) {
   if (Grid->Cells[SortCol][j-1]>Grid->Cells[SortCol][j]) {//データを比較
    //2つの行を入れ替える
    AnsiString TmpStr=Grid->Rows[j-1]->CommaText;
    Grid->Rows[j-1]->CommaText=Grid->Rows[j]->CommaText;
    Grid->Rows[j]->CommaText=TmpStr;
   }
  }
 }
}

この手続きはバブルソートという方法を使っています。時間のかかるソート法ですので行数が多くなると固まったようになるかもしれません。

[BCB] StringGridでクリックされた場所のRowとColを取得

StringGridで、一番上の行につくったFixedRowがクリックされたときに、クリックされた列をキーにしてデータをソートしたいということがあります。マウスクリックされた場所が、何行、何列のセルなのかは以下のようにして取得することができます。

void __fastcall TSentenceSimForm::StringGrid1MouseUp(TObject *Sender,
   TMouseButton Button, TShiftState Shift, int X, int Y)
{
 int ARow,ACol;
 StringGrid1->MouseToCell(X,Y,ACol,ARow);

 //AColに列、ARowに行番号が格納される
 
 if (ARow!=0) return; //クリックされたのが一番上の行じゃなかったらreturn
 else StringGridSort(ACol); //ACol列でソート
}

上の例のStringGridSortは自分で定義する必要があります。

[BCB] StringGridで追加した行がちょうどいいとこに表示されるように

for (int i=0;i<100;i++) {
 StringGrid1->RowCount=i+1; //行を追加
 StringGrid1->Cells[0][i]=IntToStr(i); //適当にデータを入れる

 //いいところにスクロール
 StringGrid1->TopRow=StringGrid1->RowCount-StringGrid1->VisibleRowCount;
}

TStringGrid::TopRowは表示画面で一番上に表示されている行のインデックスを表します。ここで一番上というのはスクロールできない固定行は除いて一番上の行という意味です。 またTStringGrid::VisibleRowCountは画面上に表示されている行のうち、スクロールできない固定行は除いた行数を表します。