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

C++빌더 Q&A
C++Builder Programming Q&A
[57493] 답변 감사합니다~~ (내용無)
조안 [] 799 읽음    2009-07-07 11:11
장성호 님이 쓰신 글 :
: 그리드 키업에서 에러나는것을 발견했으면, 원인을 다 찾은것 아닌가요?
: 키업이벤트에 아무 코드가 없는데 그런가요?
:
: 키이벤트 코드에서는 에러가 나지 않는데
: VCL내부에서 Accessviolation이 나는 것인가요?
: Key이벤트에 BreakPoint 걸어서 거기서 부터 VCL내부로 디버깅해보면 원인을 알수 있지 않을까요?
:
: [CBuilder에서 VCL 소스(pascal) 디버깅]
: 다음 링크의 팁을 이용하면 vcl소스를 디버깅해볼수 있습니다.
: http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=780
:
: 대게는 직접 코딩한데 문제가 있습니다만..
: 코딩부분에서 에러가 나지 않고 vcl내부에서도 에러가 날수 있죠
:
: 참조하세요
:
: 그럼..
:
: 조안 님이 쓰신 글 :
: : 답변 감사드립니다.
: : 마지막으로 하나만 더 여쭤볼께요..
: :
: : 혹시 그리드에서 키업다운시 AccessViolation 이 난다면.. 보편적으로 어느경우에서 에러가 나는지 혹시 짐작가는게 있으신가요?
: :
: : 장성호 님이 쓰신 글 :
: : : [Application->OnException에서 Error발생시킨 객체를 알수 없는경우에 대해]
: : : Application->OnException을 통해 Error를 발생시킨 객체를 찾는 방법은?
: : : http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=885
: : :
: : : Sender가 NULL인 경우가 있을수도 있겠지만..
: : :
: : : ButtonClick이벤트에서 Error가 발생했다면..
: : : (Button을 동적생성했는데 Owner를 다르게 준경우를 제외하고)
: : : 반드시 Form이름과 Button이름이 확인이 될것입니다.
: : :
: : : 그리고 팁에서 썼듯이 Action이나 Popupmene등의 컴포넌트에서는 ...
: : : (정확히 어떤것이 있는지 확실히 다 알지는 못함)
: : : Sender가 Action객체가 아닌 Application이 넘어오는 경우가 있습니다.
: : :
: : : 이경우 Application객체는 기본적으로 Name이 없기 때문에 나타나지 않는것입니다.
: : :
: : : 하지만 대부분의 TButton을 포함한 대부분의 WinControl에서는 거진 예외가 발생시
: : : Sender로 예외를 발생시킨 객체가 넘어옵니다.
: : :
: : : 위팁으로 확인이 불가능하다면 Button-Click같은데서 에러가 발생한것은 아니라는 얘기입니다.
: : :
: : : [현재 Focus가 가 있는 Control확인]
: : : 그리고 Application->OnException에서
: : : Screen->ActiveForm이나 Screen->ActiveControl을 통해 현재 focus가 가 있는 Control을 확인할수 있습니다.
: : : 앞에 답변에 Application->OnMessage를 이용한 팁을 굳이 쓸 필요가 없을것 같습니다.
: : :
: : :
: : : [VCL내부 함수에서 AccessViolation이 발생할때]
: : :   TControlScrollBar@CalcAutoRange 또는  TWinControl@HandleNeeded 등
: : :   VCL내부 함수에서 Accessviolation이 나는 경우...
: : :  
: : :   이경우에 대해서 저도 깔끔한 해결책을 제시하지 못하겠네요
: : :
: : :   위 함수같은경우 Control과 관련된 class-method에서 발생한것이구
: : :   control과 관련된것이라면 분명 어떤 메세지가 왔가갔다 하는 과정에서 에러가 발생했다는 얘기
: : :   즉 화면 조작과 관련이 있다고 추측이 가능할것 같습니다.
: : :  
: : :
: : : 제 답변이 얼마나 도움이 될지 모르겠네요
: : : 아뭍은 얼렁 문제의 해결책을 찾길 바랍니다.
: : :
: : : 그럼..
: : :
: : :
: : :   
: : :
: : :
: : : 조안 님이 쓰신 글 :
: : : : 제가 여러차례 질문했던 내용이 이어집니다..ㅋ
: : : :
: : : : Access Violation 이 날때 에러를 가져오는 함수를 (저번에 장성호님께서 답변해주신 내용.,.) 사용했는데
: : : :
: : : : 항상 함수이름을 가져오는게 아니더군요..
: : : :
: : : : 이벤트 발생시 현재의 이벤트를 전역변수에 담아두고
: : : :
: : : : Access Violation 발생시 그 이벤트를 보여주려고 합니다.
: : : :
: : : : map 파일을 참조해봐도
: : : :
: : : : TControlScrollBar @ CalcAutoRange 란데서 Acces Violation 이 나거나
: : : :
: : : : TWinContro l@ HandleNeeded 등에서 발생하는데
: : : :
: : : : 이게도대체 언제쓰이는건지도 잘 모르겠구요.. ㅜㅜ
: : : :
: : : : 해서 일단은 버튼을 클릭할때의 이벤트를 저장해서, 어느버튼 클릭할때 에러가 뜨는지를 확인하려 합니다만
: : : :
: : : : 모든 버튼에 함수연결라인을 추가하기가.. 쉽지않네요(수백개가넘는지라..)
: : : :
: : : : 그래서 질문드리게 된겁니다.
: : : :
: : : : 장성호 님이 쓰신 글 :
: : : : : 왜 그런 기능이 필요한지 잘 모르겠네요..
: : : : :
: : : : : 목적을 알면 좀더 님이 말씀하신 기능말고 , 다른방법으로 더욱 심플하게 해결할수 있을수도 있지 않을까 해서요..
: : : : :
: : : : : 현재 Focus가 가 있는 폼의 ButtonControl을 알고 싶은것이라면?
: : : : :
: : : : : //현재 어떤폼에 어떤 Button-Control에 Focus가 가 있는지 알고 싶으것이라면
: : : : : // Screen->ActiveForm->ActiveControl 을 통해 확인할수 있습니다.
: : : : : 
: : : : : void __fastcall TForm1::Timer1Timer(TObject *Sender)
: : : : : {
: : : : :     ShowMessage("Form="+Screen->ActiveForm->Name+" , Control="+Screen->ActiveControl->Name);
: : : : : }
: : : : : //---------------------------------------------------------------------------
: : : : : //위코드는 timer를 이용했지만 아무시점에다도 현재 Active된 폼과 Control을 확인할수 있는 방법입니다.
: : : : : //프로그램 시작해서 form이 뜨기전이나 form이 종료된후에는 accessviolaiton이 날수도 있겠네요..
: : : : : 
: : : : : 

