[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 이런식으로 저장이 되도록이요.
: : :
: : : 문제는 모든 버튼을 다 각각 온클릭을 구현해놔서
: : :
: : : 모든 온클릭에 다 함수를 집어넣어 전역변수에 저장하자니
: : :
: : : 일이너무 커지고..
: : :
: : : 메인폼에서 윈도우 메시지를 잡아채서 처리하고 싶은데
: : :
: : : 그런방법이 있을까요?
: : :
: : :
: : : 항상 감사드립니다 꾸벅 (--)(__)