빌더님 시간 내주셔서 고맙습니다.
RTTI 를 써서 메소드를 후킹하는 방법은 아직 선행지식이 없어서 시도를 못해보고
처음 말씀하신 방법대로 해보려고 하는데요. use rumtime packege 를 check 해제 하고 ....
빌드를 해보니까,
void __fastcall Vcl::Grids::TCustomGrid::WMHScroll(TWMScroll &Msg)
해당 라인에서
[C++ Error] MainDlg.cpp(417): E2090 Qualifier 'Vcl' is not a class or namespace name
위와같은 에러가 나는데요.
Grid uint 에 속하는 TCustomGrid.. 이런건 알겠는데..
Vcl:: 에서 에러 발생하는것에 대해서 잘 모르겠습니다..
제가 너무 기본을 모르는건 같아요.. 구글링을 해봐도, 제가 뭘 잘못 하고 있는건지 모르겠는데요.
혹시 제가 놓치고 있는것이 있는지요 ?
바쁘신데 죄송합니다.
빌더(TWx) 님이 쓰신 글 :
: Neit 님이 쓰신 글 :
: : 질문 그대로 입니다..
: :
: : column 의 너비가 넓어서 한 화면을 넘어가는경우..
: :
: : column 뒤쪽의 내용도 보고 싶은데 방법이 없네요 ? ;;;
: :
: : 엑셀도 그렇고, 횡스크롤을 하면 무조건 다음 column 으로 넘어가는데..
: :
: : 이런 동작을 하는 grid componet 를 아시거나
: :
: : 기본 component 를 이용해서 구현가능한 좋은 아이디어 있으신 분들께 조언을 구하고자 합니다.
:
:
:
:
:
: 답변:
:
:
: 그런 Grid Component가 있는지는 잘 모르겠지만, VCL FrameWork에서 제공되고 있는 기본 클래스를 이용
: 하더라도 구현은 가능합니다. WMHScroll... 메세지 함수가 TCustomGrid 클래스에서 구현되어 있지만 private로
: 정의되어 있기때문에 TStringGrid에선 사용할 수 없죠. 그러나 다음과 같은 방법을 이용해서 기존 VCL Framework
: 소스코드 수정 없이 대체가 가능 합니다.
:
:
: void __fastcall Vcl::Grids::TCustomGrid::WMHScroll(TWMScroll &Msg)
: {
: String s;
:
: switch(Msg.ScrollCode) {
: case SB_LINEUP:
: s.printf(L"Code = SB_LINEUP, Pos = %d", Msg.Pos);
: break;
: case SB_LINEDOWN:
: s.printf(L"Code = SB_LINEDOWN, Pos = %d", Msg.Pos);
: break;
: case SB_PAGEUP:
: s.printf(L"Code = SB_PAGEUP, Pos = %d", Msg.Pos);
: break;
: case SB_PAGEDOWN:
: s.printf(L"Code = SB_PAGEDOWN, Pos = %d", Msg.Pos);
: break;
: case SB_THUMBPOSITION:
: s.printf(L"Code = SB_THUMBPOSITION, Pos = %d", Msg.Pos);
: break;
: case SB_THUMBTRACK:
: s.printf(L"Code = SB_THUMBTRACK, Pos = %d", Msg.Pos);
: break;
: default:
: s.printf(L"Code = Unknown, Pos = %d", Msg.Pos);
: }
:
: Form1->Caption = s;
: }
:
:
: 런타임 패키지를 사용하지 않도록 프로젝트 옵션을 설정하고 컴파일 하면 위에서 정의한 코드가 TCustomGrid
: 클래스에서 정의하고 있는 WMHScroll()을 대체 해버리게 됩니다. 나머지 로직은 TCustomGrid 소스를 참조해서
: 구현하면 되겠죠.
:
: static link 로 컴파일 할땐.. 위와 같은 방법을 이용하면 되고, 런타임패키지를 이용할 때는 RTTI를 이용해서
: 메소드를 후킹해주면 됩니다.
:
: ...