제발 답좀 해주세요... 부탁입니다..
dbgrid에서 특정한개만 조건에 따라서 색상을 변경하려는데.. 여러 소스들을 찾아서 해봤지만
한개의 필드가 전체다 바뀐다던지, 한개의 레코드전체가 변경은 되는데..
셀한개만 변경은 안되거든요...
필드명 percent rate
------------------------
값 100 (적색표시)
값 83 (노란색표시)
값 75 (파란색표시)
위와 같은 식으로 퍼센트의 값에 따라서 바로 옆의 필드의 셀을 각각 색상을 적용하려고 합니다...
도움주실분은 꼭 아래소스를 수정해주시거나 예제 좀 꼭 부탁드려요...
벌써 2주째 이것때문에 고생이네요...
아래와 소스는 감사하게도 어떤분이 올려주셨던것인데.. 전혀 변화가 없네요...
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn;
State: TGridDrawState);
begin
with TDBGrid(Sender).Canvas do begin
if (Column.FieldName = 'FILEDNAME') and (State = []) then begin
Brush.Color := clYellow;
Font.Color := clBlack;
end
else begin
Brush.Color := clWindow;
Font.Color := clWindowText;
end;
if (gdFocused in State) or (gdSelected in State) then begin
Brush.Color := clHighlight;
Font.Color := clHighlightText;
end;
FillRect(Rect);
TextOut(Rect.Left+2,Rect.Top+2,Column.Field.AsString);
Brush.Style := bsSolid;
Brush.Color := clWindow;
end;
end;
보이네요..
밑에 있는 루틴은 참고 하라는 내용인데 저걸 이용해서 만드시면 되는데
아마 잘못보신것 같군요..
조금 수정해 드릴께요. ㅠㅠ
with TDBGrid(Sender).Canvas do begin
// 현재 필드를 검사하구요
if (Column.FieldName = 'FILEDNAME') and (State = []) then begin
Brush.Color := clYellow;
Font.Color := clBlack;
end
else begin
Brush.Color := clWindow;
Font.Color := clWindowText;
end;
// 만약에 포커스가 있거나 선택되어 있으면 다르게 표시하라는거죠
// 이건 평범한 그리드가 이렇게 되어잇는거죠..
if (gdFocused in State) or (gdSelected in State) then begin
Brush.Color := clHighlight;
Font.Color := clHighlightText;
end;
/// 이 아래는 실제로 그리는 루틴입니다.
// 사각형을 그리고 Text를 뿌려주는거죠..
FillRect(Rect);
TextOut(Rect.Left+2,Rect.Top+2,Column.Field.AsString);
Brush.Style := bsSolid;
Brush.Color := clWindow;
end;
님의 경우는 저 루틴이 좀 바뀌어야 합니다.
우선 값은 퍼센트필드이고 그려주는건 레이트 필드니까..
if (Column.FieldName = 'RATE') then
begin
// 그럼 레이트인 경우는 님의 경우는 퍼센트값을 불러와야죠....
fPercent := Query1.FieldbyName('percent').AsInteger;
if fPercent <= 75 then
begin
//
Brush.Color := clBlue;
end else if fpercent <= 83 then
begin
Brush.Color := clYellow;
end else begin
Brush.Color := clRed;
end;
FillRect(Rect);
이렇게 해주심 되겠네요..
end else begin
// 필드가 레이트가 아니라면 일반적인 루틴을 타도록 하면 되겟죠?
// 포커스 여부를 따져서 파란색 혹은 하얀색으로 그려주면 되겠죠?
if (gdFocused in State) or (gdSelected in State) then
begin
Brush.Color := clHighlight;
Font.Color := clHighlightText;
end else begin
Brush.Color := clWindow;
Font.Color := clWindowText;
end;
FillRect(Rect);
TextOut(Rect.Left+2,Rect.Top+2,Column.Field.AsString);
Brush.Style := bsSolid;
Brush.Color := clWindow;
end;
확인해보지 않아서 맞는지 모르겠는데 루틴은 저런식으로 만드시면 될것 같네요.
그럼..