|
왕골 님이 쓰신 글 :
: 항상 도움에 감사드립니다.
:
: 다음코드에서 왜 Error가 떠는지 이유를 잘 모르겠습니다.
:
: Application이 하나 돌아가고 있습니다. 그리고 Form1이 Activate(?)될 경우에 항상 특정 코드를
: 실행시킬려고 합니다. 그래서 메인폼에서 특정 메뉴를 눌러 Form1이 아닌 다른 폼(Form2,3 ... )에 있는
: 코드를 실행시키고(물론 해당 폼이 화면에 나타나구요) 난 후 그 폼을 닫아버리면(예 Form2->Close(); ) 다시 Form1이 활성화 되어서 특정코드를 실핼시킬려고 하는데 제대로 동작이 되지 않습니다.
: (즉 처음으로 다른 폼으로 갔다가 오면 Form1::FormActivate가 작동이 되지 않구요. 그 다음에 다시 다른 폼으로 갔다가 오면 Form1::FormActivate가 작동됩니다. 그런데 이 때 다시 다른 폼을 부르면 Error가 뜹니다.(EInvalid Access Violation (?) onShow.....(?)어쩌구 저쩌구 )
:
: 제가 Form->Show, Form->Close, Form->Activate 를 잘못 사용하는 듯 한데.....
: 고수님들의 고견을 부탁드립니다. 감사합니다.
:
:
: -------------- Code -----------------
: void __fastcall TForm1::FormActivate(TObject *Sender)
: {
:
: background();
: }
:
: void TForm1 :: background(void)
: {
:
: flag_ref_main=EIN, flag_ref_ints=EIN, flag_ref_a1=EIN, flag_ref_a2=EIN;
:
: COUNT=0;
: ESCAPE=0;
: for (;;)
: {
: if(ESCAPE==1) break;
: Application->ProcessMessages();
: pos_stop();
: }
: return;
: }
:
:
: void __fastcall TForm1::Manual2Click(TObject *Sender)
: {
:
: ESCAPE=1; //stop background
: Form2->Manual();
: }
보여주신 소스로는 정확한 원인을 알 수는 없을것같구요.
"(즉 처음으로 다른 폼으로 갔다가 오면 Form1::FormActivate가 작동이 되지 않구요)"
이 부분은 Form2->Close(); Form1->SetFocus(); 하면 어떻든 해결될 것같습니다.
그리고 에러 발생부분은 아래 내용이 조금이라도 도움이 될른지 모르겠네요.
Form 메시지 처리 순서
1. 생성자가 호출됨
2. CreateWnd
3. OnCreate
4. OnShow
5. OnPaint
6. OnActivate
폼이 Close되는 것이 폼이 Delete되는 것은 아니며 폼이 Hide되는 것이 곧 폼이 Close되는 것은 아니다.
한편 FormClose 이벤트 핸들러에서 Action=caFree;로 명시해두면 폼을 닫을 때 해당 폼이 Delete된다.
폼이 두 개 있을 때 Form1의 OnActivate 메서드 내에서 Form2->Show();하여 Form2가 화면에 나타났을 때
다시 닫으면 Form1이 나타나게 될 것같지만 이 경우는 오류가 발생된다.
왜냐하면 Form2를 닫으면 결국 Form1으로 복귀하게 되는데 이는 곧 Form1을 Activate해야 하는 것이므로 Form1의 OnActivate 메서드가 실행되고 그 안에는 다시 Form2->Show();가 있으므로 무한 루프에 빠지게 되는 것이다.
이를 예방하려면 Form2->Show();를 Form1의 OnShow 이벤트 핸들러 내에서 실행하면 된다.
하지만 Form2에서 Form1을 삭제한 후 Form2를 닫는 경우에는 이 것도 무한 루프에 빠지게 된다. 즉 Form1으로 돌아가기 위해서는 Close된 Form1을 다시 보여주기 위해서는 OnShow를 호출해야 하는데 그 안에는 다시 Form2->Show();가 있기 때문이다.
OnActivate 이벤트는 해당 폼이 선택될 때마다 발생한다.
OnShow 이벤트는 해당 객체가 생성된 후 처음으로 화면에 나타날 때나 Close된 후 다시 화면에 나타날 때 발생한다.
OnPaint 이벤트는 조금이라도 가려져 있던 객체가 선택되어 화면 전면에 나타나야 할 때 다시 그리기 위해 발생된다.
|