type
datasetauto=class(TObject)
private
  inserteventclick,editeventclick,posteventclick,canceleventclick,deleteeventclick:Tnotifyevent;
  binsert,bedit,bdelete,bcancel,bpost:TButton
  procedure initialbutton(AButton:TButton;ADataState:DataState);
  procedure p_b_insert(Sender:TObject);  procedure p_b_edit(Sender:TObject);
  
  procedure p_b_delete(Sender:TObject);
  
  procedure p_b_cancel(Sender:TObject);
  
  procedure p_b_post(Sender:TObject);
    
end;
procedure DataSetAuto.InitialButton(AButton:TButton;ADataState:DataState);
begin
  if not assigned(Abutton) then
  begin
    ShowMessage('button设置不对');
    Abort;
  end;
  if ADataState=sInsert then
  begin
    InsertEventClick:=AButton.OnClick;
    AButton.Enabled:=True;
    AButton.Tag:=c_insert;
    AButton.OnClick:=p_b_insert;
  end
  else if ADataState=sEdit then
  begin
    EditEventClick:=AButton.OnClick;
    AButton.Enabled:=True;
    AButton.Tag:=c_edit;
    AButton.OnClick:=p_b_edit;;
  end
  else if ADataState=sDelete then
  begin
    DeleteEventClick:=AButton.OnClick;
    AButton.Enabled:=True;
    AButton.Tag:=c_delete;
    AButton.OnClick:=p_b_delete;
  end
  else if ADataState=sPost then
  begin
    PostEventClick:=AButton.OnClick;
    AButton.Enabled:=false;
    AButton.Tag:=c_post;
    AButton.OnClick:=p_b_post;
  end
  else if ADataState=sCancel then
  begin
    CancelEventClick:=AButton.OnClick;
    AButton.Enabled:=false;
    AButton.Tag:=c_cancel;
    AButton.OnClick:=p_b_cancel;
  end;end;              
procedure DataSetAuto.p_b_cancel(Sender: TObject);
begin
  CancelEventClick(Sender);
  binsert.Enabled:=true;
  bedit.Enabled:=true;
  bdelete.Enabled:=true;
  bcancel.Enabled:=false;
  bpost.Enabled:=false;
end;procedure DataSetAuto.p_b_delete(Sender: TObject);
begin
  DeleteEventClick(Sender);
end;procedure DataSetAuto.p_b_edit(Sender: TObject);
begin
  EditEventClick(Sender);
  binsert.Enabled:=false;
  bedit.Enabled:=false;
  bdelete.Enabled:=false;
  bcancel.Enabled:=true;
  bpost.Enabled:=true;
end;procedure DataSetAuto.p_b_insert(Sender: TObject);
begin
  InsertEventClick(Sender);
  binsert.Enabled:=false;
  bedit.Enabled:=false;
  bdelete.Enabled:=false;
  bcancel.Enabled:=true;
  bpost.Enabled:=true;  
end;procedure DataSetAuto.p_b_post(Sender: TObject);
begin
  PostEventClick(Sender);
  binsert.Enabled:=true;
  bedit.Enabled:=true;
  bdelete.Enabled:=true;
  bcancel.Enabled:=false;
  bpost.Enabled:=false;
end;我先把某个button 传进来。
当我在实际使用的时候
把我的方法再原来事件基础上加上
但一点击 某一个button 就会提示空地址错误
求助了!

解决方案 »

  1.   

    是在一个事件中依据传入的button 模拟binsert,bedit,bdelete,bcancel,bpost击键吗
      

  2.   

    是在一个事件中依据传入的button和ADataState 模拟binsert,bedit,bdelete,bcancel,bpost击键吗?
      

  3.   

    我在使用的时候。 就是在一个form上。放五个button我想把这五个button 传进我的类中然后实现的一些规则 比如 点击 binsert  保存和取消的按钮就可用.其它不可用调用的时候就是。datasetauto 先实例化。然后使用 initialbutton(Abutton:Tbutton;ADataState:DataState);比如我要把 窗体上btn_insert 传进来先把它传来的click事件指针保存。然后 写一个事件函数。将原来事件与我的代码结合再赋值 给btn_insert.onclick在我实现这些步骤之后。 我点击 btn_insert的时候。弹出内存错误 。提指向的地址是空值 。就是说原来我保存下来的btn_insert.onclick没有保存下来
      

  4.   

    Access violation at address 00000000. Read of address 00000000
      

  5.   

    建议你看一看DBNav的源代码,就明白了。
      

  6.   

    你有dbnav的源代码。给我发一份么[email protected]
      

  7.   

    unit exe_SJCDVVVV_01_01;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
        event_click:TNotifyevent;
        procedure p_click(Sender:TObject);
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.DFM}{ TForm1 }procedure TForm1.p_click(Sender: TObject);
    begin
      event_click(Sender);
      showmessage('a');
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      showmessage('a');
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      event_click:=button1.OnClick;
      button1.OnClick:=p_click;
    end;end.
     
    同样的方法。在form里实现就没有问题
      

  8.   

    我估计调用在执行EditEventClick:=AButton.OnClick;赋值的时候AButton.OnClick就是一个空指针,所以在调用EditEventClick(Sender);你又没有检查EditEventClick是否空指针所以导致出错,你可以跟踪进去查一下,由于你没有主程序,所以看不出你调用DataSetAuto.InitialButton时候AButton.OnClick是否空指针。
      

  9.   

    并不是空指针因为我是把实际的button传进去的它的onclick是有地址了。我查了