注册 登录
编程论坛 VFP论坛

咨询运行时控件复制的问题

laowan001 发布于 2022-10-26 10:14, 735 次点击
表单中有个自有控件(VCX),想在程序运行时复制该控件,从而实现动态添加一个新控件
查帮助有个Object.CloneObject(NewName),但只能在设计时用,不支持运行时使用
不知能否实现上面的想法,请各位高人指点,先谢了
9 回复
#2
hu9jj2022-10-26 10:37
动态新增控件恐怕很难做到,因为相当于是修改程序,我们知道VFP程序是需要进行伪编译后才能运行的,所以在运行阶段不容易做得到。但我们可以转换思路,先添加有限的若干个控件,把暂时不用的控件隐藏起来,需要时再让它显示出来,效果可能差不多的。
#3
foxfans2022-10-26 11:08
动态增减控件很简单,也常用,不然碰到一次要加载几百个控件手工一个个加是要命,下面一小段代码可以参考,可以通过 left top 任意的放不同位置。 comb1 可以 用宏替换来代替 comb+trans(i)  comb1 2 3 4 循环增加.

LOCAL cComb
cComb=""
FOR i=1 TO 10
    cComb="comb"+TRANSFORM(i)
    IF VARTYPE(_screen.&cComb.)<>"O"
      _screen.AddObject(cComb, "myFunc")
      _screen.&cComb..top=i*20
    ENDIF
ENDFOR

RETURN

DEFINE CLASS myFunc as ComboBox
    Visible = .T.
    RowSourceType = 1
    RowSource = "a,b,c,d"
    PROCEDURE init
        BINDEVENT(this,"interactivechange",this,"myclick")  &&可以放在表单的自定义属性里thisform.xxx()
    ENDPROC
    PROCEDURE interactivechange
        *!* 这里可以写其它逻辑
    ENDPROC
    PROCEDURE myclick
        MESSAGEBOX(this.Value,this.Name,64)
    ENDPROC
ENDDEFINE

[此贴子已经被作者于2022-10-26 11:23编辑过]

#4
laowan0012022-10-26 11:48
回复 3楼 foxfans
感谢回复
由于用的是第三方控件,已经封装好了,所以没法用DEFINE CLASS myFunc as ComboBox声明,这种情况下这种方法好像有点不好使了
#5
laowan0012022-10-26 11:48
回复 2楼 hu9jj
感谢回复
这确实是个思路,我先试试,再次感谢
#6
厨师王德榜2022-10-26 11:57
以前帮别人做考试系统时,有类似的需求,代码一时找不到了,说一下大致流程
考试试卷自动生成流程 ,一次考试 大概有 1,单选题  2,多选题 3,填空题 ... 假设有三种题型
先 生成3个随机数组,分别代表这几种题型, 根据随机数组,连接远程题库服务器,在服务器题库 中,随机抽取题目...关闭连接.
然后,进入试卷生成环节:
不管哪种题型,每道题的可选项都有可能不同,比如单选,有的是3选1,有的是4选1,
多选题,供选项的数量,每题也不同,
填空题,每题要填的空也可能不同,有的是填2空,有的填3空...
说了那么多,无非就是想说,程序对付这种开发需求,一定是可以解决的,必须用到动态生成控件,这是绕不过去的.
根据每题的 供选项的多少 ,程序 就循环生成 这些项目,
单选题,就在 表单上 生成 一个单选框, 可选项的数量临时由程序决定.
多选题,就在 表单上 生成 N个复选框, 可选项的数量临时由程序决定.
填空题,就在 先是题干描述,加2个回车,后面就生成N个Text框 , 数量临时由程序决定.

最后,是几个按钮: 上一题 /下一题 /交卷 , 这几个按钮的出现位置, 也是根据每套试卷的题量的不同,
出现的位置不一样,也需要动态生成.
#7
sam_jiang2022-10-26 13:10
回复 4楼 laowan001
createobject不行吗?
#8
laowan0012022-10-26 14:31
回复 7楼 sam_jiang
感谢回复,我试下
#9
laowan0012022-10-26 14:33
回复 6楼 厨师王德榜
感谢大厨回复,思路明白了,对应具体应用我再想想
#10
laowan0012022-10-27 11:51
回复 7楼 sam_jiang
方法可行,谢谢啦
1