我使用的adoquery,控件全部都使用感知控件。有個字段是Float類型的,輸入的時候如果輸入字母e,那焦點一離開該DbEdit,那就會報錯,EDataBaseError什麼的,說e不是有效的Float,我在BeforePost裡面進行檢驗,但是根本來不及走到BeforePost就出錯了。我該如何控制呢?

解决方案 »

  1.   

    procedure TFrm1._FloatChange1(Sender: TObject);
    begin
      if Sender is TCustomEdit then
        with TCustomEdit(Sender) do
          if (Text<>'-') and (Text<>'+') and (Text<>'') then
            if not TextToFloat(PChar(Text), t, fvCurrency) then
            begin
              Text:=Copy(Text, 1, Length(Text)-1);
              SendMessage(TCustomEdit(Sender).Handle, WM_KEYDOWN, VK_END, 0);
            end;
    end;
      

  2.   

    var
      t: Currency;
      

  3.   

    TFrm1._FloatChange1是什麼啊?在字段的Change事件裡面執行嗎?
      

  4.   

    _FloatChange1是窗体Tfrm1的某一个事件啊。
    一般放在控件的OnChange事件中procedure TFrm1._FloatChange1(Sender: TObject);
    begin
      if Sender is TCustomEdit then//控制TCustomEdit的子类,如TEdit, TDBEdit....
    //如果你想用RTTI来控制或者读取的情况下,可以写更通用的,只是我没有写出来。
        with TCustomEdit(Sender) do//控制TCustomEdit的子类
          if (Text<>'-') and (Text<>'+') and (Text<>'') then//可以输入+,-等符号
            if not TextToFloat(PChar(Text), t, fvCurrency) then
    //查看用入输入的是不是浮点型数据
            begin
              Text:=Copy(Text, 1, Length(Text)-1);
    //如果用用输入的不是浮点型数据,就把用户输入的最后一个字符删掉,
    //再次会触发该事件,看剩下的字符数据是不是浮点型数,
    //如果是浮点型数就退出,否则继续把用户输入的最后一个字符去掉
    //要加这一句代码重复触发该事件的理由:用户有可能是“粘贴”的数据!!!
              SendMessage(TCustomEdit(Sender).Handle, WM_KEYDOWN, VK_END, 0);
    //把光标放到最后一个字符后。        end;
    end;//这样用户输入的一定就是浮点数了
      

  5.   

    procedure TForm1.DBEdit1Change(Sender: TObject);
    var
      t: Currency;
    begin
      if Sender is TCustomEdit then
        with TCustomEdit(Sender) do
          if (Text <> '-') and (Text <> '+') and (Text <> '') then
            if not TextToFloat(PChar(Text), t, fvCurrency) then
            begin
              Text := Copy(Text, 1, Length(Text) - 1);
              SendMessage(TCustomEdit(Sender).Handle, WM_KEYDOWN, VK_END, 0);
            end;
    end;
      

  6.   

    NiuNiuTZ:
      何必这么复杂!
      你可以把字段改为字符型的,然后在感知控件的keypress事件限制允许输入的字符,以后如果希望只输入整型的,把keypress事件里面的限制语句改一下就行了。
      仅供参考。
      

  7.   

    用keypress事件限制只能输入数字和小数点
      

  8.   

    带五角星的也不复杂呀,而且用一个事件控制一个窗体的所有TCustomerEdit的输入
      

  9.   

    in keypress:
    if not (key in['0'..'9',#8..#10,#37..#40,#13,'.']) then
     key:=#0;