用这种方法可以实现,但为了动态优化需要换成另外一种方式procedure TfrmMain.bsSkinSpeedButton2Click(Sender: TObject);
.......
begin
  .....
  GpItem.OnClick :=aa();
end;procedure TfrmMain.aa(Sender: TObject);
begin
    ......
    fme:=TfmeStoreSet.Create(application);  //TfmeStoreSet 是bpl中的一个frame ,这样调用可正常运行
    .....
end;但这种方法如何实现procedure TfrmMain.bsSkinSpeedButton2Click(Sender: TObject);
.......
begin
  .....
  GpItem.OnClick :=aa('XX',TfmeStoreSet);
end;procedure TfrmMain.bb(var sString;var tf:TFrame);
begin
    .....
    CreateTabSheet.caption:=s;
    fme:=tf.Create(application);
    ...
end;

解决方案 »

  1.   

    其实就是怎样把参数传递给onclick函数
      

  2.   

    根本是两回事。aa('XX',TfmeStoreSet); 是函数调用。GpItem.OnClick :=aa(); 是指针赋值。
      

  3.   

    有点乱...楼主要的是不是这么个意思:
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type  T1 = class(TPersistent)
      end;  T2 = class(TPersistent)
      end;  TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
        procedure CreateByClassName(cName: string);
        procedure FormDestroy(Sender: TObject);
        private
          FC: TPersistentClass;
          FO: TPersistent;
      end;var
      Form1: TForm1;implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject);
    begin
      Self.CreateByClassName('T2');
    end;procedure TForm1.CreateByClassName(cName: string);
    begin
      if Assigned(FO) then FreeAndNil(FO);
      FC := GetClass(cName);
      FO := FC.Create;
      Showmessage(FO.ClassName);
    end;procedure TForm1.FormDestroy(Sender: TObject);
    begin
      if Assigned(FO) then FreeAndNil(FO);
    end;initialization
      RegisterClass(T1);
      RegisterClass(T2);
    finalization
      UnRegisterClass(T1);
      UnRegisterClass(T2);end.
      

  4.   

    把4楼代码修改了一下。不过,不知道楼主是不是要这种效果。
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type  T1 = class(TPersistent){类型1}
        class procedure proc;
      end;  T2 = class(TPersistent){类型2}
        class procedure proc;
      end;  TM = procedure of object;  TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
        procedure CreateByClassName(cName: string);
        procedure FormDestroy(Sender: TObject);
        private
          FO: TPersistent;
      end;var
      Form1: TForm1;implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject);
    begin
      Self.CreateByClassName('T1');{测试用类名T1构造对象}
      Self.CreateByClassName('T2');{测试用类名T2构造对象}
    end;procedure TForm1.CreateByClassName(cName: string);
    var
      M: TMethod;
      C: TPersistentClass;
    begin
      if Assigned(FO) then FreeAndNil(FO);
      C := GetClass(cName);
      FO := C.Create;
      Showmessage('对象构造自' + FO.ClassName + '类');
      M.Code := C.MethodAddress('proc');
      M.Data := C;
      TM(M)();//执行相应的类方法
    end;procedure TForm1.FormDestroy(Sender: TObject);
    begin
      if Assigned(FO) then FreeAndNil(FO);
    end;{ T1 }class procedure T1.proc;
    begin
      Showmessage('T1类的proc方法被执行');
    end;{ T2 }class procedure T2.proc;
    begin
      Showmessage('T2类的proc方法被执行');
    end;initialization
      RegisterClass(T1);
      RegisterClass(T2);
    finalization
      UnRegisterClass(T1);
      UnRegisterClass(T2);end.
      

  5.   

    谢谢楼上的朋友给我的提示,问题搞定了,如下:
    用onclick调用一个Function,传递过去,并使用
       TFrame(TCustomFrameClass(GetClass('TfmeStoreSet')).Create(self));
    解决问题,谢谢大家