|
ghost 님이 쓰신 글 :
: 임문환님의 답글 잘 봤습니다.
: 사실 빌더 초보로서 이것저것 건드리는 와중에 가르쳐주신 방법인
: menuitem->OnClick = MyHandler;
: 을 해봤었던 것도 사실입니다. 그런데 그때는 안됐었거든요..
:
: 그 현상은 이렇습니다. 다음의 코드를 봐주세요.
:
: void __fastcall TForm1::FormCreate(TObject *Sender)
: {
: ..... 중간생략 ....
:
: MRUManager1->RecentMenu = PopupMenu1->Items;
: MRUManager1->LoadFromIni(inip, szMRU1);
:
: FilenameEdit1->Text = MRUManager1->Strings->Strings[0];
: FilenameEdit1->Text = MRUManager1->Strings->Strings[1]; // 여기요~
: PopupMenu1->Items->Items[0]->OnClick = MRU1Click;
: PopupMenu1->Items->Items[1]->OnClick = MRU1Click;
: }
:
: Rxlib의 TMRUManager와 TFilenameEdit를 이용하는 부분이구요..
: ini 파일에서 MRUManager가 읽을 아이템이 한 개였다면
: 제가 "// 여기요~"라고 코멘트한 부분에서 런타임에 에라가 발생하겠죠.
: 그런데 프로그램이 다운되는게 아니라 assert failure일 때 나오는
: 에라 메시지하고 MRUManager가 보내는 에라 메시지 두 개가 나온 후에
: 프로그램이 정상적으로 돌더군요.
:
: 이 상태에서 팝업메뉴의 OnClick이 동작하지 않더라는 겁니다.
: 마지막줄에 브레이크 포인트를 잡아놓고 스텝으로 실행시켰더니
: 역시 문제가 있는 코드에서 에라 메지지가 나오더군요.
:
: 그런데 다음이 이상했어요. F8을 누르면 다음 문장으로 가는 것이
: 아니라 ProjectName.cpp에 있는
:
: Application->Run();
:
: 에 커서가 있는 거에요. 즉, 위의 FormCreate()의 나머지 문장은
: 빼먹고 넘어간 것이죠. 그렇다면 위에서 에라가 난 문장을 실행할 때
: 에라 메시지가 뜨고 리턴이 됐다는 소리인데 이게 가능한 겁니까?
:
: 물론 저 라인을 지우고 나니 OnClick 이벤트 핸들러가 잘 실행이 됬습니다.
임펠리테리입니다.
Rxlib의 TMRUManager를 써본 적이 없어서 그 부분에 대한 답변은 빼구요.
런타임 에러라고 하셨지만, 정확하게는 익셉션입니다. 익셉션이 발생하면 현재 실행중인 코드를 무조건 빠져나가게 됩니다. 물론 익셉션 처리를 안했을 경우에요. 정적으로 생성된 폼에 포함된 컴퍼넌트들의 생성 및 초기화는 그 폼의 CreateForm() 함수에서 수행되는데, 컴퍼넌트 생성중 익셉션이 발생했으므로 CreateForm() 함수를 빠져나가 그다음의 Run()으로 넘어가게 된 걸겁니다.
참고나 되시길...
|