有一个dbgrid中有一个‘审核’字段,当一条记录被审核后就不允许对这条记录做任何修改
后一种解决方法是:
procedure Tpartno_add.ADOTable1AfterScroll(DataSet: TDataSet);
begin
 if adotable1.FieldByName('审核').AsBoolean=true then
     adotable1.ReadOnly:=true
     else adotable1.ReadOnly:=false; 
end;
设置AfterScroll事件,但是这个事件好像只有当记录移动后才会发生,当我们开始打窗口时adotbale的记录是在第一条,也就是说当第一个条记录被审核了,但依然可以修改,而被审核的第二条记录起才不能修改,
我想原因是adotbale打开后,记录停在第一条记录,不触发AfterScroll事件
不知道还有什么更完美的解决方法?
  

解决方案 »

  1.   

    可以这样实现,对审核过得记录变成只读阿,就是你在你的数据库的表里面增加一个审核字段阿,一开始这个字段的缺省值为false,当你对这条记录审核之后,就吧它的审核字段变成true阿,这个操作很好实现的吧,然后当你以后要修改某行数据的话,就检查这条记录的审核字段是否为true阿,是的话,就拒绝审核!这样你不要adotable1.ReadOnly:=true这样操作了阿,其实这个操作也是不对的阿,这个是对整个表的锁定阿,其实你是要实现对某些行的数据进行锁定,对吧!!我得方法应该可行的吧!!
      

  2.   

    简单,表打开的时候自己把记录移动一条不就得了,或者自己触发一下afterscrool事件就可以了
      

  3.   

    你在数据库设计中要有状态字段,在Open事件和afterscroll事件里都做一些判断,当然最好是把判断做成函数。这样的话你的按钮就可以根据数据状态来决定那是可修改还是不可修改!
      

  4.   

    在事情post中做处理不是更好吗,管它移动不移动得
      

  5.   

    我现在不太清楚afterscroll事件在做那些动作后触发,除了移动记录可以好像OPNE也可以吧
    因为我在所有数据库组放入一个DataModule,而我又在DataModule中判断formA用户的权限有多大,用户权限在formA中是一个全局公共变量,但在DataModule中不能访问这个变量,这是为什么呢?
      

  6.   

    godnoloveihavelove(快感)  对
     这种事情怎么能在滚动里写(滚动里检测思路就是不对的)
    应该在 BeforePost ,BeforeEdit 里写不行就 Abort;procedure Tpartno_add.ADOTable1BeforePost(DataSet: TDataSet);
    begin
     if adotable1.FieldByName('审核').AsBoolean=true then
       begin
         ADOQuery1.Cancel;
         Abort;
       end; 
    end;
      

  7.   

    错了 ADOQuery1 该成 adotable1
      

  8.   

    你这情况还是 BeforeEdit 比较好!
      

  9.   

    BeforeEdit 是不行啊,我不知道这个事件是怎么回事,这个事件本来是在编辑之前去检查吗,可是只有当我编辑状态以后才后发生,就是当我输入一个字符之后才发生,那就是别人已经对记录做了修了,为什么会这样呢?
      

  10.   

    BeforeEdit 当然最少要写一个字符了!
    //看下面!
    procedure Tpartno_add.ADOTable1BeforeEdit(DataSet: TDataSet);
    begin
     if adotable1.FieldByName('审核').AsBoolean=true then
       begin
         ADOTable1.Cancel;
         Abort;
       end; 
    end;
    //行这个
      

  11.   

    实在不行就在建立一个数据库连接
    “新连接”掉用事物
    执行行下面的语句绑定到什么DB 控件上都行
    select * from tablename with (rowlock) where 审核=True
    这样数据库中在事物结束前
    符合条件的记录就都被锁定了
      

  12.   

    如果你是害怕用户直接去修改 '审核' 字段
    可以用下面的方法

    Fielid 对象有个 OnSetText 事件 可以单独处理你的哪个 '审核' 字段
    TForm1.ADOTable1[字段名]SetText(Sender: TField;
      const Text: String);Text是新的值(就是用户输入的)
    这时Sender里的数据还是原来的;
    如果 Sender.Value:= Text; 就可以写入了。
    只要启用OnSetText 事件 不处理就写不进去。}
    //比如这是审核字段
    TForm1.ADOTable1[字段名]SetText(Sender: TField;
      const Text: String);
    Begin
       if sender.AsBoolean<> true
           Sender.Value:= Text; 
    end;//BeforeEdit 事件可以处理其他字段
    procedure Tpartno_add.ADOTable1BeforeEdit(DataSet: TDataSet);
    begin
     if adotable1.FieldByName('审核').AsBoolean=true then
       begin
         ADOTable1.Cancel;
         Abort;
       end; 
    end;
    //这样就应该没问题了!
      

  13.   

    if sender.AsBoolean<> true
           Sender.Value:= Text; 
    XXXXX
    if sender.AsBoolean<> true then
           Sender.Value:= Text; 
      

  14.   

    //Delphi 的处理代码~。如果你映射了 TField.OnSetText 处理就由你来控制了。
    procedure TField.SetEditText(const Value: string);
    begin
      if Assigned(FOnSetText) then FOnSetText(Self, Value) else SetText(Value);
    end;