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
[57525] Re:Re:Re:Re:Re:TEdit 컴퍼넌트에서 붙여넣기(CTRL+V)가 안 먹네요...?
장성호 [nasilso] 1138 읽음    2009-07-09 11:22
OnShow에서 왜 Modal로 Form의 띄웠는지요?

VCL에는 Application객체에 TApplication.ProcessMessage라는 함수에  Message펌프 루틴이 있습니다.

function TApplication.ProcessMessage(var Msg: TMsg): Boolean;
var
  Handled: Boolean;
begin
  Result := False;
  if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then // 메세지를 가져와서 
  begin
    Result := True;
    if Msg.Message <> WM_QUIT then //종료 메세지가 아니면 ..
    begin
      Handled := False;
      //Application->OnMessage이벤트 핸들러가 걸려있으면 호출하고 
      if Assigned(FOnMessage) then FOnMessage(Msg, Handled);

      // 힌트 체크 하고 , MDI메시지 인지 체크하고 , Key메세지 인지 체크 하고 , Dialog메세지 인지 합니다.
      if not IsHintMsg(Msg) and not Handled and not IsMDIMsg(Msg) and
        not IsKeyMsg(Msg) and not IsDlgMsg(Msg) then
      begin
         //그런후에 해당 윈도우로 Dispatch 하죠
        TranslateMessage(Msg);
        DispatchMessage(Msg);
      end;
    end
    else
      FTerminate := True;
  end;
end;


IsKeyMsg 에서 단축키 체크하는데...
이걸 통과해야 해당 윈도우 프로시져가 호출됩니다.

그런데 문제는

메인폼의 OnShow이벤트 에서 sub-form을 Modal로 띄우는 경우
IsKeyMsg  메세지  루틴에서 아직 MainForm이 Enable된 상태로 파악되네요
그래서 Sub-form에서 Key이벤트가 있으면 메인폼의  Key이벤트가 단축키 관련 루틴이 찾아서 있으면 호출되네요

해결방법은?
   1) 메인폼의 OnShow이벤트에 sub-form을 띄우기 않거나?
   2) sub-form을 띄우더라도 Modal로 띄우지 않거나?
   3) 아니면 다음과 같이 MainForm을 Disable시킨후 띄우면 됩니다.

void __fastcall TForm1::FormShow(TObject *Sender)
{
   EnableWindow(Handle,false);
   TForm2 *frm=new TForm2(this);
   frm->ShowModal();
   EnableWindow(Handle,true);
}
//---------------------------------------------------------------------------


Form의 OnShow에서 다른 Form을 Modal로 띄우도록 코딩을 잘 하지 않아서 그런현상이 있는줄 몰랐네요
 
그럼..

 
아제나 님이 쓰신 글 :
: 원인을 알아냈습니다. -_-
:
: 메인 폼 OnShow 이벤트 핸들러에서 모달리스 창으로 띄웠더니
: 메인 폼에 메뉴가 존재하는데, 메뉴의 숏컷키(CTRL+V)가 먼저 동작하는거였네요.
:
: 같은 창을 다른 곳에서 부르면 메뉴의 숏컷키가 동작하지 않아서 몰랐는데,
: 메뉴를 등록한 폼에서 부르니까 숏컷키가 우선시 되는군요... ㅡㅡ
:
: 이런 경우에는 메뉴의 숏컷을 어떻게 막지요?
:
: TMainMenu *bak = Form::Menu;
: Form::Menu = NULL;
: ShowModal();
: Form::Menu = bak;
:
:
:
: 장성호 님이 쓰신 글 :
: : 빌더 버젼 무엇 쓰시나요?
: :
: : BCB5 , BCB6 , BCB2007
: :
: : 제가 써본 위 네가지 버젼에서는 그런 문제가 전혀 나타나지 않았습니다.
: :
: : 빌더버그라고 하긴 좀 이른것 같구요
: :
: : 새 프로젝트 열어서 그건만 함 테스트 해보세요
: :
: : 그럼..
: :
: : 아제나 님이 쓰신 글 :
: : : 당연히 필드가 차 있는데, 붙여넣기 한 것은 아니겠죠 ㅎㅎㅎ
: : :
: : : CTRL+V 방법 말고 마우스 팝업 불러서 붙여넣기 선택하면 되니까요.
: : :
: : : 아무래도 빌더 버그라고 의심이 되는 상황이네요.
: : :
: : : 메인폼의 FormShow 이벤트에서 모달리스 폼을 열었는데....
: : :
: : : 그것 때문이 아닌가 하는 생각은 되는데...
: : :
: : : 정확한 원인은 더 파악을 해봐야 할 것 같네요.
: : :
: : :
: : :
: : :
: : : 장성호 님이 쓰신 글 :
: : : : 이미 MaxLength만큼 Edit의 Text에 내용이 들어가 있으면
: : : : Ctrl+V가 먹히지 않겠죠
: : : :
: : : : 만약 MaxLength만큼 Text에 내용이 들어가 있다고 하더라도
: : : : 1 char 이상 block(선택)한 상태라면 ctrl+v 가 먹힙니다.
: : : : select한 string만큼
: : : :
: : : : 그럼..
: : : :
: : : :
: : : : 아제나 님이 쓰신 글 :
: : : : : TEdit 컴퍼넌트를 평소처럼 사용했는데...
: : : : :
: : : : : 붙여넣기를 하려고 했더니 안 됩니다. ㅠㅠ
: : : : :
: : : : : 속성 검색해봐도 별다른 값이 없고, MaxLength 4 지정한 것 밖에 없는데....
: : : : :
: : : : : 왜 안 되는지 오리무중이군요...
: : : : :
: : : : : CTRL+C 는 됩니다.. 헐헐..
: : : : :
: : : : : 마우스 오른쪽 눌러서 팝업 띄워서 붙여넣기 선택해도 되고요....
: : : : :
: : : : : 오직 CTRL+V 만 안 먹네요 ㅡㅡ;
: : : : :
: : : : : 혹시 이런 경험 있으신 분 계신가요?

+ -

관련 글 리스트
57498 TEdit 컴퍼넌트에서 붙여넣기(CTRL+V)가 안 먹네요...? 아제나 876 2009/07/07
57509     Re:TEdit 컴퍼넌트에서 붙여넣기(CTRL+V)가 안 먹네요...? 장성호 941 2009/07/08
57512         Re:Re:TEdit 컴퍼넌트에서 붙여넣기(CTRL+V)가 안 먹네요...? 아제나 993 2009/07/08
57513             Re:Re:Re:TEdit 컴퍼넌트에서 붙여넣기(CTRL+V)가 안 먹네요...? 장성호 1084 2009/07/08
57517                 Re:Re:Re:Re:TEdit 컴퍼넌트에서 붙여넣기(CTRL+V)가 안 먹네요...? 아제나 1037 2009/07/08
57525                     Re:Re:Re:Re:Re:TEdit 컴퍼넌트에서 붙여넣기(CTRL+V)가 안 먹네요...? 장성호 1138 2009/07/09
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.