郁闷,该死的OnKeypress(100分)

  • 主题发起人 主题发起人 sleep
  • 开始时间 开始时间
S

sleep

Unregistered / Unconfirmed
GUEST, unregistred user!
不知道究竟是怎样的消息机制,程序总是实现不了自己的想法,sigh!
各位,帮帮忙吧!
我的程序其实很简单,就是想实现像FoxPro那种可以限制录入字符宽度
、限定只能输入数字的编辑框。
简单地说,就是我想在Edit1中限制用户只能输入5位数字,然后跳到
~~~~~~ ~~~
Edit2中。允许回到Edit1对其内容进行修改操作。 我该怎么办?
~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
灌个水,在onchange中判断一下.
 
还有补充,sigh,头都大了。
还要求能对输入内容进行判断,从而确定跳转到哪一个Edit框中,
比如,若Edit1中输入值为12 ,则跳转到Edit2中;若Edit1中输入
的值为13,则跳转到Edit4中, faint. 我该怎么办?
 
该死,我怎么老要补充:若满5位数字,就edit2.setfoucs
 
再来:
procedure TForm1.Edit1Change(Sender: TObject);
begin
if strToInt(Edit1.Text)=12 then
Edit2.SetFocus;
if strToInt(Edit1.Text)=13 then
Edit4.SetFocus;
end;

比较简单,你参考一下.
 
。onchange 事件中。
s,i:integer=0;
s:=s+1;
if s=5 then

begin

i:=strtoint(edit1。text);
if i=12 then
edit2。setfoucs;
else
edit3。setfoucs;
end;
试试看吧!!我没编译
 
//限制输入框只能输数字:
procedure TForm1.Edit1KeyPress(Sender: TObject;
var Key: Char);
begin
if ((key>='0') and (key<='9')) or(key=#8) then
key:=key
else
begin
messagebeep(MB_OK);
key:=#0;
end;

//edit1为5位或为12则跳至edit2,为13则跳至edit4
procedure TForm1.Edit1Change(Sender: TObject);
begin
if Edit1.Text="12" or length(edit1.text)=5 then

activecontrol=Edit2;
if Edit1.Text="13" then
activecontrol=Edit4;
end;
 
最简单的方法,用maskEdit
还有如果使用StrToInt函数的话,必须注意容错性,即最好截获异常,
否则很讨厌的,
最后,如果你一定要用Edit的话,我赞成sonie的意见
 
同意cloudhzg
 
与消息机制无关,是个流程问题。在onchange事件写代码,建议画个流程图
是不是有点老土?
 
的确与消息机制无关,就是个使用SetFocus和OnChange事件的问题
 
hehe,阿蒙跟JET的代码在下述情况下肯定异常:
把已输入的字符全部删除时,引发ONCHANG,此时EDIT。TEXT=“”,then
。。。。(此处省略134字)
同时谢谢cloudhzg和fee的支持。
 
偶又来了!
这是inttostr的问题,只要自己写一个异常处理不就行乐?
不过对于数字,还是用maskedit好一点。
 
xixi, 阿蒙的代码有个大错呢:
如果s是全局变量, 那么当edit1中有5位数后, 再次用tab键聚焦到
该控件(或用鼠标全选), 这是5位数全部选中,试试看按一个键,看看还条转
么? ^_^
如果s是函数的局部变量, 那么就更有问题了.

建议在edit1.onChange中:
1. 判断length(edit1.text)>=5, 否则继续处理, 是则按预定规则,
edit2.setfocus
2. 判断是否是数字, 可以使用val(edit1.text, Num, i);然后判断
i是否等于0, 是则是数字, 否则遍不是有效数字. 另外, 也可以采用
在edit1.onkeypress中判断, 不过那样需要考虑的太多(比如功能键
的bypass等)
3. 如果是有效数字, 继续判断Num的值, 按预定处理, 可以用case Num of
来做, 比较清晰.
此外, 我有个问题, sleep可以考虑一下, 如果输入的数字是123时, 规则
如何定? 换句话说就是怎么判断在输入了12后还有输入还是输入结束?
这涉及到第一条中的if语句的判断条件. 比如可以采用:
var s:string;
s:=edit1.text;
if (length(s)>=5) or (s[length(s)]=' ') then

//用空格表示不足5位的输入结束
...
具体的程序应该能写得出的了吧?
 
经验太少!何况当时刚考试完。
 
谢谢各位大侠的热心帮助!
现在问题基本解决,我是这样做的:
在DBEdit.OnChange中,判断数值的位数、合法性、逻辑判断,
并跳到正确的focus;
在DBEdit.OnKeydown中,判断是否为Enter,VK_UP,VK_DOWN, 进行合法性、
逻辑判断,并跳到上一个focus(VK_UP),或者下一个focus(Enter,VK_DOWN).
但是还有两个小问题,请各位继续帮忙:
我的界面是这样的:
左边是DBGrid做的Record列表,只显示"编号"一个字段,用来导航、修改记录用
右边是几十个DBEdit的录入部分。
程序要求,在最后一个DBEdit数据录入完成之后,自动新建下一条记录。
和上面一样,我在DBEdit.OnChange中判断,结束后就自动调用Table.Insert,
插入新的编号,开始下一轮的录入。
但是,现在遇到了一个很讨厌的两个问题:
1.当我点击DBGrid的编号来看某条记录时,DBEdit的OnChange会被激活,结果有
两种情况: 或者是新建一条记录,或者是DBEdit中的输入焦点到处跑。 如果,
我在最后一个DBEdit.OnKeydown中判断,结果是,最后一个数据并没有被录入
到该条记录中去,却跑到了下一条记录中去了。
2.DBGrid中本来可以通过VK_UP和VK_DOWN来逐条浏览记录的,可是现在不行了,
因为DBEdit.OnChange的原因,焦点发生了变化,点一下光标键之后,焦点就
移动到了DBEdit中去,faint.
请问我该怎么办?




 
在edit1的onkeypress中
begin
if key not in ['0'..'9'] then
eixt;
if length(edit1.text)>5 then
edit2.setfocus;
end;
 
www老兄,拜托看清现在的问题,前面的已经解决的说 , sigh
 
阿蒙 的方法不对,
。onchange 事件中。
s,i:integer=0;
s:=s+1;
~~~~~~~~~~~~~~~~~~~~~~写的时候不是总是增加的;
if s=5 then

begin

i:=strtoint(edit1。text);
if i=12 then
edit2。setfoucs;
else
edit3。setfoucs;
end;
 
后退
顶部