C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[504] 언제나 영문만 입력 받기
utime->김성하 [utime] 9360 읽음    2003-07-15 16:26
제가 쓴 글의 자답입니다.

질문 : http://www.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_qna&no=26203



에디트 창에 한자는 보이되 한자 입력은 안되도록 요청.
단 영문은 입력 편집이 가능하도록 함.

이 문제였죠~ 이렇게 저렇게 꿍수를 펼쳐~ 해결 했습니다~


// Only Eng Input

   우선 해더에 필요한 함수와 변수입니다.
.h
private:    // User declarations
        TWndMethod  HEdit;
        bool __fastcall TwoByteWordCheck(AnsiString str);
protected:
    void __fastcall OnWMPasteEdit1(TMessage &message);



아래 Cpp파일에 들어갈 부분.
Edit에선 키보드로 들어오는 값을 체크하여 2바이트 글자는 입력을 막았고~
메시지녀석은 붙이기 할 때 클립보드에 있는 값을 체크하여 2바이트 글자가 있으면 날려버리도록 했습니다.

.cpp
void __fastcall TForm1::FormCreate(TObject *Sender)
{
    HEdit = Edit1->WindowProc;
    Edit1->WindowProc = OnWMPasteEdit1;
}
//---------------------------------------------------------------------------

bool __fastcall TForm1::TwoByteWordCheck(AnsiString str)
{
  int                  MaxLng,i;
  AnsiString           Buffer;
  bool                 edit_editing;

  edit_editing = false;

  // 2Byte Word Inspect
  if (Trim(str)!="")
  {
     MaxLng = str.Length();
     Buffer = str;
     for ( i=1;MaxLng>=i;i++)
     {
         if (Buffer.IsLeadByte(i)==true){
               edit_editing = true;
               break;
         }
     }
  }
  return  edit_editing;
}
//---------------------------------------------------------------------------


void __fastcall TForm1::OnWMPasteEdit1(TMessage &message)
{
    AnsiString sClipboardCopy;

    switch (message.Msg)
    {
        case  WM_PASTE :
              sClipboardCopy = Clipboard()->AsText;
              if( TwoByteWordCheck( sClipboardCopy ) )
              {
                  Clipboard()->AsText = "";
              }
              break;
    }
    FOldProcEmail1( message );
}
//---------------------------------------------------------------------------


void __fastcall TForm1::Edit1Change(TObject *Sender)
{
  int                  MaxLng,i;
  AnsiString           Buffer;
  AnsiString           Buffer2;
  bool                 transch;

  transch = false;
  if (Trim(Edit1->Text)!="")
  {
     MaxLng=Edit1->Text.Length();
     Buffer=Edit1->Text;
     Buffer2=Edit1->Text;
     for ( i=1;MaxLng>=i;i++)
     {
         if (Buffer.IsLeadByte(i)==true){
//           Edit1->Text=Buffer.SubString(1,i-1);
           transch = true;
           break;
         }
     }
     if( transch )
         Edit1->Text = Buffer2;
  }
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key)
{
    if(!( (Key == VK_RETURN || Key == VK_DELETE || Key == VK_BACK || Key == VK_ESCAPE || Key == 3 || Key == 22|| Key == '@' || Key == '.') ||
          (Key >= '0' && Key <= '9') || (Key >= 'a' && Key <= 'z') || (Key >= 'A' && Key <= 'Z')        ))
    {
         unsigned long Conversion ,Sentence;
         HIMC Mode = ImmGetContext(this->Handle);
         ImmGetConversionStatus(Mode,&Conversion,&Sentence);
         if (Conversion != IME_CMODE_ALPHANUMERIC)
            ImmSetConversionStatus(Mode,IME_CMODE_ALPHANUMERIC,IME_CMODE_ALPHANUMERIC);
         else
            ImmSetConversionStatus(Mode,IME_CMODE_ALPHANUMERIC,IME_CMODE_ALPHANUMERIC);
         Key = 0;
    }
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Edit1Enter(TObject *Sender)
{
    unsigned long Conversion ,Sentence;
    HIMC Mode = ImmGetContext(this->Handle);
    ImmGetConversionStatus(Mode,&Conversion,&Sentence);
    if (Conversion != IME_CMODE_ALPHANUMERIC)
        ImmSetConversionStatus(Mode,IME_CMODE_ALPHANUMERIC,IME_CMODE_ALPHANUMERIC);
    else
        ImmSetConversionStatus(Mode,IME_CMODE_ALPHANUMERIC,IME_CMODE_ALPHANUMERIC);
}
//---------------------------------------------------------------------------



왕 허접하지만 조금 소스를 개선했으면 좋겠다고 하실 분 꼭~ 리플 달아주세요~ 꼭이여~

오늘도 즐푸~
열시미 [sangsookk]   2003-07-30 11:48 X
위의 소스를 확인해 보지는 않았지만... 영문, 숫자등은 hex로 0x80 미만의 값을 갖습니다.
제 생각에는 이걸 기준으로 해보시는 것이 좋을 것 같습니다만~
그래서 무조건 2bytes를 버리는 것 보다 0x80 이상의 값이 들어오면 2bytes를 버리는 것이 조금 나은 조건이라고 생각합니다.
상록수.네오 [neocon3]   2005-06-25 08:37 X
저는 조금 다른방식으로 처리했습니다.....

keyboard 값을 이용하는 대신
해당 Edit가 Focusing되면 한영 입력상태를 영문으로 전환하고,
한영전환key가 눌릴 경우 한글로 바뀐 한영입력상태를
다시 영문으로 전환하는 것입니다.
이게 좀 더 명확한 방법 아닐런지요?

물론 김성하님 방법이나 제 방법이나 Ctl+V의 막강함에는 별도의
처리 routine이 필요합니다.

+ -

관련 글 리스트
504 언제나 영문만 입력 받기 utime->김성하 9360 2003/07/15
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.