关于输入合法性检查?
我怎样才能保证一个edit控件中只能输入real类型的值? 问题点数:50、回复次数:10Top
1 楼jumphigh(迈克阿狼)回复于 2000-08-21 15:35:00 得分 0
TextToFloat 函数 将字符串(以NULL结束的格式)转换为浮点数 Top
2 楼govy(石头)回复于 2000-08-21 15:43:00 得分 0
进行一次转换即可知道:
Edit1.text := CurrToStr(StrToCurr(Edit1.text));
如果出错了,说明输入的不是Currency类型了,如果必须要real类型,
再进行一次强制类型转化Real(StrToCurr(Edit1.text))Top
3 楼Fenian()回复于 2000-08-21 16:28:00 得分 0
可以用sscanf()从string中读float.Top
4 楼alin()回复于 2000-08-21 17:12:00 得分 10
//在EDIT1的OnKeyPress事件中
procedure frmMain.Edit1OnKeyPress(Sender:TObject;Char:Word);
Begin
Try
StrToFloat(Edit1.Text);
except
Begin
ShowMessage('输入的不是浮点数');
Char :=#0;
end;
end;Top
5 楼lotto(乐透)回复于 2000-08-21 17:58:00 得分 10
还是不让用户输入的好,在keypress事件中判断接收参数key的值,如下:
if not (key in ['0'..'9','+','-','.']) then key:=chr(0);Top
6 楼shylsz(星际第一颠)回复于 2000-08-21 22:26:00 得分 10
procedure Proc_check(v_edit1:TEDIT;KEY:WORD);
var
i,v_len,v_flag:integer;
begin
// 键值说明
// 48-57表示大键盘的数字键 '0-9'
// 8 表示删除键
// 12 表示小键盘上的 '5'
// 45 表示小建盘上的 '0'
// 33-40 表示小键盘上的数字96-105
// 190 表示大键盘上的小数点 '.'
// 46 表示小建盘上的小数点 '.'
if key=13 then exit;
if ((key>=48)and(key<=57)) or (key=8) or (key=12) or (key=45) or ((key>=33)and(key<=40)) or (key=190) or (key=46) or ((key>=96)and(key<=105))or (key=110)then
v_edit1.ReadOnly:=false
else
begin
v_edit1.readonly:=true;
exit;
end;
v_len:=length(v_edit1.text);
for i:=1 to v_len do
if v_edit1.text[i]='.' then
begin
v_flag:=1;
break;
end;
if ((v_edit1.text='')or(v_flag=1))and ((key=190)or(key=110)) then
begin
v_edit1.readonly:=true;
exit;
end;
end;
在edit1的keydown事件了加入
proc_check(edit1,key);Top
7 楼IAmKylix(kylix)回复于 2000-08-21 23:34:00 得分 10
其实还有^C,^V,^X要考虑,我自己写了个无聊的控件,IsReal属性可控制输入是整型还是实型!
unit NumEdit;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls,Clipbrd;
type
TNumEdit = class(TEdit)
private
{ Private declarations }
FIsReal:boolean;
function GetInteger:integer;
procedure SetInteger(Value:integer);
function GetReal:real;
procedure SetReal(Value:real);
procedure WMPaste(var Message: TMessage); message WM_PASTE;
protected
{ Protected declarations }
procedure KeyPress(var Key: Char); override;
public
{ Public declarations }
property AsInteger:integer read GetInteger Write SetInteger default 0;
property AsReal:real read GetReal Write SetReal;
constructor Create(AOwner:TComponent);override;
published
{ Published declarations }
property IsReal:boolean read FIsReal write FIsReal;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Edit', [TNumEdit]);
end;
{ TNumEdit }
function TNumEdit.GetInteger: integer;
var V,Code:integer;
begin
if not FIsReal then
begin
val(text,V,Code);
if Code=0 then
Result:=V
else
Result:=0;
end
else
Result:=Round(GetReal);
end;
procedure TNumEdit.KeyPress(var Key: Char);
var CharSet:set of char;
begin
if FIsReal then
CharSet:=['1','2','3','4','5','6','7','8','9','0',char(VK_ESCAPE),char(VK_BACK),char(VK_RETURN)]+['.']
else
CharSet:=['1','2','3','4','5','6','7','8','9','0',char(VK_ESCAPE),char(VK_BACK),char(VK_RETURN)];
if not (char(key) in [^X ,^C]) then
if (not (Key in CharSet)) then
begin
beep;
Key := #0;
end
else
begin
if FIsReal then
if (Key='.')and(pos('.',text)<>0)then
begin
beep;
Key := #0;
end;
end;
inherited KeyPress(Key);
end;
procedure TNumEdit.SetInteger(Value:integer);
begin
text:=inttostr(Value);
end;
function TNumEdit.GetReal: real;
var Code:integer;
R:real;
begin
if not FIsReal then
Result:=GetInteger
else
begin
val(text,R,Code);
if Code=0 then
Result:=R
else
Result:=0;
end;
end;
procedure TNumEdit.SetReal(Value:real);
begin
text:=floattostr(Value);
end;
constructor TNumEdit.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
Text:='0';
end;
procedure TNumEdit.WMPaste(var Message: TMessage);
var Value:string;
R:real;
V,Code:integer;
begin
Clipboard.Open;
Value := Clipboard.AsText;
Clipboard.Close;
if Value='' then exit;
if IsReal then
begin
val(Value,R,Code);
if Code=0 then
begin
if (Pos('.',SelText)<>0)
or (Pos('.',Text)=0)
or (Pos('.',Value)=0)
then
SelText:=floattostr(R);
end;
end
else
begin
val(Value,V,Code);
if Code=0 then SelText:=inttostr(V);
end;
end;
end.
Top
8 楼IAmKylix(kylix)回复于 2000-08-21 23:36:00 得分 10
其实还有^C,^V,^X要考虑,我自己写了个无聊的控件,IsReal属性可控制输入是整型还是实型!
unit NumEdit;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls,Clipbrd;
type
TNumEdit = class(TEdit)
private
{ Private declarations }
FIsReal:boolean;
function GetInteger:integer;
procedure SetInteger(Value:integer);
function GetReal:real;
procedure SetReal(Value:real);
procedure WMPaste(var Message: TMessage); message WM_PASTE;
protected
{ Protected declarations }
procedure KeyPress(var Key: Char); override;
public
{ Public declarations }
property AsInteger:integer read GetInteger Write SetInteger default 0;
property AsReal:real read GetReal Write SetReal;
constructor Create(AOwner:TComponent);override;
published
{ Published declarations }
property IsReal:boolean read FIsReal write FIsReal;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Edit', [TNumEdit]);
end;
{ TNumEdit }
function TNumEdit.GetInteger: integer;
var V,Code:integer;
begin
if not FIsReal then
begin
val(text,V,Code);
if Code=0 then
Result:=V
else
Result:=0;
end
else
Result:=Round(GetReal);
end;
procedure TNumEdit.KeyPress(var Key: Char);
var CharSet:set of char;
begin
if FIsReal then
CharSet:=['1','2','3','4','5','6','7','8','9','0',char(VK_ESCAPE),char(VK_BACK),char(VK_RETURN)]+['.']
else
CharSet:=['1','2','3','4','5','6','7','8','9','0',char(VK_ESCAPE),char(VK_BACK),char(VK_RETURN)];
if not (char(key) in [^X ,^C]) then
if (not (Key in CharSet)) then
begin
beep;
Key := #0;
end
else
begin
if FIsReal then
if (Key='.')and(pos('.',text)<>0)then
begin
beep;
Key := #0;
end;
end;
inherited KeyPress(Key);
end;
procedure TNumEdit.SetInteger(Value:integer);
begin
text:=inttostr(Value);
end;
function TNumEdit.GetReal: real;
var Code:integer;
R:real;
begin
if not FIsReal then
Result:=GetInteger
else
begin
val(text,R,Code);
if Code=0 then
Result:=R
else
Result:=0;
end;
end;
procedure TNumEdit.SetReal(Value:real);
begin
text:=floattostr(Value);
end;
constructor TNumEdit.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
Text:='0';
end;
procedure TNumEdit.WMPaste(var Message: TMessage);
var Value:string;
R:real;
V,Code:integer;
begin
Clipboard.Open;
Value := Clipboard.AsText;
Clipboard.Close;
if Value='' then exit;
if IsReal then
begin
val(Value,R,Code);
if Code=0 then
begin
if (Pos('.',SelText)<>0)
or (Pos('.',Text)=0)
or (Pos('.',Value)=0)
then
SelText:=floattostr(R);
end;
end
else
begin
val(Value,V,Code);
if Code=0 then SelText:=inttostr(V);
end;
end;
end.
Top




