回 帖 发 新 帖 刷新版面

主题:动态生成prg调用、动态绑定GRID的数据、动态绑定GRID的事件、动态添加TEXTBOX控件示例

看到网上多人求动态添加代码的方法。写了个简单的例子,
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个回复)

沙发

动态加入右键系统菜单图

[img]http://upload.programfan.com/upfile/200512061728742.rar[/img]

板凳

多谢指点

3 楼

高手就是你!

4 楼

徐老师就是高手

5 楼

非常好。谢谢。
我原先分不清海军和徐军,现在知道了:labxj0769是徐军。

6 楼

好技巧!谢谢了!下载学习一下!

7 楼

老师 确实厉害 真感谢您对我们耐心的解答

8 楼

真是高手,下来学习.

9 楼

如果不是动态绑定右键系统菜单就易,但以前建的表单有很多文本框或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 楼

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

我来回复

您尚未登录,请登录后再回复。点此登录或注册