2012-02-27 8 views
5

TDBGrid、完全な行選択、および常にフォーカスを当てていない場合でも常に選択を表示して完全にオーナー描画する場合は、非推奨のイベントOnDrawDataCellと新しいイベントDrawColumnCellを選択しました。後者はこの試してみてください。TDBGrid.DefaultDrawingがfalseの場合、Full Row Selected TDBGridの適切なオーナー描画を行うにはどうすればよいですか?

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コードによって描かれた、と私は私が代わりにDrawCellHighlight起動する必要があると確信していません私が上でやっているFillRectハックをやっているのです。

DefaultDrawingをオンにすると、グリッド(奇数フォントペイントの問題)が1つ発生し、それをオフにすると別のグリッドセット(gdSelectedでもハイライトなし)が表示されます。

DBGrids.pas DefaultDrawColumnCellのコードは、テキストのペイント以外は何もしません。あなたがすべての描画コードを自分で引き継ぐならば、明らかに、あなたはより多くのことをするはずです。ただし、Grids.pasに組み込まれているハイライト描画コード(DBGrids.pasが依存する)は、このコンテキストから呼び出されるようには設計されていません。私はDrawCellHighlightを直接呼び出すべきか(上でコメントアウトされているか)、ColとRowの値を計算しなければならないか、あるいは手動でさまざまなケースを扱う独自の複雑なバージョンのTCustomGrid.DrawCellHighlightを書くべきかどうかはわかりません。

確かにこれはとても単純で明白ですが、私はそれを見落としています。私はDefaultDrawingをオフにしておかなければならないので、私はオーナーの描画イベントから完全にペイントしなければならず、テーマサービスが利用できないときに実行できなければならず、テーマサービスが利用可能なときに使用する必要があります。だから、私はTCustomGrid.DrawCellHighlightを直接呼び出す必要があります(そして私にはわからない)、または私はそれを完全に再実装する必要があります。

答えて

4

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

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; 
+1

十分に合理的に見えること。 –

+0

@Mike W、行の背景色を変更するにはどうすればよいですか? – Ganesh

+0

tHackGrid(mygrid).Canvas.Brush.Color:= clRed; //作業していない!! – Ganesh

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; 
関連する問題