比如toolbar,上面都有添加、修改、删除这几个按钮,各个按钮分别引同样的图片;再比如dbgrid,都是相同的样式,每次把那些property都设一遍太麻烦了
大量模块都需要这种相同的组件,有没有什么好办法把这种东西添到资源库或者什么东西里,每次只引用定制好?

解决方案 »

  1.   

    可以使用控件摸板
    选中一个控件之后,然后component里面的create component template
      

  2.   

    2楼的,是说把组件们都拖到frame上??
      

  3.   

    2楼是说把组件都拖到frame上,作为一个基类,然后别的界面都继承这个frame????
      

  4.   

    如果想作成基类的话,可以作成Form,给子类继承;不过我觉得作成Frame会好点,Frame就相当于一个控件,可以在不同的Form里直接重用(最简单的象Ok/Cancel按钮就可以这么做)。看你需要了。
      

  5.   

    找到了,delphi的解决方案就是用frame,1楼也是个解决方案,不过多人开发不方便,决定用frame了
    不过有个小问题,控件有大有小,frame初始老大一个,怎么让frame正好跟那个控件一样大?手拖?
      

  6.   

    最后个问题
    dbgrid的问题
    用frame中继承的dbgrid不能自己定制列,不允许修改
    and,我有个自动适应列宽的函数,需要dbgrid载入数据后才能调用,这个函数应该加在哪儿呢?
      

  7.   

    选中一个控件,把属性设置好,
    方法一:project | Add to Repository方法二:component | Create component template用的时候从指定的面板上拖下来
      

  8.   

    Frame一般用于一组控件的复用
    Repository和Component Template一般用于单个控件的多个实例的情况 
      

  9.   

    还是frame好,另外两种已经研究过了,不适用
    现在有些头痛的是frame有的事情做不到
    比如想实现显示时的dbgrid的dataset.active:=true,说我暴力引用,应该有办法解决吧?
      

  10.   

    用frame中继承的dbgrid不能自己定制列,不允许修改 
    and,我有个自动适应列宽的函数,需要dbgrid载入数据后才能调用,这个函数应该加在哪儿呢?
    ------------------------------------
    可以修改,只是如果你直接在拖下来的frame上改了东西后,会跟原始frame失去同步而已(解决方法是重新拖一次)。否则的话,会自动跟原始frame同步。函数加在frame里,可以作为dbgrid的一个事件,或者提供函数给外界调用。
    现在有些头痛的是frame有的事情做不到 
    比如想实现显示时的dbgrid的dataset.active:=true,说我暴力引用,应该有办法解决吧?
    ------------------------------------
    frame里提供个叫SetActive的函数来调用,那你改了dataset后,主程序不用跟着改。你把frame想象成一个控件就成了(c#里叫的用户控件,其实是同一个概念)
      

  11.   

    函数加在frame里,可以作为dbgrid的一个事件,或者提供函数给外界调用。 
    ---------------------------------------
    这个……作为dbgrid的什么事件?找不到什么frame的onshow事件,写在constructor里又不行,现在只好勉强写到dbgrid的onenter事件里了frame里提供个叫SetActive的函数来调用,那你改了dataset后,主程序不用跟着改。你把frame想象成一个控件就成了(c#里叫的用户控件,其实是同一个概念)
    ----------------------------------------
    这个有点不明白,想要的效果是dbgrid被show的时候dbgrid.datasource.dataset.active:=true;这句话写在template里,具体模块里就什么都不用写了
    “frame里提供个叫SetActive的函数来调用”,不是还是要具体模块中写一个frame.setactive?
      

  12.   

    这个……作为dbgrid的什么事件?找不到什么frame的onshow事件,写在constructor里又不行,现在只好勉强写到dbgrid的onenter事件里了
    ------------------------------------
    有多种解决方法:
    1、如果你的frame提供一个叫LoadToDBGrid的方法,那么你外界调用后就可以紧接着调用frame提供的另外一个方法AdjustColumnWidth(如果这个函数是写在frame里)。
    2、frame里提供一个onLoadDBGrid事件(参数为你那个DBGRID),然后在LoadToDBGrid里触发这个事件,在这个事件里调用AdjustColumnWidth函数(如果这个函数写在frame外)。不过需要覆盖下form的constructor,把这个事件动态关联到frame里。
    这个有点不明白,想要的效果是dbgrid被show的时候dbgrid.datasource.dataset.active:=true;这句话写在template里,具体模块里就什么都不用写了 
    “frame里提供个叫SetActive的函数来调用”,不是还是要具体模块中写一个frame.setactive?
    -------------------------------------
    你可以换种思路,假设frame.setgridactive就是执行dbgrid.datasource.dataset.active:=true,那么你在frame.show后,接着执行frame.setgridactive不就可以了?
      

  13.   

    我都是直接手动改的。有时候用FRAME后,出些问题。可能是自己用得少吧。
      

  14.   

    还是找不到frame的类似onshow的事件……
      

  15.   

    frame是没有onshow事件的,如果你的frame是自动创建并show出来的话,你把你的东西写constructor里就行了。如果不是的话,就象我说的,你手动show它出来之前,调用下frame里面的一个函数,这不就相当于OnShow了?要理解事件其实就是一个方法。其它请参看我上面的两个回帖。
      

  16.   

    我就为了少写几句代码,
    本来就是写在constructor里的,就是在这儿报暴力引用,我才问的
      

  17.   

    上面不是说了在frame里提供一个函数给外面调用? 这样就不存在什么"暴力引用"的问题。反正你把Frame也好Form也好,全部都视为对象来看,对象和对象间该怎样通讯,就怎样通讯。
      

  18.   

    问到现在我都有点不好意思了,还是没明白
    我的frame是直接拖到tabsheet上的,不是手动创建的,没有可以调用地方啊??
      

  19.   

    发现了另外的问题,把raizetoolbar做成frame,指望着往frame化后的toolbar上拖几个raizetoolbutton,发现不能拖呢
    看来frame后的模板也不是可以随意组合的