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 만 안 먹네요 ㅡㅡ;
: : : : :
: : : : : 혹시 이런 경험 있으신 분 계신가요?