对于一般的将过程赋予给控件的单击大事件,相信大家都知道了,用form1.button1.onclick:=过程名就可以了,但是这有个前提就是这个过程必须是在form1所属的那我想问一下如果不想在form1中写这个过程有什么办法呢如果你没有听懂,我举个小例子有一个窗体form1,form1上有一个button1,然后我另建一个unit2单元,在里面有个过程aa,现在怎么可以将这个过程赋给button1.onclick,用form1.button1.onclick:=aa 不行,有谁知道,肯告诉我么

解决方案 »

  1.   

    use unit2
    比如是Tform2类
    在form1中先创建form2,再用下面的代码:
    button1.onclick:=form2.aa
    怎么会不行呢?
      

  2.   

    在unit1的implement后添加
    uses unit2
    然后
    button1.onclick:=form2.aa
    就行,主要是用在implement后添加uses unit2
    再试试……
      

  3.   

    button1.onclick:=form2.aaaa的参数必须是TObject类型的
      

  4.   

    use unit2
    button1.onclick:=form2.aa
    好使呀!
      

  5.   

    引用unit2单元,把aa定义在unit2的public里
    implementation
    uses unit2;
    {$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    begin
    unit2.Form2.aa;
    end;
    public
        { Public declarations }
        procedure aa;
    procedure TForm2.aa;
    begin
    showmessage('好使呀!')
    end;
      

  6.   

    没问题啊,不会吧,yuzhantao (找不到女朋友只好养条狗) 大虾,即使没有窗体只有unit2
    也可以的啊,您不是想散分吧?
      

  7.   

    unit2:
    procedure isright();implementationprocedure isright();
    begin
      showmessage('asd');
    end;unit1:
    uses unit2;procedure TForm1.Button1Click(Sender: TObject);
    begin
     isright();
    end;
      

  8.   

    我想是不是这样:unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TMainForm = class(TForm)
        Button1: TButton;
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      MainForm: TMainForm;implementation
    uses Unit2;{$R *.dfm}procedure TMainForm.FormCreate(Sender: TObject);
    var
      m: TMethod;
    begin
      m.Code := @a;
      m.Data := Button1;
      Button1.OnClick := TNotifyEvent(m);
    end;end.
    ///////////////////
    unit Unit2;interface
    uses Stdctrls, Dialogs;procedure a(Sender: TObject);implementationprocedure a(Sender: TObject);
    begin
      ShowMessage(TButton(Sender).Name);
    end;end.
      

  9.   

    忘记和各位说明了我是只建立了一个unit2单元,而没有建立对应窗体,2到7楼,用的方法都是有两个窗体时的办法,这个办法我知道,但我想知道如果没有form2的时候,怎么可以实现将过程赋给控件的单击事件呢?至于yiyilc(依依),首先声明,我不是大虾,只是小菜鸟,你的办法真不知道让我说什么了。
    我是想一个按钮可以实现几种功能,你的...哎,大家自己看吧。
    因为我的这个按钮是动态生成的,然后又指向了一个别的按钮(主要是因为那个按钮的图形好,而动态生成的按钮加载图片如果脱离了本机,就不行了,),因此要覆盖掉原来的单击事件,各位这次懂了么?
      

  10.   

    to xzgyb(老达摩),对不起,刚才发帖子时没有看到你的,你理解了我的问题,我一会试一下
    成功就给分
      

  11.   

    我试过了,aa在public单元声明绝对可以在form1中调用的,而不需要建立Form2窗体实例。
      public
        { Public declarations }
        procedure aa(sender:Tobject);
      

  12.   

    晕!!!我是要在unit2中调用啊,要不我还干吗加个unit2啊,直接在form1中写不就得了
      

  13.   

    另外xzgyb(老达摩)的办法我没有试,我想应该有别的方法,他的方法看起来不怎么好
      

  14.   

    to yuzhantao(找不到女朋友只好养条狗) :xzgyb(老达摩)的方法是正确的,没有理解你的意,报歉!
      

  15.   

    我有点问题想问的是,你为什么不把这个aa事件写在Form1呢,不管怎么做,在未分配Form2之前TForm2.aa函数体内的Self都是不正确的。如果你的aa没有用到Self,那么没有必要写在TForm2,写在Form1就可以了。
    如果你能够容忍TForm2.aa函数内的Self为Form1,那么改一下达摩师祖的方法可以,procedure TForm1.FormShow(Sender: TObject);
    var
      M: TMethod;
    begin
      M.Code := @TForm2.Button1Click;
      M.Data := Self;
      Button1.OnClick := TNotifyEvent(M);
    end;
    但是还是那一句,不如写在Form1。不知道说得清楚不清楚。
    最后补充的是,纯属个人意见,如果有错,不要扁我。
      

  16.   

    to  dbExpress(都是昵称惹的祸) 
    因为我在unit1单元里是一些别的功能,如果把这个也放进去,会给以后的维护增加很多麻烦另外我不会分配form2,只有 unit2。unit2只是负责一个单独功能的。确实,写在form1中就可以解决这个问题,但我想知道这个问题的解决办法
      

  17.   

    这和你写一个公用function 单元有何不同吗?你用过你的公用function 单元吗?
      

  18.   

    拿出我的百宝袋, 把xzgyb(老达摩) 收藏入去. 呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵!
    Good Source!
      

  19.   

    我是把过程定义写在了interface下面啊 在form1中可以访问unit2的各个过程,就这个不行
      

  20.   

    不错,因为Button的事件类型和一个普通的方法指针是不兼容的,因些你是没有办法赋值的。
    但是你为什么一定要创建一个单元呢。你可以在公共单元写一个公共的类,把原先你要写的方法定成这个类的方法不就可以了吗?我试了一下是没有问题的。这样岂不是简单的解决了这个问题,或者建个数据模板也可啊。
      

  21.   

    刚没看清,按你的要求xzgyb已经是种不错的方法了
      

  22.   

    查看相关底层代码,可知道你的现想法是不显示的调用GetDynaMethod是需要在寄存中填充VMT入口地址,然后才能在DMT中寻找相关方法
      

  23.   

    uses unit2Procedure TForm1.Button1Click(Sender: TObject);
    begin
      ......
      aa;
      ......
    end;