//--------------------------------------------------------------------------- #ifndef TEditH #define TEditH #include //#include "Trace.h" //--------------------------------------------------------------------------- // ¼ýÀÚ ÀԷ¸¸ ¹Þ°Ôµµ °¡´ÉÇÑ TEdit ±³Ã¼½Ä ÄÄÆ÷³ÍÆ® // ±Ý¾× ÀÔ·ÂÀ̳ª, °úÇбâ¼ú¿ë ¼Ò¼ö¸¦ °¡Áø ¼ýÀÚ¸¦ ÀÔ·ÂÇÒ¶§ »ç¿ëÇÒ ¼ö ÀÖ´Ù. // ½Ç¹«¿¡ ¾²±â¿¡ ÃæºÐÇÒ °ÍÀ¸·Î »ý°¢Çϳª, Ȥ½Ã ¸ð¸¦ ¹ö±×´Â Àû´çÈ÷ ÇÇÇØ°¡½Ã±æ. // // TEdit ÄÄÆ÷³ÍÆ®¸íÀ» TEditNumber ¶ó°í ¹Ù²Ù¸é ÄÄÆ÷³ÍÆ®·Î ÀνºÅçÇؼ­ µðÀÚÀνà »ç¿ëÇÏ´Â °Íµµ °¡´ÉÇÏ´Ù. // ¹Ýµå½Ã UseApoint UseComma ÇÁ·ÎÆÛƼ µÑ Áß Çϳª¸¸ »ç¿ëÇÒ °Í. ´Ù ¾´´Ù°í ÀÌ»óÀÌ Àְųª ÇÑ °ÍÀº ¾Æ´ÏÁö¸¸. // // // Written by ±èżº class TEdit : public Stdctrls::TEdit // ÄÄÆ÷³ÍÆ® ±³Ã¼½Ä //class TEditNumber : public Stdctrls::TEdit // ÄÄÆ÷³ÍÆ® ¼³Ä¡½Ä { private: bool bNumberOnly; // ¼ýÀÚÀԷ¸¸ ¹Þ°Ô Á¦ÇÑÇÒ °ÍÀΰ¡? bool bUseApoint; // ¼ýÀÚÀԷ¹ÞÀ» ½Ã '.' ÀÇ ÀÔ·Â Çã°¡ÇÒ °ÍÀΰ¡? bool bUseComma; // ¼ýÀÚÀԷ¹ÞÀ» ½Ã ÀÚµ¿À¸·Î , ¸¦ Ãß°¡ÇÒ °ÍÀΰ¡? bool bUseMinus; // ¼ýÀÚÀԷ¹ÞÀ» ½Ã ¸¶À̳ʽº °ªµµ ÀÔ·Â ¹ÞÀ» °ÍÀΰ¡? TAlignment FAlignment; // Á¤·Ä À§Ä¡ Á¶Á¤. private: // ¿©±â¼­ ¼ýÀÚ¸¸ ÀԷ¹޵µ·Ï Á¦ÇÑÇÑ´Ù. MESSAGE bool __fastcall WMChar(Messages::TWMKey *msg) { USHORT& Key = msg->CharCode; if (Key >= '0' && Key <= '9') return true; if (Key == 8 || Key == 13) return true; if (bUseApoint && (Key == '.' && Text.Pos(".") == 0)) return true; if (bUseMinus && (Key == '-' && Text.Pos("-") == 0 && SelStart == 0)) // -´Â óÀ½¸¸ ÀԷ°¡´ÉÇÏ°Ô. return true; Key = 0; return false; } // ½ºÆ®¸µ¼Ó¿¡ ¼ýÀÚ¿ä¼Ò ¿Ü´Â Á¦°ÅÇÑ´Ù. '.'´Â ´Ü Çϳª¸¸ Çã¿ëÇÑ´Ù. String NumDataFilter(String str) { // µ¨ÆÄÀÌ Å¬·¡½º »ó¼ÓÀÚ´Â new char[] °¡ ¸ÔÁö ¾Ê¾Æ malloc free·Î ´ëÄ¡ÇÑ´Ù. char *pbase = (char *)malloc(str.Length() + 1); char *p = pbase; *p = 0; for(int c = 1; c < str.Length() + 1; c++) { if (isdigit(str[c])) *p++ = str[c]; else if (str[c] == '.' && (strchr(pbase, '.')==NULL && Text.Pos(".") == 0)) // .Àº Çϳª¸¸ Çã¿ë *p++ = str[c]; else if (str[c] == '-' && p == pbase && (strchr(pbase, '-')==NULL && Text.Pos("-") == 0)) // .Àº Çϳª¸¸ Çã¿ë *p++ = str[c]; *p = 0; } str = pbase; free(pbase); return str; } // ½ºÆ®¸µ¿¡ 3Ä­¸¶´Ù ÄÞ¸¶¸¦ ÂïÀº »óÅ·Π¹ÝȯÇÑ´Ù. String ConvertCommaString(const String& str) { int len,idx,iSub; String ret; len = str.Length(); iSub = len + 1; if (len > 3) idx = len - 2; else idx = 0; while(idx > 1) { ret = "," + str.SubString(idx, iSub-idx) + ret; iSub = idx; idx = idx - 3; } if (iSub > idx) ret = str.SubString(1, iSub-1) + ret; if (ret.SubString(1,2) == "-,") // - °ªÀΰæ¿ì´Â -,123 ½ÄÀ¸·Î µÇ´Â °æ¿ìµµ ÀÖ¾î À̸¦ ¹æÁö. ret.Delete(2,1); return ret; } // Change°¡ ÀϾ °æ¿ì void __fastcall CMTextChanged(TMessage& Message) { String org = Text; int iSelStart = SelStart; int iOrgLen = org.Length(); String s = StringReplace(org, ",", "", TReplaceFlags() << rfReplaceAll); int pos = s.Pos("-"); if (pos >= 2) // - °¡ Áß°£¿¡ ÀÖÀ¸¸é ±×°Ç »èÁ¦ÇÑ´Ù. s = s.Delete(pos, 1); s = ConvertCommaString(s); Text = s; SelStart = s.Length() - iOrgLen + iSelStart; // ij·µ À§Ä¡°¡ ¿ø·¡ À§Ä¡¸¦ À¯ÁöÇϵµ·Ï Á¶Á¤. } protected: void __fastcall SetEditAlignment(TAlignment align) { if (FAlignment == align) return; FAlignment = align; int style = GetWindowLong(Handle, GWL_STYLE); switch(align) { case taLeftJustify : style = style & ~ES_RIGHT; break; case taRightJustify : style = style | ES_RIGHT; break; case taCenter : style = (style & ~ES_RIGHT) | ES_CENTER; break; default : return; } SetWindowLong(Handle, GWL_STYLE, style); Invalidate(); } virtual void __fastcall Dispatch(void *Message) { TMessage *msg = (PMessage)Message; switch (msg->Msg) { case WM_PASTE : if (bNumberOnly) { // ¼ýÀÚ¿ä¼Ò¿Ü´Â Á¦°Å ÇÑ´Ù. String str = Clipboard()->AsText; Clipboard()->AsText = NumDataFilter(str); } break; case WM_CHAR : if (bNumberOnly) if (!WMChar((TWMKey*)msg)) return; break; case CN_COMMAND : if (msg->WParamHi == EN_CHANGE) { if (bNumberOnly) CMTextChanged(*msg); } break; } Stdctrls::TEdit::Dispatch(Message); } __published: __property bool NumberOnly = {read=bNumberOnly, write=bNumberOnly, default = false}; __property bool UseApoint = {read=bUseApoint, write=bUseApoint, default = true}; __property bool UseComma = {read=bUseComma, write=bUseComma, default = false}; __property bool UseMinus = {read=bUseMinus, write=bUseMinus, default = false}; __property TAlignment Alignment = {read=FAlignment, write=SetEditAlignment, default = taLeftJustify}; }; #endif