Q&A

  • OnDrawCell Event에 대하여
특정 Cell만 색깔을 바꿀려고 OnDrawCell event 에 다음과 같이 Coding 햇습니다.

with StrDataGrid1 do
  begin
   // Refresh;
    Rect := StrDataGrid1.CellRect(1, 1);
    StrDataGrid1.Canvas.Brush.Color := clRed;
    StrDataGrid1.Canvas.FillRect(Rect);
    StrDataGrid1.Canvas.Font.Color := clWhite;
    StrDataGrid1.canvas.TextRect(Rect, Rect.Left + 2, Rect.Top + 3, cells[3, 3]);

(실제는 Cell의 값이 10000이상이나 Test상 한개의 셀만 선택했슴)

그런데 색깔이 바뀌지 않아서 Button을 하나 만들고 거기에 Copy 하면 특정Cell에 색상이 변하더라구요.

문제는 마우스가 Cell을 가리키거나 움직이면 다시 원래의 색상으로 돌아오고
화면 Page가 바뀌면 색상이 다시 원래의 색상으로 다시 돌아가고 있습니다.
그래서 OnDrawCell event에 Breakpoing를 넣어 보았는데
Excute가 되지 않더라구요
어떻게 하면 Execute 될수 있습니까?
또 화면이 바뀌더라도 색상이 안바뀌게 할수가 있는지요?

DafaultDrawing 을 False로 하였을경우도 하여보았지만 실패했습니다

고수님들의 도움을 바랍니다.
3  COMMENTS
  • Profile
    최용일 2008.04.01 18:40
    헛... 잘 돌아가네요... 쩝

    그리는데 필요한 정보는 OnDrawCell의 파라매터로 들어오니까 그걸 이용하세요.
    ACol, ARow파라매터는 그려야 할 데이터의 행과 열의 정보이고, Rect는 그려야할 위치에 대한 정보 State는 그려야할 데이터의 상태(선택되었나 포커스를 받았나 등...)입니다. 위 정보를 바탕으로 정확한 위치에 그리세요.

    <!--CodeS-->
    with StrDataGrid1 do
    begin
       StrDataGrid1.Canvas.Brush.Color := clRed;
       StrDataGrid1.Canvas.FillRect(Rect);
       StrDataGrid1.Canvas.Font.Color := clWhite;
       StrDataGrid1.Canvas.TextRect(Rect, Rect.Left + 2, Rect.Top + 3, Cells[ACol, ARow]);
    end;
    <!--CodeE-->

  • Profile
    소울해커 2008.04.01 18:36

    procedure TForm1.StrDataGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    begin
      with StrDataGrid1 do
      begin
       // Refresh;
        Rect := StrDataGrid1.CellRect(1, 1);
        StrDataGrid1.Canvas.Brush.Color := clRed;
        StrDataGrid1.Canvas.FillRect(Rect);
        StrDataGrid1.Canvas.Font.Color := clWhite;
        StrDataGrid1.canvas.TextRect(Rect, Rect.Left + 2, Rect.Top + 3, cells[3, 3]);
       end;
    end;

    빈 폼에 스트링 그리드 달랑 하나 던져 놓고 이름도 똑같이 바꾸고

    DafaultDrawing을 False로 두고 실행시켜봤습니다.

    아주 잘 돌아갑니다.

    이 부분이 아닌 다른 부분에서 문제가 있을 겁니다.

    다시 한번 확인해보시길...

    그리드에 Options이라던지 기타 다른 값이 Default로 설정된 값 말고 따로 설정하신게 있으신지도 확인하시고

    하나씩 Default값으로 되돌려가며 찾아보세요.

    각 이벤트에서 SetEditText라던지 이런 특정 부분을 전문적(?)으로 다루는 이벤트에서

    생뚱맞게 그리드 전체에 적용될 엉뚱한 부분(?)을 시도하진 않으셨는지도 확인해 보세요.

    경험상 TMS AdvStringGrid를 쓰면서  텍스트 정렬하는 이벤트에서 셀값이 없을 경우

    셀의 기본값을 주는 코딩을 했더니 케럿이 죽고 화면이 정상적으로 그려지지 않는 등

    온갖 기현상을 경험했었습니다. ㅡ_ㅡ


  • Profile
    Muzee 2008.04.02 06:07
    답변 감사합니다, 제가 쓰고 있는 그리드는 표준이 아닌 변경된 그리드 라서 그런가 보네요, 다시한번 프라퍼티를 확인해 보겠습니다.
    빠른 답변에 감사합니다