//在EDIT1的OnKeyPress事件中 procedure frmMain.Edit1OnKeyPress(Sender:TObject;Char:Word); Begin Try StrToFloat(Edit1.Text); except Begin ShowMessage('输入的不是浮点数'); Char :=#0; end; end;
还是不让用户输入的好,在keypress事件中判断接收参数key的值,如下: if not (key in ['0'..'9','+','-','.']) then key:=chr(0);
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);
其实还有^C,^V,^X要考虑,我自己写了个无聊的控件,IsReal属性可控制输入是整型还是实型!unit NumEdit;interfaceuses 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;implementationprocedure 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.
其实还有^C,^V,^X要考虑,我自己写了个无聊的控件,IsReal属性可控制输入是整型还是实型!unit NumEdit;interfaceuses 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;implementationprocedure 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.
Edit1.text := CurrToStr(StrToCurr(Edit1.text));
如果出错了,说明输入的不是Currency类型了,如果必须要real类型,
再进行一次强制类型转化Real(StrToCurr(Edit1.text))
procedure frmMain.Edit1OnKeyPress(Sender:TObject;Char:Word);
Begin
Try
StrToFloat(Edit1.Text);
except
Begin
ShowMessage('输入的不是浮点数');
Char :=#0;
end;
end;
if not (key in ['0'..'9','+','-','.']) then key:=chr(0);
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);
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;implementationprocedure 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.
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;implementationprocedure 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.