关于控件的OnExit事件(200分)

  • 主题发起人 主题发起人 abchjb
  • 开始时间 开始时间
A

abchjb

Unregistered / Unconfirmed
GUEST, unregistred user!
请教各位弟兄:
本人有一问题一直不能解决
有一个Form 上有很多Edit,为了控制用户输入,在Edit的OnExit事件中
放有如下语句:
if Pos('a',Edit1.Text) <> 1 then
begin
Edit1.setFocus;
Exit;
end;
但是同时Form上又有一个Button Cancel 做取消的动作
Edit1.Text:='';
Edit2.Text:='';
...
问题是如果Edit1具有Focus 并且输入非法,那取消键将永远无作用,
我如何才能作到即使用户输入违法数据也能做取消?就是说如何才能避免
触发OnExit事件?

另:那位仁兄有 Informix Dymic Online 7.22 Personal Edition
的支持中文简体字的GLS (ch_cn.gb),小第只有支持Big5码的繁体版
先谢了,各位!
 
可以先做判断.
如果焦点移向cancel button
那么就不执行
if Pos('a',Edit1.Text) <> 1 then
begin
Edit1.setFocus;
Exit;
 
把你的Tbutton换成Tspeedbutton准行。
jghuang的答案好象不行,edit1失去焦点在能判断焦点移向之前。
 
判断如下:
if getFocus()<>button1.handle then
if Pos('a',Edit1.Text) <> 1 then
begin
Edit1.setFocus;
Exit;
end;
不行找我好了.
 
用OnKeyPress过滤掉非法输入不行吗?
 
从理论上说,如果允许将焦点切换到Cancel按钮,
那么在焦点切换后用户不一定执行Cancel动作
(比如,用户在Cancel按钮上LeftMouseDown,然后
离开改按钮LeftMouseUp).这样,对Edit1的值进行
的合法性检查就有被破坏的危险(先输入非法值,
然后切换焦点到Cancel,再切换到别的地方).

所以,应该换一种合法性检查方法,如在按OK时检查;
或在Edit1中有非法值时,只允许用Esc键Cancel
(将Cancel的类型设为Cancel好象就可以了).
 
我的建议是集中控制.
你的Form中不是有很多Edit吗.这样写程序又慢又不容易读.
还不如在 Form.OnKeyPress中截取TAB或ENTER,
先判断是不是Cancel;

如不是再根据移出的Edit分别判断.
伪码:

SomeForm.OnKeyPress:
begin
if theKEY = VK_TAB or theKEY = VK_ENTER
then
begin
if CurrentFocusedCOntrol is CalcelButton
then Do Cancel
else
case LastEdit.tag of
1 : DO Check1;
2 : DO Check2;
...
end;//of case
end; // of if;
end;//of procedure

在判断时你自己就可以规定格式啦,比如'AAAA-9999'表示
前四位必须是字母,后四位是数字之类.然后做一个通用的
isValid方法,很容易就实现了集中控制,又好改.

用同样的办法,甚至可以集中实现在用户一边一边判断,
根本就不用移出时判断.



 
方法1:可以把判断事件写在类似“确认”按钮上;
方法2:1、判断是否为方向键/TAB键,是则4
2、如果不是,判断是否CANCELBUTTON有FOCUS,如果不是,则4
3、如果是,则忽略,并退出//跳过4
4、判断是否符合条件,如不符合,强制设置焦点
 
*李璋琦說得讚同,因為TSpeedButton是TGraphicControl所以沒有焦點問題。
*其它人說的也都是可行的做法。
*不然可在Edit上,當使用者按ESC鍵時,回復上一次正確的值或空白使檢查函式不動作。
*按OK時集中管理檢查也不錯。
*最漂亮的是自行改寫TEdit元件類別,之中加入種檢查函式和屬性來處理。
以後就不用每個Edit都要寫這一段,只要屬性改改就好哩!
 
我想补充的是,缺省的Cancel按钮会被执行,不信,你在里面加入
Close语句,窗口将被关闭,只是你的焦点确实不能离开编辑框,但
允许你Cancel后再回来,在你自己的例子中,你的所有编辑框均应
在Cancel后清空,不知你是否是这样子?
我认为最好的办法是:1、全局地捕捉键盘事件;2、直接写一个控件
支持你所要的特性。
 
我遇到过类似问题,我的解决方法是用EDIT.change的办法,即随时判断输入是否正确
不知对你有帮助否
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
738
SUNSTONE的Delphi笔记
S
S
回复
0
查看
730
SUNSTONE的Delphi笔记
S
后退
顶部