鱼C论坛

 找回密码
 立即注册
查看: 2937|回复: 9

谁能帮我解释下原理吗?

[复制链接]
发表于 2015-3-26 10:53:31 | 显示全部楼层 |阅读模式
100鱼币
本帖最后由 南方的人 于 2015-3-26 12:37 编辑
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);//只能输入Real 数据
var
  c: integer;
begin
  // 加入代码让edit1只能输入数字
  if Key = '.' then                                <span style="background-color: rgb(255, 0, 255);">  //如果这里改为#110,就一个都不能输入,为什么这个是只能输入一个' . '呢?</span>
  begin
    for c := 1 to Length(TEdit(Sender).Text) do
    begin
      if TEdit(Sender).Text[c] = '.' then
        Key := #0;
    end;
  end
  else if Key = #13 then
    Perform(WM_NEXTDLGCTL, 0, 0)
  else if Key = #8 then
    Key := #8
  else if (Key < '0') or (Key > '9') then
    Key := #0;  
end;
求大神解释下

最佳答案

查看完整内容

不知道你这段程序是用在哪的,但是我尝试了单独把他拿出来单步调试,看本地变量值,测试可以看出,我让edit1.text初始值为'.23',那么如果输入'.'程序进入6行至13行的判断,c=1时,判断的是edit1.text[0],即第一个点,然后执行了key:=#0,然后继续循环直到比完edit1.text的所有字符(个人认为这里加个break更好);同样条件下,我将循环条件改为for c:=0 to Length(TEdit(Sender).Text)-1 do,那么检测的TEdit(Sender).Text[0]不是 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-3-26 10:53:32 | 显示全部楼层
南方的人 发表于 2015-3-26 17:12
有第0个字符吗?那么第一个“.”为什么可以存在?

不知道你这段程序是用在哪的,但是我尝试了单独把他拿出来单步调试,看本地变量值,测试可以看出,我让edit1.text初始值为'.23',那么如果输入'.'程序进入6行至13行的判断,c=1时,判断的是edit1.text[0],即第一个点,然后执行了key:=#0,然后继续循环直到比完edit1.text的所有字符(个人认为这里加个break更好);同样条件下,我将循环条件改为for c:=0 to Length(TEdit(Sender).Text)-1 do,那么检测的TEdit(Sender).Text[0]不是'.'。
这样不知你明白没,我猜这大概是计算器那个输入框的判断吧,那么一般直接输入'.xx'就表示'0.xx',所以第一个点当然可以存在,但一个数字只能有一个小数点,所以再输入一个'.'就是非法,也就不允许输入。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-3-26 12:37:31 | 显示全部楼层
没人能帮个忙吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-3-26 13:26:02 | 显示全部楼层
本帖最后由 jollyshandy 于 2015-3-26 13:30 编辑

虽然看不太懂你想问什么,还是凭我自己的理解说一下吧。
到13行的end前的代码表示如果当次输入的是'.'则检测之前的输入中是否已经有'.'了,即输入的real型数据是否已经有了小数点,有了这次输入就当没有。
14,15行检测输入是否是回车
16,17行检测输入是否是退格(backspace)
18,19行,检测输入是否是0到9之间的数字,如果不是,也是输入为空。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-3-26 13:31:07 | 显示全部楼层
补充下,15行那个表示如果输入回车就到下一个输入的地方。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-3-26 14:55:28 | 显示全部楼层
jollyshandy 发表于 2015-3-26 13:31
补充下,15行那个表示如果输入回车就到下一个输入的地方。

能为我详细的解释下第6,7,8行的代码运行原理吗?是怎么进行判断已经输入了'.',在我看来是一个都不能输入才对
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-3-26 15:34:07 | 显示全部楼层
这里的意思是:
06.如果当前输入'.'
08.从第一个字符开始搜索TEdit.Text字符串,
10.如果TEdit.Text字符串中的某一个字符为'.'
11.当前输入为空
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-3-26 17:12:02 | 显示全部楼层
jollyshandy 发表于 2015-3-26 15:34
这里的意思是:
06.如果当前输入'.'
08.从第一个字符开始搜索TEdit.Text字符串,

有第0个字符吗?那么第一个“.”为什么可以存在?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-3-27 12:55:47 | 显示全部楼层
jollyshandy 发表于 2015-3-27 11:39
不知道你这段程序是用在哪的,但是我尝试了单独把他拿出来单步调试,看本地变量值,测试可以看出,我让ed ...

费心了,不管怎么样,积分就给你吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-3-27 13:00:08 | 显示全部楼层
jollyshandy 发表于 2015-3-26 10:53
不知道你这段程序是用在哪的,但是我尝试了单独把他拿出来单步调试,看本地变量值,测试可以看出,我让ed ...

其实我想到那个点了,就不知道明明输入‘.’,就应该循环,但是第一个点就是不循环,我也单步调试了,可是汇编只是看了一点,不会调试。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-7-1 05:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表