DBNavigator 如何自定一个过程 取代它的某一个按钮过程

解决方案 »

  1.   

    单元名 DBNavigatorEx.pas内容:unit DBNavigatorEx;interfaceuses
      SysUtils, Classes, Controls, ExtCtrls, DBCtrls;type
      TDBNavigatorEx = class(TDBNavigator)
      private
        { Private declarations }
      protected
        { Protected declarations }
      public
        { Public declarations }
        procedure BtnClick(Index: TNavigateBtn); override;
      published
        { Published declarations }
      end;procedure Register;implementationprocedure Register;
    begin
      RegisterComponents('Samples', [TDBNavigatorEx]);
    end;{ TDBNavigatorEx }procedure TDBNavigatorEx.BtnClick(Index: TNavigateBtn);
    begin
      inherited;
      if (DataSource <> nil) and (DataSource.State <> dsInactive) then
      begin
        if not (csDesigning in ComponentState) and Assigned(BeforeAction) then
          BeforeAction(Self, Index);
        with DataSource.DataSet do
        begin
          case Index of
           nbPrior:    // 写入向前的代码
            nbNext:     // 写入下一条的代码
            nbFirst:    // 写入第一条的代码
            nbLast:     // 写入最后一条的代码
            nbInsert:   // 写入插入的代码
            nbEdit:     // 写入编辑的代码
            nbCancel:   // 写入取消的代码
            nbPost:     // 写入提交的代码
            nbRefresh:  // 写入刷新的代码
            nbDelete:   // 写入删除的代码
          end;
        end;
      end;
      if not (csDesigning in ComponentState) and Assigned(OnNavClick) then
        OnNavClick(Self, Index);
    end;end.
    然好以后, 选择Component菜单 -> InstallComonent -> 选择单元保存位置, 编译, 安装
    然后在sample这个页里面会有 DBNavigatorEx 这个新加入的导航控件.这样可以满足你所有需要了
      

  2.   

    //楼上说的有道理,继承Navigator后,重写BtnClick方法procedure TDBNavigator.BtnClick(Index: TNavigateBtn);
    begin
      if (DataSource <> nil) and (DataSource.State <> dsInactive) then
      begin
        if not (csDesigning in ComponentState) and Assigned(FBeforeAction) then
          FBeforeAction(Self, Index);
        with DataSource.DataSet do
        begin
          case Index of
            nbPrior: Prior;
            nbNext: Next;
            nbFirst: First;
            nbLast: Last;
            nbInsert: Insert;
            nbEdit: Edit;
            nbCancel: Cancel;
            nbPost: Post;
            nbRefresh: Refresh;
            nbDelete:
              if not FConfirmDelete or
                (MessageDlg(SDeleteRecordQuestion, mtConfirmation,
                mbOKCancel, 0) <> idCancel) then Delete;
          end;
        end;
      end;
      if not (csDesigning in ComponentState) and Assigned(FOnNavClick) then
        FOnNavClick(Self, Index);
    end;
      

  3.   

    procedure TForm1.DBNavigator1Click(Sender: TObject; Button: TNavigateBtn);
    begin
      if button = nbFirst then
      begin
        ShowMessage('tt');
      end;
    end;
      

  4.   

    判断下就行了。  TNavigateBtn = (nbFirst, nbPrior, nbNext, nbLast,
                      nbInsert, nbDelete, nbEdit, nbPost, nbCancel, nbRefresh);
      

  5.   

    刘德华的方法不错,主要看楼主的需求了!
    procedure TForm1.DBNavigator1Click(Sender: TObject; Button: TNavigateBtn);
    begin
      if button = nbFirst then//在此之前已经执行了First过程,如果LZ不想执行First过程,而完全用自己定义的过程,可能只有重写btnclick了
      begin
        ShowMessage('tt');
      end;
    end;
      

  6.   

    同意 starluck DBNavigator1Click,其中Button就是你点击的那个按钮类型,判断一下,然后写自己的代码
      

  7.   

    如果你只是想用这个组件的button功能,你可以不关联DataSource,
    直接在OnClick中写代码即可。
      

  8.   

    不关联, 会让按钮不会自动跟着DataSet的状态变化而变化的
      

  9.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls, DBCtrls, Buttons, DB, DBTables, TypInfo;type
      TForm1 = class(TForm)
        DBNavigator1: TDBNavigator;
        SpeedButton1: TSpeedButton;
        Table1: TTable;
        DataSource1: TDataSource;
        procedure FormShow(Sender: TObject);
      private
        procedure MyClick(Sender: TObject);
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormShow(Sender: TObject);
    var
      I: Integer;
      C: TComponent;
    begin
      for I:=0 to DBNavigator1.ComponentCount-1 do
      begin
        C := DBNavigator1.Components[I];
        if C is TSpeedButton then
          if TNavButton(C).Index=nbNext then
            TNavButton(C).OnClick := MyClick;
      end;
    end;procedure TForm1.MyClick(Sender: TObject);
    begin
      ShowMessage(GetEnumName(TypeInfo(TNavigateBtn), Ord(TNavButton(Sender).Index)));
    end;end.