各位好:
本人最近遇到一棘手的问题,请各位帮忙。
请在Delphi中基于TEdit实现以下功能,TEdit中只可输入Float型的数值(可为整形,可为负数),输入其他的可见字符(如字母)则屏蔽,但控制字符(如左右键和del键)不被屏蔽,如有能力可试试把数值的整数位限制在一个范围(即大于时则整数部分不接受数字,但小数部分不受影响),同样对限制小数部分为两位.
其实本人认为关键是能否在TEdit的OnKeyPress事件中知道光标的所在位置.
如可解决此问题的请不吝指教.我的信箱[email protected]。
16:03 02-11-10
3CL
本人最近遇到一棘手的问题,请各位帮忙。
请在Delphi中基于TEdit实现以下功能,TEdit中只可输入Float型的数值(可为整形,可为负数),输入其他的可见字符(如字母)则屏蔽,但控制字符(如左右键和del键)不被屏蔽,如有能力可试试把数值的整数位限制在一个范围(即大于时则整数部分不接受数字,但小数部分不受影响),同样对限制小数部分为两位.
其实本人认为关键是能否在TEdit的OnKeyPress事件中知道光标的所在位置.
如可解决此问题的请不吝指教.我的信箱[email protected]。
16:03 02-11-10
3CL
解决方案 »
- DBGrid显示ACCESS的单精度类型字段时产生随机小数
- 我想问问,怎么才能下载Youtube网站的视频文件.
- 在delphi7中,如何防止bho装载入explorer.exe中?
- 如何写入成HEX文件,用什么语句!
- 刚刚升级了一个管理软件,可以定制小型的管理信息系统,在www.xy-soft.com上面 ,希望大家多捧捧场哈 :)
- 通过以下程序可以取得其它应用程序中的Tedit控件的内容.但是,如何取label的内容的?
- 用Delhi怎么实现Internet共享设置?
- 怎样编译单个可独立运行的EXE文件?(无需任何库支持)
- money输入格式的问题?
- 怎样判断一个变量的类型
- case 问题,急
- 求救:如何用鼠标曲线?
或者是在用户焦点转移的时候检查。
一般做法是在用户提交的时候将edit1.text转换你想要的类型,同时用try ...except来捕获可能的异常
2.try
except
end;
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Menus;type
TForm1 = class(TForm)
Edit1: TEdit;
PopupMenu1: TPopupMenu;
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}
procedure InputFormat(var Key:char;InputType:integer=0;OStr:string='');
begin
case inputtype of
0:// Integer
begin
if not (((key<='9') and (key>='0')) or (key=#8)) then
begin
key:=#0 ;
beep;
end;
end;
1 :// Float
begin
if ((key<='9') and (key>='0'))
or (key=#8)
or (key='.') then
begin
if (key='.')and(pos('.',ostr)>0) then
begin
key:=#0;
beep;
end;
end
else
begin
key:=#0 ;
beep;
end;
end;
end;
end;procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
inputformat(key,1,edit1.Text);
end;procedure TForm1.FormCreate(Sender: TObject);
begin
edit1.PopupMenu:= tpopupmenu.Create(self);
end;end.
能输入float和integer,
配合设置edit.maxlength可以控制输入的位数。当想通过其他方式写入edit的时候,不要直接改变edit.text,
用:sendmessage(edit1.handle,wm_char,ord('2'),0);
这样就能让inputformat起到过滤所有改变edit.text的作用。
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
//编辑框只允许输入数字
//#46表示小数点 #8表示退格键 #0表示没有按键
if not (Key in ['0'..'9', #46, #8]) then
Key := #0;
end;
procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char);
begin
//编辑框只允许输入字母
if not (Key in ['a'..'z', 'A'..'Z']) then
Key := #0;
end;
procedure TForm1.Edit3KeyPress(Sender: TObject; var Key: Char);
begin
//显示按键值
Caption := InttoStr(Ord(Key));
end;
一般不需实时检查,如果的确需要实施检查的话只要在KeyPress事件中加入:
var temp:single;//定义一个临时变量
try
temp:=strtofloat(edit1.text);
except
key:=#0;
end;
TryStrToFloat
Function PLstrtoFloat(ss:string):Extended;
var
plst,pls,plss,plsss:string;
NOdian,NOjianhao,NOjiahao:boolean;
plf:double;
i:integer;
begin
plss:='';
NOdian:=true;
NOjianhao:=true;
NOjiahao:=true; pls:=trim(ss);
for i:=1 to length(pls) do
begin
plst:=copy(pls,i,1);
if (plst='0') or (plst='1') or (plst='2') or
(plst='3') or (plst='4') or (plst='5') or
(plst='6') or (plst='7') or (plst='8') or
(plst='9') or
((plst='.') and Nodian) or
((plst='+') and Nojiahao) or
((plst='-') and Nojianhao)
then plss:=plss+plst;
if (plst='.') then Nodian :=false;
if (plst='+') then Nojiahao :=false;
if (plst='-') then Nojianhao :=false;
end;
Plsss:=copy(plss,1,1);
plst:='';
if (length(plss)>=2) then
begin
for i:=2 to length(plss) do
Begin
plst:=copy(plss,i,1);
if (plst<>'+') and (plst<>'-') then plsss:=plsss+plst;
End;
plf:=strtofloat(plsss);
end
else
begin
if (plss='-') Or (plss='+') Or (plss='') then plf:=0
else plf:=strtofloat(plss);
end;
result:=plf;
end;
利用
Edit1.SelStart和 combobox1.SelLength
就可以搞定了,然后再DoExit中做好错误捕捉
我前段时间写了一个负数,小数,整数,都可以输入
整数部分为追加,小数部分为插入(初始化小数部分为0)
不过代码很臭。不敢拿出来。
我就利用了Copy函数和Pos
重载了Onkeyperss,Onkeydow,Doexit,OnMousedown