我记得有一段代码可以的
//获得当前类型标志
LONG dwStyle = GetWindowLong(Edit1->Handle, GWL_STYLE);
//加入 ES_NUMBER 类型
SetWindowLong(Edit1->Handle, GWL_STYLE, dwStyle | ES_NUMBER);
你试试这段代码,如果行的话给分,好吗?
如果楼主要求的只是输入0到9的数字,那么楼上的方法确实简单可行。
如果允许Edit输入科学记数呢?(例如:3e1,这也是标准的数值呀)
还有负数或者小数呢(例如:-1,1.2)等等
上面的代码恐怕就不理想了。我经过反复调试,下面代码能够满足这样的要求:
只允许Edit1输入任何有效的数值。不妨试试。为了使界面更完备,我用一个
全局变量nPos来记忆Edit的光标位置,当然如果想简洁的话也可以去掉。
//---------------------------------------------------------------------------
String sTemp=""; //全局变量,记忆Edit原来的数字
int nPos=0; //全局变量,记忆Edit的光标位置
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit1Change(TObject *Sender)
{
try
{
String s=Edit1->Text;
if(!s.IsEmpty())s.ToDouble();
sTemp=s;
}
catch(...)
{
ShowMessage("骗我!不是数字哪.");
Edit1->Text=sTemp;
Edit1->SelStart=nPos;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit1KeyUp(TObject *Sender, WORD &Key,
TShiftState Shift)
{
nPos=Edit1->SelStart;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit1MouseUp(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
nPos=Edit1->SelStart;
}
//---------------------------------------------------------------------------
///
一个较简单的做法
AnsiString InputKey = Key;
AnsiString ValidKey = AnsiString("0123456789.CcVv");//这里放你希望能输入的可见字符
AnsiString ContrlKey = AnsiString("CcVv");//这里放控制字符
//如果按键为 back space 或 tab则不判断
if((Key != VK_BACK) || (Key != VK_TAB))//这里为不可见字符的判断
{
//判断输入的字符是否在ValidKey中,不是则将输入设置为空
if (ValidKey.Pos(InputKey) == 0)
{
Key = 0;
}
else if(ValidKey.Pos(InputKey) != 0)
{
//在这里查看ctrl键是否按下,如没 则认为无效,使用winAPI获取
if((GetKeyState(VK_RCONTROL) && 0x80) == 0)
{
//ctrl 没有按下 ,无效该输入
Key = 0;
}
//来到这里,则为热键输入,将自动相应 edit注册的热键,无需控制
}
}