这是一个组件包装的一个Form,在同一个单元里


  TForm1 = class(TForm)
    btnMyButton: TButton;
    btnCancel: TButton;
  :
  :
  end;
  
  :
  :
  TMyCtrl = class(TComponent)
  private
    frmMyForm   : TForm1;
    :
    :  protected
    procedure doMySomethings;
  public
    constructor create(aowner: TComponent); override;
    destructor Destroy; override;
    procedure showMyForm;
  published
    :
  end;  :
  :
procedure TMyCtrl.showMyForm;
begin
  frmMyForm:=TForm1.Create(Application);
  try
    frmMyForm.ShowModal;
  finally
   frmMyForm.Free;
  end;
end;现在的问题是:
    在类TForm1中的btnMyButton的onclick事件中如何调用类TMyCtrl的成员:doMySomethings。要求是:
    1.不使用全局变量
    2.不使用动态指定事件

解决方案 »

  1.   

    只要你将这两个类的声明写到同一个单元中就可以了!!!这样写Delphi就默认这两个类是友员类了!!!
      

  2.   

    procedure TForm1.btnMyButtonClick(Sender : TObject);
    begin
      如何调用doMySomethings????????????????end;
      

  3.   

    这样使用的话,需要在btnMyButton的onclick事件函数中定义一个变量 a:TMyCtrl;但是又不适合你的要求,你再分析一下整个逻辑,减少耦合度。有个思路工参考:可以向TForm1中传递参数,处理完后返回一系列的值,避免交叉调用。
      

  4.   

    可事实上  TMyCtrl = class(TComponent)
      private
        frmMyForm   : TForm1;
        :
        :
    TForm1类是TMyCtrl类的一个成员
      

  5.   

    在tmyctrl中加成员如下
      click:tnotifyevent;
      procedure onclick(sender:tobject);procedure tmyctrl.create
    begin
      ....  
      click:=onclick;
      form1.button1.onclick:=click;
      ....
    end;proceudre tmyctrl.onlick(sender:tobject);
    begin
    ......
    end;
      

  6.   

    frmMyForm和 DoSomeThings同属TMyCtrl的成员,他们之间没有任何牵连的成分。TForm1和TMyCtrl是两个独立的类,它们之间唯一的关系是友元,不要混淆了对象和类的概念。
      

  7.   

    click:=onclick;
      form1.button1.onclick:=click;
    需在form1 create后调用
      

  8.   

    放在同一个单元是没错,
    但doMySomethings是TMyCtrl的实例方法,所以你通过类名称引用来调用的话,
    编译的时候是通不过的。解决的方法是把doMySomethings定义成类方法,就可以调用了,
    不过类方法中,只能调用类变量