目前,多个窗体里都是用到了一个Panle,该Panle里放置了按钮,输入框等等。
为了代码的可重用性,想把这个panel封装成一个自定义组件。
请问应该怎么做?
本人属于Delphi新手,没定制过可视化组件,请重点将一下步骤。谢谢。

解决方案 »

  1.   

    如果只是这样的话用Frames就应该可以了吧
      

  2.   

    从panel继承,然后内部创建button,parent设置为panel
      

  3.   

    可以在你的工程内新建一个Form,上边放置你要的Panel、Button、Label等等控件,
    然后在你的工程中,需要这个模块的地方动态生成
      

  4.   

    我是想如2楼那样去实现。
    4楼的方法,我用不了。因为项目已经进行了一半,那样移植起来很麻烦。
    正在试验用Frame的方法。
      

  5.   

    用Frame类实现了出了界面,但现在又了一个问题,比如这个Frame类里的某个按钮的触发函数为OnClick。
    有一个窗体,放置了一个这种Frame类的控件,此时该控件的OnClick需要调用到窗体的某个函数search。
    问题是:该窗体如何往被调用的Frame类的控件里传入search函数。
    初写delphi,不知道有没有函数指针的概念。
    以前用Python定制控件时非常爽,可以直接将函数当参数往控件里传。
      

  6.   

    接管Frame里面按钮的Onlick事件就可以了啊,在窗体里声明:procedure ThisOnClick(Sender: Tobject);然后在FormShow事件里写:Frame.Button1.OnClick:= ThisOnClick;
    然后实现ThisOnClick:
    procedure ThisOnClick(Sender: TObject);
    begin
       Search();
    end;
      

  7.   

    如下图:
    有个窗体Form1使用了我定制的Frame类型控件FramePageNum,里面有很多个按钮。当然那些按钮的触发函数都是在该FramePageNum类里实现的,尽管它们的实现各种各样,但它们有一个共同点,都需要调用窗体的一个函数Form1.search。
    不能用楼上说的重载方式,比如按钮“GO”的触发函数:
    procedure TFramePageNum.btnQueryGoClick(Sender: TObject);
    begin
      ......
      //Search();
      ......
    end;
    search前后还有大量的代码,是用来控制FramePageNum里各个控件的行为的(如改变按钮上的页码),因为search的位置在中间,没办法重载。
    所以,我希望是把Form1.Search过程传入FramePageNum中。
      

  8.   

    问题是,Frame里的Onlick不仅仅只有search这一句代码啊。
      

  9.   

    反绑定就可以了呀,先在Frame里面设置一个事件变量,再在Form里面绑定这个事件变量就可以了。
    譬如说:TSearchEvent = procedure (keyWord:String) of TObject;
    TYourFrame=...
    ...
      procedure Button1Click(Sender: TObject); //Frame的按钮点击处理函数
    public
      OnSearch: TSearchEvent;                  
    ...
    end;
    ...
    TYourFrame.Button1Click(Sender: TObject);
    begin
        //前期处理的代码
        if Assigned(OnSearch) then
        begin
           OnSearch(XXX);
        end;
        //后续处理代码
    end ;
    而在主Form中则需要设置Frame中的事件句柄。TYourForm=class...
       ...
       yourFrame: TYourFrame;
       ...
       procedure search(keyWord: String);
    end;
    ...
    //这个是主窗体的方法
    TYourForm.search(keyWord: String);
    begin
      ...
    end ;TYourForm.onCreate(sender: TObject);
    begin
      yourFrame.onSearch:=self.Search; //将此方法绑定到frame中。
    end ;
      

  10.   

    感谢楼上的正确解决方法。
    自从2楼那里得到用Frame做的提示后,我就想用函数指针的方法来做,可惜知识浅薄,在声明函数指针是缺少了“of TObject”,导致编译不过去。昨天下班后,根据编译信息,google了一下,加上了"of TObject",成功实现了当初的目的。
    今天早上本来想结贴的,一直忙着移植了。看到你热心的回复,我很高兴。
    结贴散分。