关于输入合法性检查?

DataBind 2000-08-21 01:57:00
我怎样才能保证一个edit控件中只能输入real类型的值?
...全文
279 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
IAmKylix 2000-08-21
  • 打赏
  • 举报
回复
其实还有^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.


IAmKylix 2000-08-21
  • 打赏
  • 举报
回复
其实还有^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.


shylsz 2000-08-21
  • 打赏
  • 举报
回复
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);
lotto 2000-08-21
  • 打赏
  • 举报
回复
还是不让用户输入的好,在keypress事件中判断接收参数key的值,如下:
if not (key in ['0'..'9','+','-','.']) then key:=chr(0);
alin 2000-08-21
  • 打赏
  • 举报
回复
//在EDIT1的OnKeyPress事件中
procedure frmMain.Edit1OnKeyPress(Sender:TObject;Char:Word);
Begin
Try
StrToFloat(Edit1.Text);
except
Begin
ShowMessage('输入的不是浮点数');
Char :=#0;
end;
end;
Fenian 2000-08-21
  • 打赏
  • 举报
回复
可以用sscanf()从string中读float.
govy 2000-08-21
  • 打赏
  • 举报
回复
进行一次转换即可知道:
Edit1.text := CurrToStr(StrToCurr(Edit1.text));
如果出错了,说明输入的不是Currency类型了,如果必须要real类型,
再进行一次强制类型转化Real(StrToCurr(Edit1.text))
jumphigh 2000-08-21
  • 打赏
  • 举报
回复
TextToFloat 函数 将字符串(以NULL结束的格式)转换为浮点数

5,379

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