DELPHI の DBGrid での行の位置決めと色付けの実装
データベース システムを操作しているときに、DBGrid コントロール内のデータ行を配置できず、特定の行を見つけた後、現在の行を明確にマークできない (色を変更するなど) ことがわかりました。情報を確認したところ、動的な最上行の色など、このコンテンツについては基本的に何も紹介されていないことがわかりました。 Se やその他の記事ではすべて、データの初期化中に実行される操作について説明していますが、データ ソースの更新後に再配置機能がないため、午前中 DELPHI ヘルプを調べて関連情報を確認した後、この問題を解決することにしました。 Xiaochen を少し理解しました。今度はそれを書き留めて、同僚全員と一緒に学びましょう。不適切な点があればアドバイスをお願いします。
まず、Ttable コントロールと Tquery コントロールを検索しましたが、データ行を直接検索できるメソッドが見つかりませんでした。DBGrid も検索しましたが、特定のデータ行を直接検索できる対応する関数が見つかりませんでした。継続的な努力の結果、TdataSet で GoToBookmark というメソッドを見つけました。このメソッドは、現在の DBGrid のレコード ポインターを指定する必要がある行を指すようにすることができます。
この方法を見つけた後、問題は半分しか解決されません。現在のポインタが指すデータ行の色も変更する必要があります。つまり、現在選択されている行は、小さいものを除いて、明確な方法でマークされなければなりません。 (明らかなブックマークを除く) これは明らかに DBGrid コントロールに実装されており、このメソッドをオーバーロードすると、指定されたデータ行の色を変更できます。
具体的な利用の流れは以下の通りです。
(1) データ行を動的に配置する
//=============================================== ===============
//プロセス名:DyDbgDataLine
//作者: ハイチ人
//日付: 2003-02-22
//機能: ユーザー指定の条件に基づいて、この条件を満たす DBGrid コントロール内のデータ行に自動的に移動します。
//入力パラメータ:
// sValue: 現在移動する必要がある行の値。
// タブ: 現在の DBGrid 内の対応するテーブルのデータ。
// dsr: 現在操作する必要があるデータ ソース。
//戻り値:なし
//レコードを変更します:
//=============================================== ================
PROcedure DyDbgDataLine(sValue:string;tab:Ttable;dsr:TDatasource)
変数
ブックマーク:TBookMark;
始める
//現在マークされている行を記録します。
ブックマーク:=self.tab.GetBookmark;
self.tab.first;
self.tab.Eof ではありませんが、
始める
if self.tab.FieldByName('cpbh').AsString= sValue then
始める
ブックマーク:=self.tab.GetBookmark;
壊す;
終わり;
自分自身.タブ.次へ;
終わり;
self.dsr.DataSet.GotoBookmark(ポインタ(ブックマーク));
終わり;
説明: 使用されているテーブルは、現在の表示インターフェイスの DBGrid にバインドされています。
(2) 現在のデータ行をマークする色を変更します。
まず、DBGrid の DefaultDrawing プロパティを false に設定し、次に OnDrawDataCell イベント関数で次の関数を呼び出します。
//=============================================== ===============
//プロセス名:DrawLine
//作者: ハイチ人
//日付: 2003-02-22
//機能: Dbgrid 内の指定された行の色をマークとして変更します。
//入力パラメータ:
// zdm: フィールド名;
// Rect: 出入りする必要がある行の単位。
// フィールド: 現在表示されているフィールド;
// 状態: 現在の行の表示ステータス;
// zdz: 現在移動する必要がある行の値。
// タブ: 現在の DBGrid 内の対応するテーブルのデータ。
// dbg: 現在操作する必要がある DBGrid;
//戻り値:なし
//レコードを変更します:
//=============================================== ================
procedurDrawLine(tab:Ttable;const Rect:Trect;Field:Tfield;state:TgridDrawState;dbg:TDBGrid)
始める
if (tab.fieldbyname(zdm).asstring=zdz)then
始める
dbg.canvas.font.color:=clred;
dbg.canvas.brush.color:=cl yellow;
終わり;
dbg.DefaultDrawDataCell(Rect,Field,State);
終わり;