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
[17976] AppMessage 교체???
heartsim [] 1125 읽음    2002-04-26 23:02
유영인님 답변 감사합니다.^^;

어느정도 감을 잡긴 했지만...
문제는 AppMessage를 바꿔주는 부분이 잘 안되는군요. @@;
일단 두번째 방법으로 문제를 해결해 보고 싶어서 계속 시도중인데...자꾸 삽질만 하네요.^^;

음...OsdForm3를 종료하는 시점에서 Form1->OnActivate를 추가해줬습니다.
이외에도 여러 방법으로 시도중인데, 잘 안되는군요.

Help me?? --;

void __fastcall TOsdForm3::OsdFlatButton1Click(TObject *Sender)//동적폼 close
{
         ModalResult=mrOk;//모달폼 종료
         OsdForm3->Release;//동적폼인 모달폼을 메모리에서 제거

         Form1->OnActivate;//메인폼을 다시 엑티베이트 함..
        //여기 OnActivate안에 Application->OnMessage = AppMessage;가 있음
}











유영인 [Chris] 님이 쓰신 글 :
: OnCreate는 만들때 한번만 실행되므로, AppMessage 변경이 한번만 이루어지고요.. 우리는 계속 폼이 바뀔때마다 AppMessage를 바꿔주어야 하니, OnActivate 에 설정을 해주셔야 합니다.
:
: 만약 delete 를 하시면 서브폼들은 OnCreate에서는 상관 없겠지요. 뭐.. --;
:
:
: 유영인 [Chris] 님이 쓰신 글 :
: : Application은 Form1, Form2 등의 여러 폼을 모두 포함하고 있는 그런 상위 객체로 보시면 됩니다. 따라서, Application의 OnMessage의 경우 단, 하나만 설정이 가능합니다!! 그 다음, 그 이벤트 함수 안에서 어디에서 발생했는지 처리하는 방법과, 이벤트 처리 함수를 그때마다 바꿔주는 방법이 있습니다.
: :
: : 첫번째 방법을 추천하는데, 그 이유는 일일히 함수를 각 폼마다 작성을 하지 않아도, 한 코드를 통해서 처리를 할 수 있기 때문입니다. Sender가 없어도 ActiveControl->Parent 를 계속 쫓다보면, 결국은 어떤 폼에서 발생이 되었는지 알 수 있으실껍니다.
: :
: : 님이 사용하신 방법은 두번째 방법입니다. 님의 순서를 대충 그려보면 다음과 같습니다.
: :
: :
: : 1. 메인폼 (Form1) 생성
: : 2. 메세지 전달을 Form1->AppMessage 로 설정 (OnCreate 에서 바꿔주고 있음)
: : 3. 사용자 작동.
: :    Form1->AppMessage 로 메세지가 설정되어 있으므로 정상적 동작
: :   
: : 4. 서브폼 (OSDForm3) 생성
: : 5. 메세지 전달을 Form3->AppMessage 로 설정 (OnCreate 에서 바꿔주고 있음)
: : 6. 사용자 작동.
: :    Form3->AppMessage 로 메세지가 설정되어 있으므로 정상적 동작
: :
: : 7. 서브폼을 닫음
: :    하지만 아직까지 메세지 전달은 Form3->AppMessage 으로 되어있음
: : 8. 사용자 작동.
: :    화면에 보이는것은 메인폼 (Form1) 이지만, 메세지 전달이 Form3->AppMessage 로 되어 있으므로 모든 처리를 Form3 것을 처리하게 됩니다. 따라서, FlatButton2->SetFocus() 이부분에서 보이지 않는 Form3 으로 포커스를 옮기려 하니 문제가 발생되는 것입니다.
: :
: :
: : 따라서, 정상적인 작동을 하려면, Form3 이 꺼질때, 다시 Form1의 AppMessage 로 바꿔주는 작업이 필요합니다.
: :
: :
: : 또한, 한가지 덧붙이자면, 프로그램 종료시 현재 소스로는 메모리 억세스가 일어날 수 있습니다. 프로그램이 종료될때 ON_CLOSE 등의 메세지를 보내는데, 만약, 메모리 소거 순서가 Form3 이 먼저라면 (그럴 확률이 99% 겠지만요) 프로그램 종료시, Form3은 메모리에서 소거된 상태인데, AppMessage는 계속 Form3을 참고하고 있기 때문입니다.
: :
: : 이런 문제는 맨 처음 말씀드린 첫번째 방법으로 맨 나중에 소거가 되는 기준 (메인폼) 을 이벤트로 잡아주시면 됩니다. 아니면, 위와 같이 프로그램 순서를 잘 생각하여서 그때그때마다 AppMessage를 바꿔주셔야 겠지요..?
: :
: :
: :
: : heartsim 님이 쓰신 글 :
: : : 안녕하세요.heartsim(박경원)입니다.
: : :
: : : 음...
: : : 두개의 폼이 있습니다.
: : : 하나는 메인폼이고 다른 하나는 동적폼입니다.
: : : 두개의 폼에 방향키를 입력받아서 위,아래,좌,우를 나타내는 방향버튼을 제어를 하고 있습니다.
: : : 가령,
: : : 메인폼과 동적폼에 아래의 방향키 메세지 함수를 똑같이 이용했습니다.
: : :
: : : 프로그램을 실행하면, 첨에 메인폼에서 방향키가 제어가 되고
: : : 그리고 동적폼을 쇼우모달폼으로 띄운 후 역시 방향키 제어가 됩니다.
: : : 그런데, 동적폼을 close시킨 다음 다시 메인폼에서 방향키를 제어할려고 하면
: : : 에러가 나더군요.
: : :
: : : 에러 메세지는 다음과 같습니다.cannot focus invisible or disable form
: : :
: : :
: : :
: : :
: : :
: : : 메인폼 경우,
: : : void __fastcall TForm1::FormCreate(TObject *Sender)
: : : {
: : :         Application->OnMessage=AppMessage;<--------------이 부분이 ??
: : : }
: : :
: : : void __fastcall TForm1::AppMessage(tagMSG &Msg,bool &Handled)//OSD 방향키 기능
: : : {
: : :         if(Msg.message==WM_KEYDOWN)
: : :         {
: : :                 switch(Msg.wParam)
: : :                 {
: : :                         case VK_LEFT:
: : :                                 if(FlatButton1->Focused())//
: : :                                 {
: : :                                         FlatButton2->SetFocus();
: : :                                         Msg.wParam = 0;
: : :                                 }
: : :
: : :           ..........
: : :
: : :          }
: : : }
: : : void __fastcall TForm1::Osd1Click(TObject *Sender)
: : : {
: : :         OsdForm3=new TOsdForm3(Application);
: : :         OsdForm3->ShowModal();
: : : }
: : :
: : :
: : :
: : :
: : :
: : : 동적 하위폼
: : : void __fastcall TOsdForm3::FormCreate(TObject *Sender)
: : : {
: : :         Application->OnMessage=AppMessage;<-----------이 부분???
: : : }
: : : void __fastcall TOsdForm3::AppMessage(tagMSG &Msg,bool &Handled)//OSD 방향키 기능
: : : {
: : :         if(Msg.message==WM_KEYDOWN)
: : :         {
: : :                 switch(Msg.wParam)
: : :                 {
: : :                         case VK_LEFT:
: : :                                 if(OsdFlatButton3->Focused())//
: : :                                 {
: : :                                         OsdFlatButton2->SetFocus();
: : :                                         Msg.wParam = 0;
: : :                                 }
: : :
: : :           ..........
: : :
: : :          }
: : : }
: : :
: : : void __fastcall TOsdForm3::OsdFlatButton1Click(TObject *Sender)//동적폼 close
: : : {
: : :         ModalResult=mrOk;
: : :
: : : }
: : :
: : :

+ -

관련 글 리스트
17965 두개의 폼에서의 방향키 제어 에러?? heartsim 1029 2002/04/26
17968     Re:두개의 폼에서의 방향키 제어 에러?? 유영인 [Chris] 1279 2002/04/26
17970         아참 중요한거 하나 깜빡.. 유영인 [Chris] 1075 2002/04/26
17976             AppMessage 교체??? heartsim 1125 2002/04/26
17981                 Re:첨부 파일 유영인 [Chris] 1070 2002/04/27
17983                     관련 부분만 첨부했습니다.^^; heartsim 915 2002/04/27
17988                         Re:관련 부분만 첨부했습니다.^^; 유영인 [Chris] 938 2002/04/27
17990                             대단히 감사합니다.^^ heartsim 1003 2002/04/27
17979                 Re:AppMessage 교체??? 유영인 [Chris] 1158 2002/04/27
17966     Re:두개의 폼에서의 방향키 제어 에러?? 꼴(이성렬) 889 2002/04/26
17991         정말 감사합니다.^^ heartsim 988 2002/04/27
17967         Re:Re:두개의 폼에서의 방향키 제어 에러?? heartsim 1049 2002/04/26
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.