: : : : :
: : : : :
: : : : : 님이 말씀하신 기능 그대로 구현하고자 한다면...
: : : : : Application->OnMessage를 이용해 구현할수 있습니다.
: : : : :
: : : : : 1) Application->OnMessage 에 이벤트 핸들러를 걸어두세요
: : : : : 2) Application->OnMessage 로 넘어오는 tagMSG 구조체에서 Handle을 이용하여
: : : : :     FindControl로 객체의 포인터를 찾을수 있습니다.
: : : : :  3) 객체의 포인터를 찾아면 "TButton"인지 확인해보구  GetParentForm으로 쉽게 폼객체까지 찾을수 있죠
: : : : :
: : : : : void __fastcall TForm1::FormCreate(TObject *Sender)
: : : : : {
: : : : : 	Application->OnMessage=AppMessage;
: : : : : }
: : : : : //---------------------------------------------------------------------------
: : : : : String sFormName;
: : : : : String sButtonName;
: : : : : 
: : : : : void __fastcall TForm1::AppMessage(tagMSG &Msg, bool &Handled)
: : : : : {
: : : : :     if(Msg.message==WM_LBUTTONDOWN)
: : : : :    {
: : : : :       TWinControl *wCtrl=NULL;
: : : : :       wCtrl=FindControl(Msg.hwnd);
: : : : :       if(wCtrl && wCtrl->InheritsFrom(__classid(TButton)))
: : : : :       {
: : : : :          sButtonName=wCtrl->Name;
: : : : :          TCustomForm *frm=GetParentForm(wCtrl);
: : : : :          if(frm) sFormName=frm->Name;
: : : : :       }
: : : : :    }
: : : : : }
: : : : : 

