我有一个控件:来自TIimgBMEdit ,是从MastEdit继承下来的(控件集成了按钮功能),我在其它加了一个key属性。窗体分别用text属性显示客户名称,用key显示客户代码。当我点击按钮后,并把客户名称、客户代码分别写入text、key属性后,我希望如果在该控件上手动改动其text时也能校验其输入的准确性,这是否在该控件的OnExit事件中写代码?   如果这样做有个问题:当我点击工具栏上的保存按钮保存数据时,跳过了控件的ONExit事件。。请问各位大侠如何解决此问题???小弟在此先谢了

解决方案 »

  1.   

    onChange事件,可以实时校验,但是每个字符都校验,效率低.
    在保存那里校验,其实是完全合理的.这最保险.其实就一句话就OK.
    MaskEdit.OnExit(nil);
      

  2.   

    例如:只有用户修改了其text值时,才需要校验,大家有无具体的实现方法及参考代码?
      

  3.   

    能否根据控件的输入状态来判断用户是否修改了内容???或者:如何捕获除了控制键以外所有的键值??? 以便在控件的keypress、keyup、keydown中判断用户是否修改了控件内容???
      

  4.   

    不用那么累...
    你定义一个布尔变量bChanged,
    在Edit.onChange事件中写入bChanged := True;
    然后在校验过程中,或者在调用校验过程之前判断 if bChanged then ...
      

  5.   

    当然是在Edit.onChange中进行判断了。procedure TForm1.Edit1Change(Sender: TObject);
    begin
      if Edit1.Modified then
      begin
        ...
        if InputIsInvalid then
          Edit1.Undo;  //你还可以Undo哦
        ...
      end;
    end;
      

  6.   

    作为CS程序,比较好的校验应该在Edit.onChange事件中进行,这样对客户来讲比较友好,客户不用等自己辛辛苦苦输入完保存时才发现输入非法。
      

  7.   

    各位大侠: 如果窗体中有多个输入控件,应如何写一个函数负靓统一检查各个输入控件是否修改过??还有:fbysss(独孤求败)方法用控件tag值来检测,好不好??
      

  8.   

    如果每个控件都有一个修改标志属性:ValueChanged,则可如下进行:
    //判断某个对象是否具有某个属性
    function HasProperty(AObject: TObject;
      const APropName: string): boolean;
    begin
     Result := GetPropInfo(AObject.ClassInfo,APropName) <> nil;
    end;function CheckData(uFrom: Tform): Boolean;
    var
      i : integer;
    begin
      result:=false;
      for i:=0 to uFrom.ComponentCount -1 do
      begin
        if  HasProperty(uFrom.Components[i],'ValueChanged') then
        begin
           if GetStrProp(uFrom.Components[i],'ValueChanged',false) then
           begin
           end;
      end;
    end;注意setstrprop等函数在TypInfo文件里,记得引用.其它数据类型的值的设定和获取函数也在这个文件里,自己可以查看。
      

  9.   

    用一个list保存一下var Told,Tnew:Tstringlist;
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      TOld:=TstringList.Create;
      TNew:=TstringList.Create;
      TOld.Add('Edit1='+Edit1.Text);
      TOld.Add('Edit2='+Edit2.Text);
      TOld.Add('Edit3='+Edit3.Text);
      //...Others
      Tnew.Text:=Told.Text;
    end;procedure TForm1.Button1Click(Sender: TObject);
    var i:integer;
    begin
      for i:=0 to TOld.Count-1 do
        if TOld.Strings[i]<>Tnew.Strings[i]
           then  memo1.Lines.Add(TOld.Names[i]+'的内容被修改');
    end;procedure TForm1.Edit1Change(Sender: TObject);
    var i:integer;
        s:string;
    begin
      if Sender is TEdit then s:=(Sender as TEdit).Text;
      Tnew.Values[(Sender as Tcomponent).Name]:=s;
    end;