南方的人 发表于 2015-3-26 10:53:31

谁能帮我解释下原理吗?

本帖最后由 南方的人 于 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 = '.' 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;
求大神解释下

jollyshandy 发表于 2015-3-26 10:53:32

南方的人 发表于 2015-3-26 17:12
有第0个字符吗?那么第一个“.”为什么可以存在?

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

南方的人 发表于 2015-3-26 12:37:31

没人能帮个忙吗?

jollyshandy 发表于 2015-3-26 13:26:02

本帖最后由 jollyshandy 于 2015-3-26 13:30 编辑

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

jollyshandy 发表于 2015-3-26 13:31:07

补充下,15行那个表示如果输入回车就到下一个输入的地方。

南方的人 发表于 2015-3-26 14:55:28

jollyshandy 发表于 2015-3-26 13:31
补充下,15行那个表示如果输入回车就到下一个输入的地方。

能为我详细的解释下第6,7,8行的代码运行原理吗?是怎么进行判断已经输入了'.',在我看来是一个都不能输入才对

jollyshandy 发表于 2015-3-26 15:34:07

这里的意思是:
06.如果当前输入'.'
08.从第一个字符开始搜索TEdit.Text字符串,
10.如果TEdit.Text字符串中的某一个字符为'.'
11.当前输入为空

南方的人 发表于 2015-3-26 17:12:02

jollyshandy 发表于 2015-3-26 15:34
这里的意思是:
06.如果当前输入'.'
08.从第一个字符开始搜索TEdit.Text字符串,


有第0个字符吗?那么第一个“.”为什么可以存在?

南方的人 发表于 2015-3-27 12:55:47

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

费心了,不管怎么样,积分就给你吧

南方的人 发表于 2015-3-27 13:00:08

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

其实我想到那个点了,就不知道明明输入‘.’,就应该循环,但是第一个点就是不循环,我也单步调试了,可是汇编只是看了一点,不会调试。。
页: [1]
查看完整版本: 谁能帮我解释下原理吗?