Q&A

  • 디비그리드에서 동일한 속성의 레코드 같은색으로 칠하는 방법좀...
1000명의 사람이 있다고 할 때 가족별로 구분하려고 합니다.

가족별로 구분할 수 있는 필드는 '전화번호'가 되구요, 전화번호로 sorting했구요.

구분하는 방법은 디비그리드에 사람의 정보를  가족별로 색깔로 구분하려고 합니다.

예를 들면 첫번째 가족(전화번호가 같은 사람) 4명은 파란색으로, 다음 전화번호 같은 사람들 3명은 빨간색으로, 그 다음 3명은 다시 파란색으로, 다음 5명은 빨간색으로...... 이렇게 계속 진행해서 하려고 합니다.

같은 정보를 가지고 있는 필드는 전화번호필드만 있구요

그래서 다음과 같이 구현해 보았습니다.

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;  DataCol: Integer; Column: TColumn; State: GridDrawState);
begin
    with Sender as TDBgrid, DataSource.DataSet do
    begin
        if Query1.FieldByName('전화번호').AsString = TempCode then
        else
                if TempColor = clBlue then
                    TempColor := clred
                else
                    TempColor := clBlue;

        DrawField(Column.Field.DisplayText, Rect, Canvas,Column.Font, Column.Alignment, [fsBold], clBlack, TempColor);

        TempCode := Query1.FieldByName('전화번호').AsString;
    end;
end;

DrawField는 그리드 Cell에 색을 넣어주는 함수라고 생각하면 됩니다.

위와 같이 하면 처음 화면은 잘 그려지는데 문제는 현재 활성 Cell을 움직일 경우 다시 말하면 현재 보이는 셀의 끝을 지나 아래로 내려간다거나 오른쪽으로 내려가서 디비그리드의 내용이 Repaint 될 때 색의 순서가 되바뀌고 엉키는 현상이 발생하더라구요

이 문제좀 도움받을 수 없을까요?

2  COMMENTS
  • Profile
    연기훈 2003.07.30 19:19
    레코드별로 배열에 색을 기억하고 있다가

    색을 칠해줘야 댄다구 생각하는데여...

    레코드 수가 고정적이면... 고정해서 사용하면 좋겠는데...

    유동적이면.. 얼마나 많은 배열을 잡고 있어야 할지...

    밑에 코딩 방식으로 하면.. 선택 바가 지나가고 나면..

    그 레코드 다시 그려주는데.. 그때 색도 변하게 됌니다..

    그리고.. 여러가지 스크롤 이동이나.. 기타 등등...

    색이 2가지가 돌아가면서 바꾸는 방법은 별로라고 생각 드네요..

  • Profile
    조성환 2003.07.31 22:56
    답변해 주심을 진심으로 감사드립니다.

    배열 방법도 생각해 보았었는데 그렇게 하면 매 번 배열의 값을 가지고 비교해보아야 하고 또한 레코드의 갯수가 100,000 건 정도 된다면 속도 문제가 크게 걸릴것 같다는 생각이 들었습니다.

    그래서 그려주는 루틴에서 처리를 하게 되면 어째든 보여지는 그리드의 개수만큼만 고려해 주면 되니까요...

    답변 감사드리고 계속 붙잡고 해보죠...

    ^^