: : : : :
: : : : :  모든 큐형 메세지는 Application->OnMessage 이벤트 핸들러로 들어오게 되어있습니다.
: : : : :  (큐형 메세지라는 것은 SendMessage로 해당 윈도우 프로시져가 바로 호촐되는것을 제외한
: : : : :    시스템 메세지 큐에서 GetMessage or PeekMessage등을 통해 얻어오는 메세지를 말합니다.)
: : : : :
: : : : :  그래서  전체 Application에 적용하고싶은 기능을 만들고 싶을때는
: : : : :   Application->OnMessage 이벤트 핸들러를 이용하여 만들면 편리합니다.
: : : : :   예)
: : : : :   http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=703
: : : : : 
: : : : : 그럼..
: : : : :
: : : : :
: : : : : 조안 님이 쓰신 글 :
: : : : : : 제목이 좀 이해가 안가시죠? 저도....;;
: : : : : :
: : : : : : 자세히 설명을 드리자면..
: : : : : :
: : : : : : 한종류의 버튼 (ex TButton) 이 있습니다.
: : : : : :
: : : : : : 이게 각 폼마다 몇개씩 존재하구요. 그폼이 수십개인데요
: : : : : :
: : : : : : 버튼을 누를때마다 전역변수에 "어떤 버튼이 눌려졌나" 를 저장하고 싶습니다
: : : : : :
: : : : : : 예를들어 frm_004 에 TButton1 이 눌려졌다면
: : : : : :
: : : : : : frm_004->TButton1 이런식으로 저장이 되도록이요.
: : : : : :
: : : : : : 문제는 모든 버튼을 다 각각 온클릭을 구현해놔서
: : : : : :
: : : : : : 모든 온클릭에 다 함수를 집어넣어 전역변수에 저장하자니
: : : : : :
: : : : : : 일이너무 커지고..
: : : : : :
: : : : : : 메인폼에서 윈도우 메시지를 잡아채서 처리하고 싶은데
: : : : : :
: : : : : : 그런방법이 있을까요?
: : : : : :
: : : : : :
: : : : : : 항상 감사드립니다 꾸벅 (--)(__)

+ -

관련 글 리스트
57480 이벤트 이름 가져오는 방법 조안 1030 2009/07/06
57486     Re:이벤트 이름 가져오는 방법 장성호 1295 2009/07/06
57487         Re:Re:이벤트 이름 가져오는 방법 조안 999 2009/07/06
57488             Re:Re:Re:이벤트 이름 가져오는 방법 장성호 1135 2009/07/06
57491                 Re:Re:Re:Re:이벤트 이름 가져오는 방법 조안 1129 2009/07/07
57492                     Re:Re:Re:Re:Re:이벤트 이름 가져오는 방법 장성호 1309 2009/07/07
57493                         답변 감사합니다~~ (내용無) 조안 799 2009/07/07
57481     name 프로퍼티를 쓰면 안되는 건가요? 문제의 핵심을 잘못 짚었나요?ㅋ 조대현.Clau 858 2009/07/06
57483         Re:name 프로퍼티를 쓰면 안되는 건가요? 문제의 핵심을 잘못 짚었나요?ㅋ 조안 850 2009/07/06
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.