6

TDBGrid があり、行全体が選択されていて、フォーカスされていなくても常に選択を表示し、それを完全に所有者描画したい場合は、非推奨の eventOnDrawDataCellと新しい eventの選択肢がありますDrawColumnCell。私は後者を選択して試しましたこれ:

procedure TDbGridTestForm.mygridDrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  if  gdSelected in State then begin
      //      mygrid.DrawCellHighlight(Rect, State, Col, Row);
  mygrid.Canvas.Brush.Color := clHighlight;
  mygrid.Canvas.Font.Color := clHighlightText;
  mygrid.Canvas.FillRect(Rect);
  end;


  mygrid.DefaultDrawColumnCell(Rect, DataCol, Column, State);

end;

そして、私を夢中にさせているのは、フォーカスの表示 (ハイライトの色とフォーカスの四角形) が DefaultDrawColumnCell コードによって描画されないことです。

DefaultDrawing をオンにすると、一連の不具合 (奇妙なフォント ペイントの問題) が発生し、オフにすると、別の一連の不具合が発生します (gdSelected の場合でも強調表示されません)。

DBGrids.pas のコードはDefaultDrawColumnCell、テキストを描画するだけです。明らかに、すべての描画コードを自分で引き継ぐ場合は、さらに多くのことを行う必要があります。ただし、DBGrids.pas が依存する Grids.pas に組み込まれたハイライト描画コードは、このコンテキストから呼び出されるようには設計されていません。直接呼び出しDrawCellHighlightて (上記のコメントアウトを参照)、Col と Row の値を計算する必要があるのか​​、それともさまざまなケースをすべて手動で処理する TCustomGrid.DrawCellHighlight の独自の複雑なバージョンを作成する必要があるのか​​、わかりません。

確かにこれは非常に単純で明白ですが、私はそれを見落としています。DefaultDrawing をオフにしておく必要があるため、所有者の描画イベント内から完全にペイントする必要があることに注意してください。また、テーマ サービスが利用できない場合でも実行できる必要があり、利用可能な場合はテーマ サービスを使用する必要があります。そのため、TCustomGrid.DrawCellHighlight を直接呼び出す必要があります (方法がわかりません)。または、完全に再実装する必要があります。

4

2 に答える 2

4

自分で実装する必要があるテーマのサポートのため、DrawCellHighlight を呼び出したほうがよいでしょう。行番号が OnDrawColumnCell に提供されていなくても、DefaultDrawColumnCell コードで使用されているようには見えないため、内部で計算する必要はありません。

type
  tHackGrid = class(tDBGrid);

procedure TTDbGridTestForm.myGridDrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  if gdSelected in State then begin
    tHackGrid(mygrid).DrawCellHighlight(Rect, State, Column.Index, 0);
  end;
  mygrid.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;
于 2012-02-27T20:45:05.733 に答える
0
type
  tHackGrid = class(tDBGrid);

procedure MyForm.MyDbGridDrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
var ImageIndex: integer;
begin
  if gdSelected in State
  then tHackGrid(Sender).DrawCellHighlight(Rect, State, Column.Index, 0)
  else tHackGrid(Sender).DrawCellBackground(Rect, Column.Color, State, Column.Index, 0);
  TDbGrid(Sender).DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;
于 2015-09-25T13:43:26.573 に答える