如何即输入即检查

bitter 2000-06-15 10:04:00
我有三个editbox 每个editbox的合法值为1--10,当其中任意一个为10时其余均只能为零。
当不为10时,顺序应递增。即
合法值 10,0,0
0,10,0
1,5,9
非法值 10,7,0
4,2,9
另外有一个button当此button 按下时,要对这三个editbox的值进行一定的运算。
问题是:
当我在每个editbox.exit写入合法检查的代码后
按下button,最后编辑的editbox不执行exit事件
用perform的EN_KILLFOCUS也不行,似乎KILLFOCUS对鼠标不响应
我该如何办

源代码见下:(初次写,请多见谅)



procedure TForm1.Edit4Exit(Sender: TObject);
var i:integer;
begin
try
i:=StrToInt(Edit4.text);
if i>10 then
begin
StatusBar1.Panels[0].Text:='输入值应在0...10之间';
Edit4.SetFocus;
end
else
begin
if i=10 then
begin
Edit5.Text:=Inttostr(0);
Edit6.Text:=IntToStr(0);
end;
StatusBar1.Panels[0].Text:='';
fL:=StrToint(Edit4.text);
end;
except
StatusBar1.Panels[0].Text:='输入不合法!输入值应在0...10之间';
Edit4.SetFocus;
end;
end;

procedure TForm1.Edit5Exit(Sender: TObject);
var i:integer;
begin
try
i:=StrToInt(Edit5.text);
if (i in [0..10]) then
begin
case fL of
0: begin
StatusBar1.Panels[0].Text:='';
fM:=i;
end;
1..9: begin
if i<fL then
begin
StatusBar1.Panels[0].Text:='输入值应不小于'+IntToStr(EDIT4.TEXT);
edit5.SetFocus;
end
else
begin
StatusBar1.Panels[0].Text:='';
fM:=i
end;
end;
10: begin
edit5.text:=inttostr(0);
Edit6.Text:=IntTostr(0);
fM:=10;
end;
end;
end
else
begin
StatusBar1.Panels[0].Text:='输入不合法!输入值应在0...10之间';
Edit5.SetFocus;
end;
except
StatusBar1.Panels[0].Text:='输入不合法!输入值应在0...10之间';
Edit5.SetFocus;
end;
end;

procedure TForm1.Edit6Exit(Sender: TObject);
var i:integer;
begin
try
i:=StrToInt(Edit6.text);
if (i in [0..10]) then
begin
case fM of
0: begin
StatusBar1.Panels[0].Text:='';
fS:=i;
end;
1..9: begin
if i<fM then
begin
StatusBar1.Panels[0].Text:='输入值应不小于'+IntToStr(EDIT5.TEXT);
edit6.SetFocus;
end
else
begin
StatusBar1.Panels[0].Text:='';
fS:=i
end;
end;
10: begin
Edit6.Text:=IntTostr(0);
fS:=0;
end;
end;
end
else
begin
StatusBar1.Panels[0].Text:='输入不合法!输入值应在0...10之间';
Edit6.SetFocus;
end;
except
StatusBar1.Panels[0].Text:='输入不合法!输入值应在0...10之间';
Edit6.SetFocus;
end;
end;
...全文
339 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
ling 2000-06-17
  • 打赏
  • 举报
回复
如果你使用的Button是TButton或TBitButton,在焦点从最后一个Edit组件移到Button上时肯定会触发Edit的Exit事件,如果用的是TSpeedButton或ToolBar上的TToolButton则不能触发它的Exit事件,不过这时你可以显式的调用这个Exit事件,即直接执行最后一个Edit的Exit事件过程,不妨一试.
meijg 2000-06-17
  • 打赏
  • 举报
