C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[992] DBGrid의 타이틀 줄의 모양을 바꾸어 보자.
김태선 [cppbuilder] 12250 읽음    2010-07-09 15:41
TDBGrid는 데이타베이스를 다룰 때 많이 쓰는 컴포넌트입니다.
좋은 컴포넌트이긴 하지만 기능이 약해서 많은 분들이 다른 상용 컴포넌트를 사용합니다.

이를 극복하는 방법은 화면에 표시되는 것을 모두 개발자가 그려주면 됩니다.
그런데 도저히 타이틀이 있는 헤더 컬럼은 다시 그릴수가 없죠.
아예 허용되어 있지 않습니다.

그래서 이를 다시 그리고 싶다면 TDBGrid 컴포넌트 기능을 수정해야 하는데
아래처럼 할수 있습니다.

//---------------------------------------------------------------------------
// 타이틀을 수정할 수 있는, 타이틀을 새로 그릴 수 있는 DBGrid
// 타이틀셀 이벤트 핸들러만 등록하면 된다.
// Written by KTS.

typedef void __fastcall (__closure *TKDrawTitleCellEvent)(System::TObject* Sender, int ACol, int ARow, const Types::TRect &ARect, Grids::TGridDrawState AState, bool& bDefaultDraw);

class TDBGrid : public Dbgrids::TDBGrid
{
    int    _TitleHeight;
    TKDrawTitleCellEvent _OnDrawTitleCell;

    void __fastcall SetTitleHeight(int value)
    {
        if (_TitleHeight != value)
        {
            _TitleHeight = value;
            LayoutChanged();
        }
    }
    void __fastcall LayoutChanged()
    {
        Dbgrids::TDBGrid::LayoutChanged();
        if (Options.Contains(dgTitles))
            RowHeights[0] = _TitleHeight;
    }
public:
    __fastcall TDBGrid(TComponent *owner) : Dbgrids::TDBGrid(owner)
    {
        _TitleHeight = 17;
        _OnDrawTitleCell = NULL;
    }
    // 모든 셀을 다시 그리기.
    //
    virtual void __fastcall DrawCell(int ACol, int ARow, const Types::TRect &ARect, Grids::TGridDrawState AState)
    {
        if (ARow == 0 && _OnDrawTitleCell)
        {
            bool  bDefaultDraw = true;
            _OnDrawTitleCell(this, ACol, ARow, ARect, AState, bDefaultDraw);
            if (!bDefaultDraw)
                return;
        }
        Dbgrids::TDBGrid::DrawCell(ACol, ARow, ARect, AState);
    }

__published:
    __property int TitleHeight = { read=_TitleHeight, write=SetTitleHeight };
    __property TKDrawTitleCellEvent OnDrawTitleCell = {read=_OnDrawTitleCell, write=_OnDrawTitleCell};

};
#define TDBGrid        ::TDBGrid

핵심은 타이틀 줄의 높이 값은 RowHeights 어레이 멤버변수에 있다는 것이고,
타이틀 줄을 다시 그리기 위해서는
TKDrawTitleCellEvent 이벤트 메소드를 만들어
위의 새로운 TDBGrid의  OnDrawTitleCell 프로퍼티에 넣어주면 된다는 것입니다.

타이틀도 데이타 셀도 모두 직접 그리면 매우 모양 좋은 DBGrid 를 만들 수 있습니다.
잘만 꾸미면 수백만원짜리 3rd Party 컴포넌트가 부럽지 않을 수도 있습니다.

위에 _OnDrawTitleCell 인자로 ARow 도 쓸데 없이 들어가 있는데
만들다 보니 그리된 것인데, 빼도 상관 없습니다.

TDBGrid는 기본 TDBGrid 기능을 대체하도록 제가 잘 이용하는 컴포넌트 식으로 구성되어 있는데
컴포넌트 이름을 바꾸어  별도의 컴포넌트로 설치해서 사용해도 상관 없습니다.

그러면 이제 새로운 TDBGrid를 이용해서 타이틀 줄 꾸미는 것은 각자가.

그럼..

+ -

관련 글 리스트
992 DBGrid의 타이틀 줄의 모양을 바꾸어 보자. 김태선 12250 2010/07/09
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.