2017-03-16 7 views
1

次のコードを使用してDBGrid内のチェックボックスを表示しています。これは、テーマにと(XE2、XE7とベルリンでテスト)非テーマにVCLスタイル 両方(少なくともに期待された)動作します。Delphi:DBGrid(テーマ)内にチェックボックスを入れる

uses Vcl.Themes; 

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; 
    DataCol: Integer; Column: TColumn; State: TGridDrawState); 
const 
    CtrlState: Array[Boolean] of Integer = (DFCS_BUTTONCHECK, DFCS_BUTTONCHECK or DFCS_CHECKED); 
    CtrlStateXP: Array[Boolean] of TThemedButton = (tbCheckBoxUncheckedNormal, tbCheckBoxCheckedNormal); 
var 
    CheckBoxRectangle : TRect; 
    Details: TThemedElementDetails; 
begin 
    if Column.Field.DataType = ftBoolean then 
    begin 
    Column.Title.Alignment := taCenter; 
    Column.Alignment := taCenter; 
    TDBGrid(Sender).Canvas.FillRect(Rect); 

    if ThemeServices.ThemesEnabled then 
    begin 
     Details := ThemeServices.GetElementDetails(CtrlStateXP[Column.Field.AsBoolean]); 
     ThemeServices.DrawElement(TDBGrid(Sender).Canvas.Handle, Details, Rect); 
    end 
    else 
    begin 
     CheckBoxRectangle.Left := Rect.Left + 2; 
     CheckBoxRectangle.Right := Rect.Right - 2; 
     CheckBoxRectangle.Top := Rect.Top + 2; 
     CheckBoxRectangle.Bottom := Rect.Bottom - 2; 
     DrawFrameControl(TDBGrid(Sender).Canvas.Handle, CheckBoxRectangle, DFC_BUTTON, CtrlState[Column.Field.AsBoolean]); 
    end; 
    end; 
end; 

それはスタイルとなり、私は、行の上に移動する場合を除いて、正常に動作しています怒鳴るように、 '奇妙な':

​​

任意のヘルプ?おかげさまで 私は完全な方法を共有する。ここ

if not (gdFocused in State) then 
    Grid.Canvas.Brush.Color := StyleServices.GetSystemColor(clHighlight); 

+1

FillRectは間違っています。親の背景を描くためにテーマサービスを受けるべきではありませんか? –

答えて

1

いくつかの試みと研究の後、私はちょうど次の行を追加し、自分で方法を適応させることができました。誰かにとって役に立ちます:-)

uses Vcl.Themes; 

procedure CheckBoxGrid(FieldName: String; ValueCheck: Variant; Grid: TDBGrid; const Rect: TRect; Column: TColumn; State: TGridDrawState); 
const 
    CtrlState: Array[Boolean] of Integer = (DFCS_BUTTONCHECK, DFCS_BUTTONCHECK or DFCS_CHECKED); 
    CtrlStateXP: Array[Boolean] of TThemedButton = (tbCheckBoxUncheckedNormal, tbCheckBoxCheckedNormal); 
var 
    R: TRect; 
    Details: TThemedElementDetails; 
begin 
    if Column.FieldName = FieldName then 
    begin 
    Column.Title.Alignment := taCenter; 
    Column.Alignment := taCenter; 
    Grid.Canvas.FillRect(Rect); 

    if StyleServices.Enabled then 
    begin 
     Details := StyleServices.GetElementDetails(CtrlStateXP[Column.Field.Value = ValueCheck]); 
     StyleServices.DrawElement(Grid.Canvas.Handle, Details, Rect); 

     if not (gdFocused in State) then 
     Grid.Canvas.Brush.Color := StyleServices.GetSystemColor(clHighlight); 
    end 
    else 
    begin 
     R := Rect; 
     InflateRect(R, -2, -2); 
     DrawFrameControl(Grid.Canvas.Handle, R, DFC_BUTTON, CtrlState[Column.Field.Value = ValueCheck]); 
    end; 
    end; 
end;​ 
関連する問題