DBGridに表示されたレコードで、ある列の値が、前の行(レコード)の同じ列の値と同じなら、行全体を、DBGrid1DrawColumnCellで同じ色にしたいのですが、今描画中の行の列の値と、前の行の列の値の取得方法がわかりません。どうすれば、値を取得して比較できるのでしょうか?
StringGridなら、StringGrid1DrawCellで、if StringGrid1.Cells[0,y]=StringGrid1.Cells[0,y-1] then ...と比較するような場合です。
WinX-P,Delphi7.0です。
TDBGridの接続元のTDataSetで比較します。
HOta様 ありがとうございました。
TDataSet上で最初のレコードから最後まで、項目値を前のレコードの項目値と比較して、結果を変数に保存しておき、DBGrid1DrawColumnCell時、保存した結果を参照し、描画する色を決める、ということでしょうか。
直接、グリッド上の文字列を取得する事はできないのでしょうか。
こんな感じでいかがだろう?
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;
ofZ様
ご丁寧にありがとうございました。
ツイート | ![]() |