제가 쓴 글의 자답입니다.
질문 :
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);
}
//---------------------------------------------------------------------------
왕 허접하지만 조금 소스를 개선했으면 좋겠다고 하실 분 꼭~ 리플 달아주세요~ 꼭이여~
오늘도 즐푸~
제 생각에는 이걸 기준으로 해보시는 것이 좋을 것 같습니다만~
그래서 무조건 2bytes를 버리는 것 보다 0x80 이상의 값이 들어오면 2bytes를 버리는 것이 조금 나은 조건이라고 생각합니다.