单元名 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 这个新加入的导航控件.这样可以满足你所有需要了
//楼上说的有道理,继承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;
procedure TForm1.DBNavigator1Click(Sender: TObject; Button: TNavigateBtn); begin if button = nbFirst then begin ShowMessage('tt'); end; end;
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.
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 这个新加入的导航控件.这样可以满足你所有需要了
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;
begin
if button = nbFirst then
begin
ShowMessage('tt');
end;
end;
nbInsert, nbDelete, nbEdit, nbPost, nbCancel, nbRefresh);
procedure TForm1.DBNavigator1Click(Sender: TObject; Button: TNavigateBtn);
begin
if button = nbFirst then//在此之前已经执行了First过程,如果LZ不想执行First过程,而完全用自己定义的过程,可能只有重写btnclick了
begin
ShowMessage('tt');
end;
end;
直接在OnClick中写代码即可。
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.