三飞老弟,你的函数已经很好用了
只是TAction.UpdateTarget事件出现的频率太多(几乎所有的消息都会触发)
你把她放在数据集的事件中处理不是就好了吗?
当然这种方法比较别扭,但目前也想不到更简洁的办法
我先收录,请大家再想想找找
//我是完美主义者,请勿见怪修改你的函数
http://kingron.myetang.com/zsfunc0v.htm(*//
标题:判断ADO数据集是否还有数据没有提交
说明:等待升级
设计:3fly
整理:Zswang
日期:2002-03-03
支持:[email protected]
//*)///////Begin Source
function CacheNotSave(mDataSet: TCustomADODataSet): Boolean;
{ 返回ADO数据集是否还有数据没有提交 }
var
  vFiltered: Boolean;
  vFilterGroup: TFilterGroup;
  vBook: string;
begin
  Result := False;
  if not mDataSet.Active then Exit;
  if mDataSet.LockType <> ltBatchOptimistic then Exit;
  vBook := mDataSet.Book;
  mDataSet.DisableControls;
  try
    vFiltered := mDataSet.Filtered;
    vFilterGroup := mDataSet.FilterGroup;
    try
      mDataSet.Filtered := True;
      mDataSet.FilterGroup := fgPendingRecords;
      Result := mDataSet.RecordCount > 0;
    finally
      mDataSet.Filtered := vFiltered;
      mDataSet.FilterGroup := vFilterGroup;
    end;
  finally
    mDataSet.Book := vBook;
    mDataSet.EnableControls;
  end;
end; { CacheNotSave }
///////End Source///////Begin Demo
procedure TForm1.Button1Click(Sender: TObject);
begin
  ADOTable1.UpdateBatch;
  CheckBox1.Checked := CacheNotSave(ADOTable1);
  //ActionUpdateBatch.Enabled := CacheNotSave(ADOTable1);
end;procedure TForm1.ADOTable1AfterCancel(DataSet: TDataSet);
begin
  CheckBox1.Checked := CacheNotSave(TCustomADODataSet(DataSet));
end;procedure TForm1.ADOTable1AfterPost(DataSet: TDataSet);
begin
  CheckBox1.Checked := CacheNotSave(TCustomADODataSet(DataSet));
end;procedure TForm1.ADOTable1AfterDelete(DataSet: TDataSet);
begin
  CheckBox1.Checked := CacheNotSave(TCustomADODataSet(DataSet));
end;procedure TForm1.ADOTable1AfterOpen(DataSet: TDataSet);
begin
  CheckBox1.Checked := CacheNotSave(TCustomADODataSet(DataSet));
end;
///////End Demo

解决方案 »

  1.   

    首先,非常抱歉前一段時間公司的ADSL上不了網,一直沒來CSDN
    其次,非常感謝 zswang 經常光顧我的貼子,並感謝 zswang 的夸獎我的這個function用在我的一個控件(inherit from TDataSetAction)中,代碼如下,TxlDataSetAction是我的Action的基類 TxlDataSetAction = class(TDataSetAction)  TxlDataSetPostAll = class(TxlDataSetAction)
      public
        procedure ExecuteTarget(Target: TObject); override;
        procedure UpdateTarget(Target: TObject); override;
      published
        property DataSource;
      end;{ TxlDataSetPostAll }procedure TxlDataSetPostAll.ExecuteTarget(Target: TObject);
    var
      tmpDataSet: TDataSet;
      tmpCursor: TCursor;
    begin
      inherited;
      tmpCursor := Screen.Cursor;
      Screen.Cursor := crHourGlass;
      try
        tmpDataSet := GetDataSet(Target);
        if (tmpDataSet.State in dsEditModes) then
          tmpDataSet.Post;
        if CacheNotSave(tmpDataSet) then
          TCustomADODataSet(tmpDataSet).UpdateBatch;
        if TCustomADODataSet(tmpDataSet).Connection.InTransaction then
          TCustomADODataSet(tmpDataSet).Connection.CommitTrans;
      finally
        Screen.Cursor := tmpCursor;
      end;end;procedure TxlDataSetPostAll.UpdateTarget(Target: TObject);
    var
      tmpDataSet: TDataSet;
    begin
      inherited;
      tmpDataSet := GetDataSet(Target);
      if tmpDataSet = nil then
        Enabled := False
      else
      if tmpDataSet is TCustomADODataSet then
      begin
        Enabled := tmpDataSet.Active and tmpDataSet.CanModify
    and ((tmpDataSet.State in dsEditModes)
              or CacheNotSave(tmpDataSet)
      or TCustomADODataSet(tmpDataSet).Connection.InTransaction);
      end;end;
    這個控件我用來放在MDI主窗體上,這樣,任何一個激活的MDI子窗體上的DataSet控件對應的數據集的狀態,我都可通過TxlDataSetPostAll的Enabled屬性來得知,也就是因為這樣,我不能象 zswang 說的那樣做上面說DBGrid中有閃爍及其它問題,其實DBGrid中的主要問題是無法ShowEditor(看不到光標,一直是一個藍色方框)最後請大家多幫忙踢一下,讓更多的兄弟看到,以便幫我解決問題,兄弟我先謝了