2017-03-16 10 views
1

다음 코드를 사용하여 DBGrid 내에 체크 박스를 표시하고 있습니다.델파이 : 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; 
가 그것은 내가 행을 통해 이동하는 경우를 제외하고 잘 작동하고

이 스타일이된다 : 그것은 (적어도에 예상) 모두 테마 아닌 테마 VCL 스타일 이 (XE2, XE7 베를린에서 테스트) 작동

themed issue

어떤 도움 : 울부 짖는 소리 같은 '이상한'? 감사합니다. . 난 그냥 다음 행을 추가 자신에 의해 방법을 적응하기 위해 관리했습니다 몇 가지 시도와 연구 후

+1

FillRect가 잘못되었습니다. 부모님 배경을 그리는 데 테마 서비스를 제공해서는 안됩니까? –

답변

1

:

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

가 여기에 내가 완전한 방법을 공유 할 수 있습니다. 누군가에게 유용 할 수 있습니다 :-)

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;​