回复
用OnChange不是很好,因为输入每个数字都会响应,不好处理
最简单的方法是在button1的click事件开头调用最后一个editbox
的exit事件,可将fs作为判断变量(非法就设为-1)或另设一全局变量
如输入非法就不执行click事件的其他代码,将焦点重设到最后一个editbox
procedure Tform1.Button1Click(Sender:TObject);
begin
edit6exit(sender);
if fs<>-1 then (或 if aaa then //aaa为全局变量,在edit6exit里设值)
//原来的代码
end;
另:zzy4486的方法也是对的
Wingsun 2000-06-17
  • 打赏
  • 举报
回复
建议你在OnChange事件中检查每一个EditBox的值是否在0-10之间。
然后在OnExit事件中判断每一个字的合理性。

procedure TForm1.Edit1Change(Sender: TObject);
var

begin
//处理判断
end;

procedure TForm1.Edit1Exit(Sender: TObject);
begin
//处理判断
end;
在Delphi中有一个代码重用技术,多个事件可以指向同一段代码。你将每一个Edit的OnExit事件指向Edit1Exit即可。大家都运行同一代码。
zzy4486 2000-06-16
  • 打赏
  • 举报
回复
非也,你理解错误,请看代码如下:

editls:tedit; //定义一个全局变量用来记录最后的editbox


procedure TForm1.Edit4Exit(Sender: TObject);
begin
// 你原来的程序代码不动!!
end;

procedure TForm1.Edit5Exit(Sender: TObject);
begin
// 你原来的程序代码不动!!
end;

procedure TForm1.Edit6Exit(Sender: TObject);
begin
// 你原来的程序代码不动!!
end;

procedure TForm1.Edit4Enter(Sender: TObject);
begin
editls:=Tedit(sender); //记录最后进入的editbox
end;

procedure TForm1.Edit5Enter(Sender: TObject);
begin
editls:=Tedit(sender); //记录最后进入的editbox
end;

procedure TForm1.Edit6Enter(Sender: TObject);
begin
editls:=Tedit(sender); //记录最后进入的editbox
end;

procedure TForm1.button1Click(Sender: TObject);
begin
editls.onexit(self) //调用最后离开的哪个editbox的Onexit
end;

//以上代码中,由于三个editbox的OnEnter事件所用的代码一样
//所以也可以公用一个,方法我想你知道,我就不多说了!!!
jll 2000-06-16
  • 打赏
  • 举报
回复
我习惯用OnChange事件,效果可能比OnExit好一些(因为它不涉及焦点的转移!)
Hanklee 2000-06-15
  • 打赏
  • 举报
回复
我觉得有两个办法:
1)你将代码写在OnChange事件中;(不过请注意:在按下每一个键时,都会激活OnChange时间)
2)将所有的Check代码写在Button的OnClick事件中,即在运算以前先检查数据的合法性。
zzy4486 2000-06-15
  • 打赏
  • 举报
回复
1.定义一个全局变量
editls:Tedit;
2.然后定义editbox的onenter事件(三个editbox可以公用一个onenter):
editls:=Tedit(sender);
3.在button的onclick事件中添加如下一条代码:
editls.onexit(self)
这样就可以强行执行最后编辑的editbox的exit事件

bitter 2000-06-15
  • 打赏
  • 举报
回复
问题是
当我在每个editbox.exit写入合法检查的代码后
按下button,最后编辑的editbox不执行exit事件
用perform的EN_KILLFOCUS也不行,似乎KILLFOCUS对鼠标不响应
我该如何办

这样也只能全部输入完成后在进行检查,我想每输入完一个editbox后就进行检查!

我没用数据库

halfdream 2000-06-15
  • 打赏
  • 举报
回复
当然, 我也就更喜欢用TDBEdit.
如果用TEdit 的话,
在它的Exit事件里给相应字段对象赋值。

这样的好处是可以把数据同界面分离。
halfdream 2000-06-15
  • 打赏
  • 举报
回复
我来说两句。
我喜欢在数据集中的相应字段对象的OnValidate写检查代码。
这样我觉得似乎要方便些。
bitter 2000-06-15
  • 打赏
  • 举报
回复
to zzy4486
这样也只能全部输入完成后在进行检查,我想每输入完一个editbox后就进行检查!

to HankLee
该办法我也想过,不过处理起来似乎很麻烦? :-)

再等等吧。
如果没有人回答的话,分就归二位了

5,386

社区成员

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

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