自己实现TDBNavigator功能

时间:2021-09-22 20:07:45
大家都知道TDBNavigator所关联的ADO数据集中某个字段值发生改变后就会自动改变TDBNavigator控件的显示界面(使有些按钮有效,有些按钮无效),好象是通过执行DataChanged过程来实现的,但DataChanged过程是如何被调用的?(什么事件触发了该过程执行?) 
  换言之,如果自己设计一个实现如TDBNavigator 功能的控件,怎样做到数据集中某个字段值发生改变后就会自动改变控件的显示界面, (不要在数据集中添加事代码).多谢!
  
  

17 个解决方案

#1


自己顶一下!

#2


應該是重載

TDataLink 的
    procedure EditingChanged; override;
    procedure DataSetChanged; override;
    procedure ActiveChanged; override;
這三個方法

#3


aiirii(ari-爱的眼睛):
  能说具体一点吗?
  
  如果我直接修改了TDBNavigator的方法,怎么执行结果不会变化吗?

#4


mark

#5


看TDBNavigator的源码

#6


学习,学习~~~~~

#7


笨办法也有..
偶以前就用过...
用Timer组件监视...

#8


TActionList有这种标准Action,不用写代码,让按钮执行相应的Action就可以做到楼主要的效果了。

#9


自定义了一个类,从TDBNavigator类继承的, 想改写BtnClick方法, 用下列代码作为测试执行效果,为什么没有出现提示对话框出来?

procedure BtnClick(Index: TNavigateBtn); override;
......

procedure TmyDBNav.BtnClick(Index: TNavigateBtn);
begin
  inherited BtnClick(Index);
  if Index=nbDelete then
    if (MessageDlg('您确定要删除该记录吗?', mtConfirmation,mbOKCancel, 0) <> idCancel)
    then
      ShowMessage('您确定了!')
    else
      ShowMessage('您取消了!');
end;

#10


-------------用Timer组件监视...
这方法不可取.

#11


关注

#12


顶一把

#13


要实现自己的TDBNavigator功能,只能在数据集中实现(我的理解)
在基类TDataSet中定义了诸如Post、Refresh、Edit等方法。在移动数据前后,TDataSet会触发BeforeScroll和AfterScroll事件
可以在AfterScroll事件中增加代码
如:在Form中放置10个SpeedButton(分别代替TDBNavigator的First、Next、Edit等),DataSource1,Table1
字义一个函数SetButton
procedure TForm1.SetButton
begin
  sbFirst.Enabled:= (DataSource1.DataSet.State = dsBrowse) and (not DataSource1.DataSet.Bof);
  sbEdit.Enabled:= (DataSource1.DataSet.State = dsBrowse) and ((not DataSource1.DataSet.Bof) or (not DataSource1.DataSet.Eof));
  ......
end;

Table1的AfterSroll事件
procedure TForm1.Table1AfterScroll(DataSet: TDataSet);
begin
  SetButton;
end;

First按钮的Click事件
procedure TForm1.sbFirstClick(Sender: TOjbect);
begin
  if DataSource1.DataSet.State = dsBrowse then
    DataSource1.DataSet.First;
end;

Edit按钮的Click事件
procedure TForm1.sbEditClick(Sender: TOjbect);
begin
  if (DataSource1.DataSet.State = dsBrowse) and ((not DataSource1.DataSet.Bof) or (not DataSource1.DataSet.Eof)) then
    DataSource1.DataSet.Edit;
end;

#14


楼上的朋友说得对,TDBNavigator所得供的功能在数据集里都能够找到,你可以利用一些按钮来实现这些功能,来替代TDBNavigator组件。你还可以利用数据集来开发功能更强大的东西,因为数据集并不使用SQL语句,就能实现Select语句的多数功能,很多好东西都在它里面。

#15


正期待

#16


procedure TmyDBNav.BtnClick(Index: TNavigateBtn);
begin
  inherited BtnClick(Index);
  if Index=nbDelete then
    if (MessageDlg('您确定要删除该记录吗?', mtConfirmation,mbOKCancel, 0) <> idCancel)
    then
      ShowMessage('您确定了!')
    else
      ShowMessage('您取消了!');
