主题:动态生成prg调用、动态绑定GRID的数据、动态绑定GRID的事件、动态添加TEXTBOX控件示例
labxj0769
[专家分:21070] 发布于 2006-02-08 18:57:00
看到网上多人求动态添加代码的方法。写了个简单的例子,
1、 动态生成prg程序
可用STRTOFILE()生成PRG,或FCREATE(),或COPY TO
或select... from 表 into ...
2、执行前先清除缓冲中的已编译PRG,
CLEAR PROGRAM &&清除缓冲中的已编译PRG
COMPILE prgtest.prg NODEBUG &&重新编译
3、动态绑定事件及动态加入TEXTBOX控件,须先打开表。
4、动态添加控件用Addobject()不及newobject()好用,前者先打开类库,还要释放类库。
*用Addobject时才用,因此不如用Newobject
* cClassName=SYS(5)+SYS(2003)+"\myclass.vcx"
* SET CLASSLIB TO "&cClassName" ALIAS myclass ADDITIVE
* 对象.Addobject("text2","mytext","myclass")
对象.Newobject("text2","mytext","myclass") &&增加text2,可加动态生成PRG,在PRG中声明类
将动态生成PRG和动态添加控件结合 .
对象.text2.Visible=.T. &&此句重要,我刚做时,没想到对象创建时默认为.F.,查了很久才查出来********
动态添加控件后,也就动态添加了按ENTER键的方向,按右键调用系统的复制、剪切、粘贴功能
SHIFT+鼠标左键实现表格的动态拖放数据交换。我只写的同类数据交换。如须要可自己写多几种转换。
5、动态绑定事件用 BINDEVENT(),可与动态生成prg程序结合用。
6、连编EXE时,先在VFP环境下生成PRGTEST.PRG,并点主界面的《本界面调用PRG》编译PRG,再将动态生成
的PRG选中排除。连编EXE后,也不用复制过去。用完退出时删除动态生成的PRG。
7、示例中用了SYS(16,1)和PROGRAM(2)不用传递参数可知是哪个键调用PRG
我是在VFP9所做,只要EXE文件和VFP9的运行库就可运行。
以上有些功能可能在以前版本不支持,须大家试后改动。
徐 军 2005/12/03
[color=FF0000][size=5]2006/02/08
修正版,请重新下载[/size]:[/color]
http://upload.programfan.com/upfile/200602081843955.rar
回复列表 (共13个回复)
沙发
labxj0769 [专家分:21070] 发布于 2005-12-06 17:37:00
动态加入右键系统菜单图
[img]http://upload.programfan.com/upfile/200512061728742.rar[/img]
板凳
linmfh [专家分:30] 发布于 2005-12-07 14:07:00
多谢指点
3 楼
sianfox [专家分:1930] 发布于 2005-12-08 20:15:00
高手就是你!
4 楼
友谊 [专家分:160] 发布于 2005-12-11 10:35:00
徐老师就是高手
5 楼
wjc1956 [专家分:140] 发布于 2005-12-12 08:20:00
非常好。谢谢。
我原先分不清海军和徐军,现在知道了:labxj0769是徐军。
6 楼
vfpjiangnan [专家分:620] 发布于 2005-12-16 10:57:00
好技巧!谢谢了!下载学习一下!
7 楼
ysq33 [专家分:10] 发布于 2005-12-16 17:59:00
老师 确实厉害 真感谢您对我们耐心的解答
8 楼
740401 [专家分:0] 发布于 2006-02-08 18:14:00
真是高手,下来学习.
9 楼
labxj0769 [专家分:21070] 发布于 2006-02-08 18:55:00
如果不是动态绑定右键系统菜单就易,但以前建的表单有很多文本框或GRID的格不固定要动态绑定右键系统菜单:
先建prgrightclick.prg
DEFINE CLASS myhandler AS Session
PROCEDURE MyRightclick
IF TYPE("_Screen.ActiveForm.ActiveControl")=="O"
LOCAL loActiveControl
m.loActiveControl = _SCREEN.ACTIVEFORM.ACTIVECONTROL
m.loActiveControl=objectname(m.loActiveControl)
IF !ISNULL(m.loActiveControl) AND VARTYPE(m.loActiveControl)=="O"
DEFINE POPUP EDIT_SHORT SHORTCUT RELATIVE FROM MROW(),MCOL()
DEFINE BAR _MED_UNDO OF EDIT_SHORT PROMPT "撤消(\<U)" ;
PICTRES _med_undo
DEFINE BAR _MED_REDO OF EDIT_SHORT PROMPT "重做(\<D)" ;
PICTRES _med_redo
DEFINE BAR 3 OF EDIT_SHORT PROMPT "\-"
DEFINE BAR _MED_CUT OF EDIT_SHORT PROMPT "剪切(\<T)" ;
SKIP FOR m.loActiveControl.sellength = 0 or !EMPTY(m.loActiveControl.passwordchar) ;
PICTRES _med_cut
DEFINE BAR _MED_COPY OF EDIT_SHORT PROMPT "复制(\<C)" ;
SKIP FOR m.loActiveControl.sellength = 0 or !EMPTY(m.loActiveControl.passwordchar) ;
PICTRES _med_copy
DEFINE BAR _MED_PASTE OF EDIT_SHORT PROMPT "粘贴(\<P)" ;
SKIP FOR empty(_cliptext) ;
PICTRES _med_paste
DEFINE BAR _MED_CLEAR OF EDIT_SHORT PROMPT "清除(\<A)" ;
SKIP FOR m.loActiveControl.sellength = 0
DEFINE BAR 9 OF EDIT_SHORT PROMPT "\-"
DEFINE BAR _MED_SLCTA OF EDIT_SHORT PROMPT "全部选定(\<L)"
ACTIVATE POPUP EDIT_SHORT
ENDIF
ENDIF
ENDDEFINE
10 楼
labxj0769 [专家分:21070] 发布于 2006-02-08 18:57:00
PROCEDURE objectname
LPARAMETERS m.loActiveControl
IF INLIST(UPPER(m.loActiveControl.BASECLASS),"TEXTBOX","EDITBOX","LISTBOX","COMBOBOX")
RETURN m.loActiveControl
ELSE
DO CASE
CASE m.loActiveControl.BASECLASS = "Grid"
m.loActiveControl = ;
EVALUATE("m.loActiveControl.Columns(m.loActiveControl.ActiveColumn)." + ;
m.loActiveControl.COLUMNS(m.loActiveControl.ACTIVECOLUMN).CURRENTCONTROL)
CASE m.loActiveControl.BASECLASS = "Container"
m.loActiveControl=m.loActiveControl.ACTIVECONTROL
objectname(m.loActiveControl)
CASE m.loActiveControl.BASECLASS = "Pageframe"
m.loActiveControl=m.loActiveControl.ACTIVECONTROL
objectname(m.loActiveControl)
OTHERWISE
m.loActiveControl=null &&其它情况就不用显示
ENDCASE
RETURN m.loActiveControl
ENDIF
ENDPROC
我来回复