TDBGridとTStringGrid

IBQueryやIBDatasetで開いたテーブルをそのまま表示するなら、DBGridでやれば簡単だが、select文を実行した結果のテーブルセットにちょっと手を加えようと思ったらStringGridを使うようになる。面倒だけれども

サンプルコード

var
i,r : Integer;
sql : String;

begin
  sql := 'select count(*) as rcount from item'
  IBQuery1.SQL.SetText(Pwidechar(sql));
  IBQuery1.Open;
  r := IBQuery1.FieldByName('rcount').AsInteger;

  StringGrid1.ColCount := 3;
  StringGrid1.RowCount := r + 1;
  i := 1;

  sql := 'select id,name,item_num from item';
  IBQuery1.SQL.SetText(Pwidechar(sql));
  IBQuery1.Open;
  while not IBQuery1.Eof do
  begin
    StringGrid1.Cells[0,i] := IBquery1.FieldByName('inputDate').AsString;
    StringGrid1.Cells[1,i] := IBquery1.FieldByName('acId').AsString;
    StringGrid1.Cells[2,i] := IBquery1.FieldByName('catId').AsString;
    Inc(i);
    IBQuery1.Next;
  end;

end;

感想

心配なのは速度。行数が少ないなら無視できるが、千行とか何万行とかなるとどうなるのか未知数。DBGridで表示するのも内部的には同じ処理ならいいんだけれども、わからないので不安。

ところで、TStringGridとTDBGridの違いはデータソースコンポーネントかどうかという点に気づいた。TStringGridにはDataSourceやDetaSetなどを設定するプロパティは無いので、自分で好きなように加工した文字列などを表形式に表示する場合に使うのではないだろうか。TDBGridの場合はその逆で、あまり融通がきかないような印象。SQL文を工夫するか、プロシージャなどで結果セットを作成したりして、その結果を表示するだけというような気がする。(でもないか。OnGetTextイベントやOnDrawCellイベントを使ったりすると割りと自由に加工することができるかもしれない)

コメントを残す

メールアドレスが公開されることはありません。