end;
-----------------------------------------------
你想改变提示信息,改用你的方法,应该在先自己处理,然后调用组件源方法:

把inherited BtnClick(Index);一句放到最后吧,就会先处理你的操作,然后调用父代的方法。

#17


学习

#1


自己顶一下!

#2


應該是重載

TDataLink 的
    procedure EditingChanged; override;
    procedure DataSetChanged; override;
    procedure ActiveChanged; override;
這三個方法

#3


aiirii(ari-爱的眼睛):
  能说具体一点吗?
  
  如果我直接修改了TDBNavigator的方法,怎么执行结果不会变化吗?

#4


mark

#5


看TDBNavigator的源码

#6


学习,学习~~~~~

#7


笨办法也有..
偶以前就用过...
用Timer组件监视...

#8


TActionList有这种标准Action,不用写代码,让按钮执行相应的Action就可以做到楼主要的效果了。

#9


自定义了一个类,从TDBNavigator类继承的, 想改写BtnClick方法, 用下列代码作为测试执行效果,为什么没有出现提示对话框出来?

procedure BtnClick(Index: TNavigateBtn); override;
......

procedure TmyDBNav.BtnClick(Index: TNavigateBtn);
begin
  inherited BtnClick(Index);
  if Index=nbDelete then
    if (MessageDlg('您确定要删除该记录吗?', mtConfirmation,mbOKCancel, 0) <> idCancel)
    then
      ShowMessage('您确定了!')
    else
      ShowMessage('您取消了!');
end;

#10


-------------用Timer组件监视...
这方法不可取.

#11


关注

#12


顶一把

#13


要实现自己的TDBNavigator功能,只能在数据集中实现(我的理解)
在基类TDataSet中定义了诸如Post、Refresh、Edit等方法。在移动数据前后,TDataSet会触发BeforeScroll和AfterScroll事件
可以在AfterScroll事件中增加代码
如:在Form中放置10个SpeedButton(分别代替TDBNavigator的First、Next、Edit等),DataSource1,Table1
字义一个函数SetButton
procedure TForm1.SetButton
begin
  sbFirst.Enabled:= (DataSource1.DataSet.State = dsBrowse) and (not DataSource1.DataSet.Bof);
  sbEdit.Enabled:= (DataSource1.DataSet.State = dsBrowse) and ((not DataSource1.DataSet.Bof) or (not DataSource1.DataSet.Eof));
  ......
end;

Table1的AfterSroll事件
procedure TForm1.Table1AfterScroll(DataSet: TDataSet);
begin
  SetButton;
end;

First按钮的Click事件
procedure TForm1.sbFirstClick(Sender: TOjbect);
begin
  if DataSource1.DataSet.State = dsBrowse then
    DataSource1.DataSet.First;
end;

Edit按钮的Click事件
procedure TForm1.sbEditClick(Sender: TOjbect);
begin
  if (DataSource1.DataSet.State = dsBrowse) and ((not DataSource1.DataSet.Bof) or (not DataSource1.DataSet.Eof)) then
    DataSource1.DataSet.Edit;
end;

#14


楼上的朋友说得对,TDBNavigator所得供的功能在数据集里都能够找到,你可以利用一些按钮来实现这些功能,来替代TDBNavigator组件。你还可以利用数据集来开发功能更强大的东西,因为数据集并不使用SQL语句,就能实现Select语句的多数功能,很多好东西都在它里面。

#15


正期待

#16


procedure TmyDBNav.BtnClick(Index: TNavigateBtn);
begin
  inherited BtnClick(Index);
  if Index=nbDelete then
    if (MessageDlg('您确定要删除该记录吗?', mtConfirmation,mbOKCancel, 0) <> idCancel)
    then
      ShowMessage('您确定了!')
    else
      ShowMessage('您取消了!');
end;
-----------------------------------------------
你想改变提示信息,改用你的方法,应该在先自己处理,然后调用组件源方法:

把inherited BtnClick(Index);一句放到最后吧,就会先处理你的操作,然后调用父代的方法。

#17


学习