最好使用方法指针实现才能确保子窗体的通用性,即: 
1、在不同的父窗体中,定义相同的过程(参数类型、个数、顺序需要相同): 
    procedure ClickButton(HND: THandle; Str: String);    //Str表示父窗体的 EdttBox 的值 
2、在子窗体中定义方法指针: 
    private 
      ChildClick(HND: THandle; Str: String) of object; 
3、调用子窗体时,将子窗体的方法指针赋值为父窗体的 ClickButton: 
    FormChild.ChildClick := Self.ClickButton; 
4、在子窗体的点击事件中执行: 
    if Assigned(ChildClick) then 
    begin 
      ChildClick(Self.Handle, Str); 
    end; 这样就实现了在子窗体中执行父窗体中中的过程,实质是带入了一个函数指针,由子窗体执行父窗体的过程, 
HND参数表示父窗体的句柄(Handle)
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
怎么编译不了啊.....

解决方案 »

  1.   

    FormChild.ChildClick := Self.ClickButton; 这两个参数都不一样,怎么能编译的过去。按钮click只有一个参数Sender: TObject没看明白你费这么大劲想干吗?如果在子窗体中执行父窗体过程,直接执行就可以啊
    MainForm.xxxx;或者向父窗体发送一自定义消息,父亲收到消息后就执行xx过程。
      

  2.   

    指针是引用地址。不可乱用。对于窗体事件,delphi也是有严格意义上的定义。有明确的参数。建议多看原程序。 
      

  3.   

    可以把参数消化掉
    HND: THandle;——其实self就是了
    Str: String——可以固定放在一个子窗体的特定属性里
    这样,函数就不要参数了
      

  4.   

    我是不知道方法指针 应该怎么写 
    这样吗type
      TForm2 = class(TForm)
      private
        ChildClick(HND: THandle; Str: String) of object;
      end
      

  5.   

    ChildClick(HND: THandle; Str: String) of object;
    你管这个叫指针?
      Type   
      TChildClick=Procedure(HND: THandle; Str: String)    Of   Object;    TForm2 = class(TForm) 
      private
         FChildClick:TChildClick;
      end;
      

  6.   

    是这样写吧?  好像 Form2  没有执行Form1的ClickButton啊procedure TForm1.Button4Click(Sender: TObject);
    begin
      Form2.FChildClick:=Self.ClickButton;
      Form2.ShowModal;
    end;
    procedure TForm1.ClickButton(HND: THandle; Str: String);
    begin
    ShowMessage('123');
    end;
    >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>unit Unit2;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TChildClick=Procedure(HND: THandle; Str: String)    Of  Object;
      TForm2 = class(TForm)
        Button1: TButton;
        procedure ChildClick(HND: THandle; Str: String);
        procedure Button1Click(Sender: TObject);
      private
      public
        { Public declarations }
        FChildClick:TChildClick;
      end;var
      Form2: TForm2;implementation{$R *.dfm}procedure TForm2.Button1Click(Sender: TObject);
    begin
      @FChildClick := Self.MethodAddress('ChildClick');
     if Assigned(FChildClick) then
        FChildClick(Self.Handle,'Hello world');end;procedure TForm2.ChildClick(HND: THandle; Str: String);
    begin
    ShowMessage(Str);
    end;end.
      

  7.   

    类的方法,在类里面定义,就不用of object了;
    在独立定义时,才需要加上of object以示区别(与普通的函数)。{@这个不需要的了}FChildClick := Self.MethodAddress('ChildClick'); 
      

  8.   

    到底是要 Form2.FChildClick = Form1.ChildClick 还是 Form2.ChildClick?先想好了再写,一句 Form2.FChildClick := Form1/Form2.ChildClick 就够了
      

  9.   

    方法1,子窗体创建的时候把父窗体的handle传递进去,这种方法要求这些窗体在一个exe内,有在dll中不行。
    procedure ChildCreate(Hnd: THandle);
    begin
    with TChildForm.create(nil) do
    begin
      try
        ParentHnd := Hnd;
        ShowModal;
      finally
        Free;
      end;
    end;procedure TChildForm.btnclick(Sender: TObject);
    begin
      (FindControl(ParentHnd) as TParentForm).xxxx;
    end;方法2。使用回调函数,和你这个思路差不多,把参数做一致就可以了。
      

  10.   

    我现在只希望能编译执行就好了,怎么样才能点击form2的Button1Click ,执行form1的ClickButton  即 ShowMessage('123')呢
      

  11.   

    方法指针听起来不像Delphi
    嘿嘿,
    这个handle的参数不需要吧?
    既然要调用的是父窗体的过程而handle也是父窗体的,是另一个父窗体的句柄?
    如果不需要
    那可以用
    Form2.Button1.OnClick := Form1.Button1Click;