DBGridの一覧表示について

解決


mook  2018-01-07 23:56:56  No: 48918

いつもお世話になっております。

また、教えて頂きたいことが出てきました。

環境は以下の通りでソースは抜粋で掲載しています。

標準的な、IBqueryやDBGridなどの組み合わせでデータベースを表示していますが
最初の「FormShow」での一覧表示(DBGrid_init)と「Button1」クリックでの表示で

一回目の表示では、DBGridの表示はほぼ一瞬に表示されて何の問題も無いのですが
二回目の表示では、DBGridの表示が上から下方向に流れるような感じで表示が極端に遅くなります。
(表示データは約1000件)

ソース内の(※リスト作成)を外せば問題は無くなりますが
これは別の部分でDBGridの全行データを確認するために必要なもので外せません。

このような状況ですが、二回目も一回目と同じように早く表示させたいのですが
いろいろとやってみましたが全くお手上げ状態です。
何か手がありましたらご教授お願い致します。

----------------------------------------------------------------
■動作環境
Windows 8.1
Delphi 6.0 Enterprise
Firebird 2.1

----------------------------------------------------------------
■ソース抜粋
procedure TForm.FormShow(Sender: TObject);
begin
  DBG_list := TStringList.Create;
  DBGrid_init;          // 一回目の表示
end;

procedure TForm.Button1Click(Sender: TObject);
begin
  DBGrid_init;        // 二回目の表示
end;

// 一覧表示
function TForm.DBGrid_init:integer;
var
  sql_str :string;
begin

  sql_str := 'select * from tablexx where code_no>0';

  IBdatabase1.Connected := false;

  IBquery1.Close;
  DataSource1.DataSet := IBquery1;

  〜略〜

  IBquery1.SQL.Clear;
  IBquery1.SQL.Add(sql_str);
  DBGrid1.DataSource := DataSource1;
  IBquery1.Open;

  //--(※リスト作成)----------------------
  // DBGridの行毎全データが直接見れないために対応するためのリストです。
  DBG_list.Clear;
  with IBquery1 do begin
    first;
    while not EOF do begin
      DBG_list.Add(IntToStr(IBQuery1.FieldByName('code_no').AsInteger));
      Next;
    end;
  end;
  //--------------------------------------

  IBquery1.last ;

end;


あだち  2018-01-08 00:55:50  No: 48919

あだちです。

下記のように、DisableControls/EnableControlsで挟めば、クエリ処理中のDBGridの再描画を抑えることができます。

  IBquery1.DisableControls;
  try
    try
      DBGrid_init;
    except
      raise;
    end;
  finally
    IBquery1.EnableControls;
  end;


mook  2018-01-08 02:08:18  No: 48920

あだち様、早速のご回答ありがとうございます。

早々に教えて頂いた内容で試してみましたが
ソースは抜粋で実際には下記のようにDBGridのタイトルをカスタマイズしていまして
インデックスエラーが出ましたので以下のソースの様に変更してみました。

その結果
一回目の表示では、DBGridの表示は今まで通り、ほぼ一瞬に表示されて何の問題も無いのですが
二回目の表示では、DBGridの表示がされませんでした。

そこで何か再表示のために何か必要なのかと思い
IBquery1.EnableControlsの後に(※※)
IBquery1のrefreshとか色々加えてみましたが状況は変わりません。

何か他に行う処理があるのでしょうか?

申し訳ありませんが、よろしくお願いします。

//--------------------------------------------------------
// 変更追加したソース
procedure TForm.Button1Click(Sender: TObject);
begin
  IBquery1.DisableControls;
  try
    try
      DBGrid_init;     // 二回目の表示
    except
      raise;
    end;
  finally
    IBquery1.EnableControls;
    //※※
  end;
end;

// 一覧表示
function TForm.DBGrid_init:integer;
var
  sql_str :string;
begin

  sql_str := 'select * from tablexx where code_no>0';

  IBdatabase1.Connected := false;

  IBquery1.Close;
  DataSource1.DataSet := IBquery1;

  〜略〜

  IBquery1.SQL.Clear;
  IBquery1.SQL.Add(sql_str);
  DBGrid1.DataSource := DataSource1;
  IBquery1.Open;

  // 変更追加したソース
  if (DBGrid1.Columns.Count>1) then begin        // インデックスエラー回避
    DBGrid1.Columns[ 0].title.caption := 'No';
    DBGrid1.Columns[ 1].title.caption := '名称';
    DBGrid1.Columns[ 2].title.caption := '日付';
  end;

  //--(※リスト作成)----------------------
  // DBGridの行毎全データが直接見れないために対応するためのリストです。
  DBG_list.Clear;
  with IBquery1 do begin
    first;
    while not EOF do begin
      DBG_list.Add(IntToStr(IBQuery1.FieldByName('code_no').AsInteger));
      Next;
    end;
  end;
  //--------------------------------------

  IBquery1.last ;

end;


mook  2018-01-08 02:21:44  No: 48921

内容を変更してみました。
//※ 追加

以下のように変えて見ましたら問題が無くなったようなので暫く確認してみます。

-------------------------------------------------------------------
procedure TForm.Button1Click(Sender: TObject);
begin
  DBGrid_init;        // 二回目の表示
end;

// 一覧表示
function TForm.DBGrid_init:integer;
var
  sql_str :string;
begin

  sql_str := 'select * from tablexx where code_no>0';

  IBdatabase1.Connected := false;

  IBquery1.Close;
  DataSource1.DataSet := IBquery1;

  〜略〜

  IBquery1.SQL.Clear;
  IBquery1.SQL.Add(sql_str);
  DBGrid1.DataSource := DataSource1;
  IBquery1.Open;

  //--(※リスト作成)----------------------
  // DBGridの行毎全データが直接見れないために対応するためのリストです。
  IBquery1.DisableControls;       //※ 追加
  DBG_list.Clear;
  with IBquery1 do begin
    first;
    while not EOF do begin
      DBG_list.Add(IntToStr(IBQuery1.FieldByName('code_no').AsInteger));
      Next;
    end;
  end;
  IBquery1.EnableControls;       //※ 追加
  //--------------------------------------

  IBquery1.last ;

end;


mook  2018-01-08 03:59:44  No: 48922

データ更新など確認してみましたが、教えて頂いた内容を元に変更したもので
全く問題有りませんでした。

ありがとうございました。

一応解決とさせて頂きます。


※返信する前に利用規約をご確認ください。








  このエントリーをはてなブックマークに追加