呵呵,Delphi好像是通过一个什么消息来着,来找到第一个符合条件的数据源。

解决方案 »

  1.   

    首先,我们可以看一下类的继承关系
    TBasicAction->TContainedAction->TCustomAction->TAction->TDataSetAction
    ->TDataSetInsert
    在组件类TComponent中有如下方法,如下代码所示:
    function TComponent.ExecuteAction(Action: TBasicAction): Boolean;//!
    begin
      if Action.HandlesTarget(Self) then
      begin
        Action.ExecuteTarget(Self);
        Result := True;
      end
      else Result := False;
    end;
    注意其中的一句:Action.ExecuteTarget(Self),它调用了TBasicAction的一个方法,该方法在Delphi中的声明如下所示:procedure ExecuteTarget(Target: TObject); virtual;它的实现代码如下:
    procedure TBasicAction.ExecuteTarget(Target: TObject);
    begin
    end;  也就是说,它只申明了一个虚方法,用来在后来的继承类中实现。在该类的继承类中实现了这一方法
    procedure TDataSetInsert.ExecuteTarget(Target: TObject);
    begin
      GetDataSet(Target).Insert;
    end;
    而GetDataSet方法是从类TDataSetAction中继承而来,其实现如下:
    function TDataSetAction.GetDataSet(Target: TObject): TDataSet;
    begin
      { We could cast Target as a TDataSource since HandlesTarget "should" be
        called before ExecuteTarget and UpdateTarget, however, we're being safe. }
      Result := (Target as TDataSource).DataSet;
    end;
    由此可见,当组件类被赋予了特定的行为时,调用方法ExecuteAction,将自身作为参数传递给类TBasicAction的方法ExecuteTarget,此时的Target参数的实参就是TComponent自身。
      

  2.   

    小刀兄弟,比如我们对一个DBGrid进行Next操作时,ExecuteTarget中的Target应是DBGrid,如何能将DBGrid转换为TDataSource呢?
      

  3.   

    type
      TNowDataSetAction = class(TDataSetAction)
      private
        FNowDataSet: TDataSet;
        function GetNowDataSet: TDataSet;
      public
        procedure ExecuteTarget(Target: TObject); override;
        procedure UpdateTarget(Target: TObject); override;
      published
        property DataSource;
        property NowDataSet: TDataSet read GetNowDataSet; 
      end;{ TNowDataSetAction }procedure TNowDataSetAction.ExecuteTarget(Target: TObject);
    begin
      inherited;
      FNowDataSet := GetDataSet(Target);end;function TNowDataSetAction.GetNowDataSet: TDataSet;
    begin
      Self.Execute;
      Result := FNowDataSet;end;procedure TNowDataSetAction.UpdateTarget(Target: TObject);
    begin
      inherited;
      FNowDataSet := GetDataSet(Target);
      if Assigned(FNowDataSet) then
        Enabled := True
      else
        Enabled := False;end;
      

  4.   

    定义一aNowDataSet: TNowDataSetAction;
    create它,然后用aNoqDataSet.NowDataSet就OK了
      

  5.   

    3fly(三飞) 同志能否详细一点,最好是能写一个函数,
    求出当前激活的DataSource对象。