고맙습니다. 빌더님!!
저는 RAD XE 를 사용하는데, TCustomGrid 가 Grids.pas 유닛에 정의되어 있더라구요.
헤더파일은 Grids.hpp 이고 namespace 는 Grids 를 사용하고 있어서
"void __fastcall Grids::TCustomGrid::WMHScroll(TWMScroll &Msg)" 로 하니
말씀하신것처럼 동작을 하고 있습니다.
너무 좋은 가르침 감사합니다.
다른상황에서도 많이 사용할 수 있는 좋은 방법인것 같습니다. !
빌더(TWx) 님이 쓰신 글 :
: RAD XE2(Update 4)에서 TCustomGrid 클래스는 Vcl.Grids.pas 유닛에 정의되어 있고, 이에 대응하는 C++
: 헤더파일은 Vcl.Grids.hpp 입니다. 그리고 이 헤더파일에서 "Vcl::Grids" 라는 namespace 를 사용하고 있기
: 때문에 "void __fastcall Vcl::Grids::TCustomGrid::WMHScroll(TWMScroll &Msg)" 로 한 것 입니다.
:
: 사용하는 툴 버전에 따라서 namespace 는 조금 씩 다를 수 있으니까 TCustomGrid에 대한 namespace를
: 확인해서 적용하세요.
:
:
:
:
:
: Neit 님이 쓰신 글 :
: : 빌더님 시간 내주셔서 고맙습니다.
: :
: : 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를 이용해서
: : : 메소드를 후킹해주면 됩니다.
: : :
: : : ...