Q&A

  • dbgrid에서 특정한개만 조건에 따라서 색상을 변경하기
제발 답좀 해주세요... 부탁입니다..

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;
3  COMMENTS
  • Profile
    하얀까마귀 2004.10.21 18:26
    전체 필드나 전체 레코드가 바뀐건 님께서 루틴을 잘못만드신걸로
    보이네요..
    밑에 있는 루틴은 참고 하라는 내용인데 저걸 이용해서 만드시면 되는데
    아마 잘못보신것 같군요..
    조금 수정해 드릴께요. ㅠㅠ
       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;

    확인해보지 않아서 맞는지 모르겠는데 루틴은 저런식으로 만드시면 될것 같네요.
    그럼..


  • Profile
    석주현 2004.10.21 18:12
    다른 분이 해주신거에서 조금만 고치면 되는건데 -_-;;

    아래 고친 거 입니다. 잘만 확인 하시면 바로 활용가능 하실 겁니다.
    ================================================================

    procedure TForm2.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    begin
       with TDBGrid(Sender).Canvas do begin
           if (Column.FieldName = 'FIELD_NAME') then
             begin
               if column.Field.AsInteger > 80 then
                 begin
                   Brush.Color := clBlue;
                   Font.Color := clBlack;
                 end
               else if column.Field.AsInteger > 50 then
                 begin
                   Brush.Color := clYellow;
                   Font.Color := clBlack;
                 end
               else
                 begin
                   Brush.Color := clRed;
                   Font.Color := clBlack;
                 end;
             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;
  • Profile
    박원용 2004.10.21 20:43

    아~~ 이제 정말 잘되네요... 갑자기 프로그램을 만들다보니..
    모르는것이 너무 많아서. 헤헤..
    답변주신분들 정말 복많이 받으세요...^^;

    • 김진태
    • 2004.10.22 08:44
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 김진태
      2004.10.23 02:43
    • 이영주
      2004.10.22 22:04
      재미 있을것 같아 만들어 보았습니다. 좀 거친듯한 느낌은 드는군요. 메모장의 메뉴를 참고하였습니다. ...
    • 권오현
      2004.12.23 01:55
      안녕하세요. 저도 님과 같은 궁금증 있어 아래와 같이 해보니 그런대로 원하는 동작이 되더라구요. ...
    • 김민우
    • 2004.10.22 06:59
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 권태훈
      2004.10.22 22:54
      var   a1,a2 : String;   answer : Integer;   r1 : String; begin ...
    • Maru
      2004.10.22 06:32
      저는 이거 하루종일 고민하여.(글올리고 답글달기까지 고민함 -_-), 누군가 레지스트리를 건드려서 가...
    • 박준영
      2004.10.23 20:52
      혼자서 별짓 다해보다가 눈가리고 아웅인지는 모르지만 해결을 했습니다. 제가 Text 필드를 UpDate 쿼리...
    • 일그니
      2004.10.21 20:27
      Copy, POS, Length 이 세개의 함수를 이용하시면 무난 하실것 같습니다.
    • 최수림
    • 2004.10.21 19:35
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 정동욱
      2004.10.21 21:05
      [...] 1.어느쪽이 클라이언트 역할을 하느냐?. 2.최소한 초단위 보다 더빨리 모니터링 해야 한다,...
    • 송득보
    • 2004.10.21 18:43
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 김일득
      2004.11.16 00:43
      Thread에서 TQuery 등의 VCL콤포넌트를 사용하기위해서는 TDataBase코포넌트와 VCL 콤포넌트를 1:1...
    • 정동욱
      2004.10.21 19:12
      [...] http://www.overbyte.be  에 가면 francois piette 라는 사람이 만든 MidWare ...
    • 강신구
    • 2004.10.21 18:20
    • 4 COMMENTS
    • /
    • 0 LIKES
    • 석주현
      2004.10.21 18:44
      값을 확인 할 수 가 없어서 잘은 모르겠지만 아래와 같이 하면 됩니다. ==============================...
    • 강신구
      2004.10.21 19:43
      답변에 감사드립니다.. 답변주신 내용에서 한가지 빠진 부분이 있어서 추가 질문을 드립니다.. C함수...
    • 석주현
      2004.10.21 20:34
      흐흐 그걸 빼 놓았네요.. 아래에 추가 했습니다... 간단하게 포인터 증가는 inc(포인터명) 이걸 씁니다...
    • 강신구
      2004.10.21 21:48
      감사합니다.. 해결되었습니다.. 많은 도움이 되었습니다..
    • 박원용
    • 2004.10.21 17:15
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 하얀까마귀
      2004.10.21 18:26
      전체 필드나 전체 레코드가 바뀐건 님께서 루틴을 잘못만드신걸로 보이네요.. 밑에 있는 루틴은 참고 하...
    • 석주현
      2004.10.21 18:12
      다른 분이 해주신거에서 조금만 고치면 되는건데 -_-;; 아래 고친 거 입니다. 잘만 확인 하시면 바로 활...
    • 박원용
      2004.10.21 20:43
      아~~ 이제 정말 잘되네요... 갑자기 프로그램을 만들다보니.. 모르는것이 너무 많아서. 헤헤.. 답변...
    • 깜찌기
    • 2004.10.21 09:46
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 석주현
      2004.10.21 18:19
      Direct Input 을 이용하시면 간단하게 해결됩니다. 음 예전에 올라와 있던 DelphiX 같은 VCL 팩키지를 ...
    • 기타맨
    • 2004.10.21 02:00
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 하얀까마귀
      2004.10.21 18:37
      다른 문제겠죠? 해당 폼 내의 다른 루틴상의 문제라고 생각되어 지네요. ㅠㅠ 채팅폼의 루틴을 하나하...
    • 황영신
    • 2004.10.21 01:05
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 우용우
    • 2004.10.21 00:34
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 정동욱
      2004.10.21 01:43
      [...] 한마디로 엄청난 벌레를 만들었네요. SendBuf(Sendjpg,sizeof(Sendjpg)); 이 문장은 말...
    • 우용우
      2004.10.21 02:49
      답변 감사드립니다. 아직 기량이 부족해서 Sizeof 에 에러가있을줄 꿈에도몰랐습니다..ㅜ.ㅜ 헌데 님이 ...
    • 이근석
    • 2004.10.20 23:40
    • 4 COMMENTS
    • /
    • 0 LIKES
    • 하얀까마귀
      2004.10.22 04:07
      안녕하세요 하얀까마귀 입니다.. 요즘 디비라고는 안해서 통~~~~ ㅎㅎ 손놓은지 수년이네요. 3-4년 되는...
    • 석주현
      2004.10.21 18:22
      전 델파이에선 그런 경우가 없었는데 씨 빌더에서 하다 보니 저번에 ParamBy 를 이용해서 파라메터 ...
    • 최성준
      2004.10.21 00:07
      1. 변수에 담아서 해보세요 예) temp := '''A'',''B''';
    • 이근석
      2004.10.21 00:18
      변수에 대입 방법을 써 보았지만 안돼는군요. (ㅜ.ㅜ)
    • 정동욱
      2004.10.21 02:08
      [...]   FormatDateTime( 'hh:nn:ss' ,  IncMinute( Now , 1 ) );  &n...
    • 석주현
      2004.10.21 01:08
      procedure TForm1.Button1Click(Sender: TObject); var   StartTime, EndTime, AddTime : TDat...
    • 석주현
      2004.10.21 00:39
      StartTime, AddTime,EndTime : TDateTime 로 선언 하시고 EncodeTime 으로 각각 인코드 해서 넣어 ...
    • 김정현
    • 2004.10.20 22:48
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2004.10.21 01:29
      안녕하세요. 최용일입니다. 소스가 없으면 불가능합니다. 델파이는 이진호환이 안됩니다. dcu, b...
    • 김정현
      2004.10.21 01:47
      에고...그럼 혼자 쇼를 했네요 ^^ 답변 정말 감사합니다. 다시 공부하고 오겠습니다. 최용일님 하루...
    • 최용일
      2004.10.20 21:48
      안녕하세요. 최용일입니다. OnKeyDown에서 하세요... if Key = VK_RETURN then    &...
    • 고진중
      2004.10.20 23:08
      답변 감사합니다.. 그런데 답변하신 내용은 질문전에 해봤던건데 안되요 ㅜㅜ
    • 최용일
      2004.10.21 01:21
      안녕하세요. 최용일입니다. 어떤것을 원하는지 잘 모르겠네요... 아래 코드는 일반적인 컨트롤이나 ...