1:Onsettext
2:..
3:CacheUpdate
4:On DateSource DataChange Event:
   if TDataSource(Sender).DataSet.Eof then TDataSource(Sender).DataSet.Cancel;
5:.........

解决方案 »

  1.   

    哈哈,你这个问题,我前几天刚遇到。我后来就没用DBNavigator,我用了BUTTON,然后自己写SQL代码。(INSERT语句)在运行SQL之前,对输入的内容,或者是修改的内容进行判断,然后再运行。如果对于数据库的修改,可以在修改前对内容进行判断,然后再post. navigator虽然很方便,但不是很灵活。我建议还是自己写代码。
      

  2.   

    1)在Dataset(如TTable, TQuery)中,可以在FieldDefs属性中指定每个字段的类型,如指定为整形:ftInteger。这样,如果你要在整形字段中输入字符,是输不进去的。这种做法比输完后再弹出错误对话框要好。
    2)使用OnKeyPress事件
      if Key = #13 then begin
        S := TDBGrid(Sender).SelectedField.Text;
        ShowMessage(S);
      end;
    3)保存之前,调用Post。
    4)捕获DBGrid的OnKeyDown事件,判断当DataSet为EOF时,DBGrid的ReadOnly属性为True, 否则为False,屏蔽输入。如果Key为VK_INSERT时,设置Key := 0;如下例:
      case Key of
        VK_INSERT:
          KEY := 0;
      else
          if TDBGrid(Sender).DataSource.DataSet.Eof then
            TDBGrid(Sender).ReadOnly := True
          else
            TDBGrid(Sender).ReadOnly := False;
      end;5) 定位焦点
      with TDBGrid(Sender) do
      try
        DataSource.DataSet.DisableControls();
        DataSource.Dataet.First;
        DataSource.DataSet.MoveBy(cFocusRow); // Specify the Row index, 0 based.
        SelectedIndex := cFocusCol;  // Specify the col index, 0 based.
        SetFocus;
      finally
        DataSource.DataSet.EnableControls();
      end;
    关于选择前三个字符,似乎有点烦。可以实现,但没有实现的必要。
      

  3.   

    1、这个问题我已结决,在table或query的永久字段对象的onsettext中进行控制。最主要是定义自己的异常。代码如下:
    在implementation下定义:
    type
      Emy=class(exception);用table或query建立永久字段,选中易出错的字段,在onsettext中内容如下:procedure TForm1.Table1filedname1SetText(Sender: TField;
    const Text: String);
    begin
    try
    sender.Value:=text;
    except
    raise emy.Create('类型不对');
    end;
    end;
    找这个错误可能只有这一种方法了,不过一定行的。
      

  4.   

    补充几句,
    针对第1点,使用DataSet的FieldDefs属性,指定字段类型的方法较好,这样编程更简单,可以校验各种类型,而不仅仅是字符串类型。
    针对第4点,我觉得好的做法应该是将DBGrid的Options属性中的dgEditing设为False。
      

  5.   

    对于第四个问题,我想补充一点,其实我是想重载DBNavigator的有关的Button函数,让它不执行默认的事件,而执行我自定义的函数,但不知道怎么做。
      

  6.   

    对于第三个问题,可能大家误解了,数据这时在缓冲区没错,但我是在行或列值改变时对这些数据进行相关处理,所以不能不执行OnColExit和OnBeforeScroll等过程自定义的事件。
      

  7.   

    1、可在 onkeydown 中屏蔽字符。
    2、那是因为你还没有提交,在 showmessage 前加上tabel1.post试试。
    4。if (key=vk_return) and (table1.eof) then key=0;