1,小弟的Form上有若干个Edit控件和一个Bitbtn,每个Edit要求输入一个一定范围的浮点数,例如:1.6-29.99,而点击bitbtn,使所有的Edit为空。我现在的问题是:在向Edit输入的过程中,如果出错,使用退格,一旦Edit为空时,就弹出异常,说'' is not a valid float,而如果我加上if Edit.txet='' then exit; 这句的话,一点击Bitbtn,Form就关了,我该怎么办呢,请各位大哥指点。2 我在用SPCOMM控件发数据的时候,例如:
Var
 buff : array[1..400] of byte;
begin
 writeCommData(@buff,400);
end;
我该怎么判断数据已经完全发送完毕,因为writeCommData函数它一执行成功就马上返回true,相应的数据随后才发送,请各位大哥指点。

解决方案 »

  1.   

    1,小弟的Form上有若干个Edit控件和一个Bitbtn,每个Edit要求输入一个一定范围的浮点数,例如:1.6-29.99,而点击bitbtn,使所有的Edit为空。我现在的问题是:在向Edit输入的过程中,如果出错,使用退格,一旦Edit为空时,就弹出异常,说'' is not a valid float,而如果我加上if Edit.txet='' then exit; 这句的话,一点击Bitbtn,Form就关了,我该怎么办呢,请各位大哥指点。不要在EDIT的ONCHANGE()里写代码啊。你可以在ONEXIT()里写代码判断是否是正确的输入了数据。
    一点BITBTN就关了窗体,估计是你的按钮的MODALRESULT值被你设置成了非MrNone。2 我在用SPCOMM控件发数据的时候,例如:
    Var
     buff : array[1..400] of byte;
    begin
     writeCommData(@buff,400);
     sleep(1000);//---延时1秒。
    end;
    我该怎么判断数据已经完全发送完毕,因为writeCommData函数它一执行成功就马上返回true,相应的数据随后才发送,请各位大哥指点。
      

  2.   

    dinglinger,谢谢!但我试了试还是有问题,我照你的建议,改在OnExit事件里写代码,如下:
    procedure TFixedFrequencyDlg.Edit1Exit(Sender: TObject);
    begin
     if ((StrToFloat(Edit1.Text)>29.9999) or (StrToFloat(Edit1.Text)<1.6)) then
       begin
         Edit1.Font.Color :=clRed;
         Showmessage('Error!Your input out of range!');
       end
     else
      Edit1.Font.Color :=clBlack;
    end;
    但是,执行的时候,如果我什么都不输入,就把焦点移动到别的Edit上,马上就会弹出异常对话框,提示你‘’is not a valid float。而且,如果我在Edit1中输入数据,退出的时候焦点自然移到Edit2上,但如果我发现数据输错了,再回头改的时候,相当于Edit2的OnExit事件发生,但这时Edit2也是空的,同样也会弹出一样的异常对话框。
    实际上还是原来的那个问题:
     if Eidt.Text ='' then
      ........
    写入Exit,也不行,因为我还有后续的操作,如果为exit,后续的操作就执行不了了,
    因为我的Form上还有一个Bitbtn,在这个Bitbtn的点击事件中,判断,如果Form上的Edit有一个为空,就弹出对话框,提示用户数据还没有输完,但因为有exit,所以该对话框出现不了。
    这个问题,我已经想了好几天了,死活不行,时间又比较紧张。
      

  3.   

    procedure TForm1.Edit1Exit(Sender: TObject);
    begin
    if edit1.text <> '' then
     if ((StrToFloat(Edit1.Text)>29.9999) or (StrToFloat(Edit1.Text)<1.6)) then
       begin
         Edit1.Font.Color :=clRed;
         Showmessage('Error!Your input out of range!');
         edit1.SetFocus;
       end
     else
      Edit1.Font.Color :=clBlack;end;
      

  4.   

    朋友,借你地方一用。
    我也有个问题,在另一个版块里,请帮忙解答。
    谢谢!
    http://community.csdn.net/Expert/topic/5127/5127444.xml?temp=.3603784
      

  5.   

    mosquito1976,谢谢!你的问题我刚才看了,不好意思,小弟没有学过离散数学,实在是帮不了你呀。
    这个问题是解决了,可小弟还有一个问题,还是在这个Form上,就像我上面说的那样,有一个Bitbtn,在这个Bitbtn的点击事件里判断,只要有一个Edit的内容为空,就提示说,没有输入完,但我刚才试了,点击后没反应,我的代码是这样写的:
    procedure TFixedFrequencyDlg.OkBitBtnClick(Sender: TObject);
    begin
     if ((TEdit(sender).Text ='') or (TComboBox(sender).ItemIndex=-1)) then
      Showmessage('Error!');
    end;
    Form上还有一些TComboBox。还望大哥能够帮助,谢谢!
    不好意思,你的忙我帮不上。我记得离散数学是计算机系的课程吧,我没学过,我是学通信的。
      

  6.   

    procedure TFixedFrequencyDlg.OkBitBtnClick(Sender: TObject);
    var i: integer;
    begin
        for i := 0 to Form1.ComponentCount - 1 do
        begin
          if (Form1.Components[i] is TEdit) and (TEdit(Form1.Components[i]).Text ='')then
          begin
            showmessage('Error!');
            TEdit(Form1.Components[i]).setfocus;
          end;
          if (Form1.Components[i] is TComboBox) and (TComboBox(Form1.Components[i]).Text='') then
          begin
            showmessage('Error!');
            TComboBox(Form1.Components[i]).setfocus;
          end;
        end;
    end;
      

  7.   

    在edit的keypress事件里判断输入的是否是数字procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
    begin
     if Not(Key in ['0'..'9','.']) then
        Key := #0;
    end;然后在Edit1Exit事件里写,用strtofloatdef()就不会报你说的那个错了if edit1.text <> '' then
     if ((StrToFloatDef(Edit1.Text,0)>29.9999) or (StrToFloatDef(Edit1.Text,0)<1.6)) then
       begin
         Edit1.Font.Color :=clRed;
         Showmessage('Error!Your input out of range!');
         edit1.SetFocus;
       end
     else
      Edit1.Font.Color :=clBlack;
      

  8.   

    mosquito1976,谢谢!我刚才试了你的代码,感觉还是不太对,我的Form上有10个Edit和10个ComboBox,我想要的是:能不能这20个控件一起判断,即他们的内容全不为空的话,就执行下一步的操作,只要有一个是空的,就提示。例如:
    if 至少有一个为空 then
     statement1
    else
     statement2
    只要有一个为空,statement2的代码就不执行,只有全不为空的情况下,才执行statement2的代码,该怎么写呢?谢谢!
      

  9.   

    我测试过啊,没什么错啊。
    FOR循环就是控制让所有的EDIT,COMBOBOX都检查
      

  10.   

    mosquito1976,谢谢!但还是有点问题,可能是我的代码写错了,你给看看,
    procedure TFixedFrequencyDlg.OkBitBtnClick(Sender: TObject);
    Var
     i : Integer;
    begin
      for i := 0 to ComponentCount - 1 do
        begin
          if ((Components[i] is TEdit) and (TEdit(Components[i]).Text ='')) or   ((Components[i] is TComboBox) and (TComboBox(Components[i]).Text=''))then
            begin
              showmessage('Error!');
              TEdit(Components[i]).setfocus;
            end
          else
            MainForm.BitBtn1.Font.Color :=clRed;
        end;
    end;MainForm是我程序的主界面,Bitbtn1是主界面上的一个按钮,我的本意是只有当10个Edit和10个ComboBox的内容全不为空时,使Bitbtn1的颜色为红色,但是我试了半天,即使20个控件当中,有的内容为空,比如:总共有5个是空的,在弹出5个Error对话框后,Bitbtn的颜色就变成红色了,这和我程序的初衷是不符合的,因为我必须确保数据没有空的,然后在主程序中,根据Bitbtn的颜色来判断,进行下一步的操作,但如果这样的话就判断不准确了。还望你能够指点。