6

現在の行の特定のセルの右下隅のすぐ下に、ポップアップボタンまたは派手なメッセージ(背景色など)を表示したいと思います。

今のところ、グリッド座標を取得する方法だけを考えました
。x = DBGrid.DataSource.DataSet.RecNo
y = DBGrid.Columns [index]

TCustomGrid.CellRectもあります。これは私が望むことを実行しますが、保護されており、別のコンポーネントクラスを継承して作成したくありません。

私が考えることができる1つのクレイジーな回避策は、onDrawColumnCellイベントのTRect-sをいくつかの配列に保存することです。

それで、あなたはどう思いますか ?

編集
現在の行の2番目のセルなどの画面座標を取得するにはどうすればよいですか?

4

1 に答える 1

9

少しの欺瞞を使用して、現在のセル座標を取得できます。:)

コンポーネントの子孫は、祖先クラスの保護されたフィールドにアクセスできます。の保護されたメソッドにアクセスする以外に何もする必要がないため、その保護されたCellRectメソッドにアクセスできるようにTDBGridするインターポーザー(何もしない子孫)を作成します。次に、をその新しい子孫クラスに型キャストし、TDBGridそれを使用して保護されたメソッドに到達できます。THack子孫の唯一の目的が祖先クラスへのアクセス(「ハック」)を取得することであることを明確にするために、プレフィックスとして使用して子孫に名前を付けます。

// implementation
type
  THackDBGrid=class(TDBGrid);

// Where you need the coordinates
var
  CurrRow: Integer;
  Rect: TRect;
begin
  CurrRow := THackDBGrid(DBGrid1).Row;
  Rect := THackDBGrid(DBGrid1).CellRect(ColIndexYouWant, CurrRow);
  // Rect now contains the screen coordinates you need, or an empty
  // rectangle if there is no cell at the col and row specified.
end;

OPがコメントで示しているように、これがどのように機能するかについてのより詳細な説明がdelphi.about.comにあります。

于 2012-02-20T06:55:18.393 に答える