DbGridの特定セルの値の取得


sato  2008-11-18 22:44:25  No: 32617

DBGridに表示されたレコードで、ある列の値が、前の行(レコード)の同じ列の値と同じなら、行全体を、DBGrid1DrawColumnCellで同じ色にしたいのですが、今描画中の行の列の値と、前の行の列の値の取得方法がわかりません。どうすれば、値を取得して比較できるのでしょうか?  
StringGridなら、StringGrid1DrawCellで、if StringGrid1.Cells[0,y]=StringGrid1.Cells[0,y-1] then ...と比較するような場合です。
WinX-P,Delphi7.0です。


HOta  2008-11-19 16:30:00  No: 32618

TDBGridの接続元のTDataSetで比較します。


sato  2008-11-19 21:00:37  No: 32619

HOta様  ありがとうございました。
TDataSet上で最初のレコードから最後まで、項目値を前のレコードの項目値と比較して、結果を変数に保存しておき、DBGrid1DrawColumnCell時、保存した結果を参照し、描画する色を決める、ということでしょうか。
直接、グリッド上の文字列を取得する事はできないのでしょうか。


ofZ  2008-11-19 22:14:49  No: 32620

こんな感じでいかがだろう?

  TForm1 = class(TForm)
  private
    FDataLink  :TDataLink;
  end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FDataLink := TDataLink.Create;
  FDataLink.DataSource := DataSource1;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  FDataLink.Free;
end;

procedure TForm1.DBGrid1DrawDataCell(Sender: TObject;
  const Rect: TRect; Field: TField; State: TGridDrawState);
var
  ac, value: Integer;
  sameValue: Boolean;
begin
  //カレントレコード取得
  ac := FDataLink.ActiveRecord;
  //現行値
  value := Field.AsInteger;

  {直前レコードへ移動}
  FDataLink.ActiveRecord := ac - 1;

  if FDataLink.BOF then begin
    sameValue := False;
  end
  else begin
    //直前レコード値と比較
    sameValue := value = FDataLink.DataSet.FieldByName(Field.Name).AsInteger;
  end;
  if sameValue then begin
    //同じ場合の描画
  end
  else begin
    //異なる場合の描画
  end;
  //レコードを戻る
  FDataLink.ActiveRecord := ac;
end;


sato  2008-11-19 23:44:10  No: 32621

ofZ様
ご丁寧にありがとうございました。


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

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






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