PB9.0动态生成控件

   在做毕业设计的时候,遇到了用复选框来显示数据库中的信息,但是数量不能确定。因此,需要减低程序显示时和数据库的耦合度,让程序自己可以根据数据库的记录的信息数量变化自动适应。基于该需求用到了动态生成控件。还是和之前一样,知识内容都是一样的,只是在使用的细节上的区别。

需求

    根据数据窗口中符合要求的数据库记录数和内容动态的创建复选框控件,放置于Tab control控件上。这样就可以很灵活的应对数据的变更。

动态创建控件的方法

    语法:windowname.OpenUserObject(userobjectvar{,x,y})

    参数:windowname:要在其上显示用户对象的窗口的名称

          userobjectvar:要显示的用户对象的变量,用于存储创建的控件

          x、y:用于确定控件相对窗体的位置,可选默认为0

遇到的问题

    1、数据窗口中没有数据

    像之前使用过的配置好数据窗口后,拖放的窗体上。在窗体的Open事件里写下如下代码:              

       dw_1.SetTransObject(SQLCA)
       dw_1.retrieve()

运行之后没有检索到数据,提示:UndefinedVariable:dw_1。出现这个问题的原因是因为我把dw_1放在了Tab控件上了。而如上的写法默认的parent是窗体,也就是这么写dw_1Tab控件是同级的。因此提示未定义的变量。所以其正确的写法应该改为:                  

         tab_set.tabpage_replace.dw_1.SetTransObject(SQLCA)
         tab_set.tabpage_replace.dw_1.retrieve()    

    2、无法将动态的控件放置到Tab控件上

     PB9.0只有窗体本身才有创建控件的方法而tab控件是无法创建的。因此,我们只能是通过窗体创建,然后移植到tab控件上。但是,PB9.0中并没有提供设置parent的方法。所以这里涉及到了一个API函数:SetParentAPI使用前需要声明,在Declare中的LocalExternl Functions中。此函数的定义在图片中了。

PB9.0动态生成控件_第1张图片

实例

    因为,关于控件最后输出的矩阵是几行几列的需要通过算法来确定,但是呢还没有弄好。暂时就先看看动态创建的实现吧。      

//根据数据窗口的课程信息动态创建复选框 
checkbox cbx_course[];   //定义checkbox类型的控件数组
 
int j
int i
for i=0 to 3
        for j = 1 totab_set.tabpage_replace.dw_1.RowCount()/4
             //创建控件,通过i、j控制输出位置
             w_set.openuserobject(cbx_course[4*i+j],"checkbox",(j*800)-700,300*i+100)     
             //根据课程名改变控件的text
             cbx_course[4*i+j].text=tab_set.tabpage_replace.dw_1.getitemstring(4*i+j,"Coursename")      
             cbx_course[4*i+j].visible=true  
             cbx_course[4*i+j].height=120         //默认时这两个都为0
             cbx_course[4*i+j].width=800

             //通过API将控件移动到Tab控件上
             setparent(handle(cbx_course[4*i+j]),handle(tab_set.tabpage_course.r_course))      
             cbx_course[4*i+j].backcolor=tab_set.tabpage_replace.backcolor
        next
Next

    动态创建控件就是这个样子了,但是关于如何确定ij还没有写完,另外没有数据时的错误处理之类的也没有做。等我做好了再来更改这部分的代码吧。

你可能感兴趣的:(其他)