回 帖 发 新 帖 刷新版面

主题:动态生成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个回复)

11 楼

在表单中新建方法:mybindevent
LPARAMETERS mLocalControl,lAdd
IF PARAMETERS()#2 OR VARTYPE(mLocalControl)#"O" OR VARTYPE(lAdd)#"L"
    MESSAGEBOX("参数错,应是两个,第一为对象,第二个为逻辑型",64,"提示信息")
    RETURN
ENDIF

*动态添加右键功能,mLocalControl为控件,lAdd值为.T.添加绑定事件,.F.为取消绑定事件
          IF VARTYPE(oHandlerRight)#"O"  &&如果不是对象就重声明
              PUBLIC oHandlerRight
              oHandlerRight=NEWOBJECT("myhandler","prgrightclick.prg")
           ENDIF
    
DO CASE
    CASE INLIST(UPPER(mLocalControl.BaseClass),"TEXTBOX","EDITBOX","COMBOBOX")   
        UNBINDEVENTS(mLocalControl,"Rightclick",oHandlerRight,"MyRightclick") &&先解除绑定
        IF lAdd
           BINDEVENT(mLocalControl,"Rightclick",oHandlerRight,"MyRightclick")  &&动态绑定,用了公用变量传递信息
        ENDIF    
    
    CASE  mLocalControl.Baseclass="Grid"
      IF mLocalControl.ColumnCount>0
          FOR i=1 TO mLocalControl.ColumnCount
             mGridCurControl=EVALUATE("mLocalControl.Columns(i)."+mLocalControl.Columns(i).CurrentControl)
             UNBINDEVENTS(mGridCurControl,"RightClick",oHandlerRight,"MyRightClick")  &&有没有先删除
             IF ladd
                BINDEVENT(mGridCurControl,"RightClick",oHandlerRight,"MyRightClick")   &&动态绑定,用了公用变量传递信息
             ENDIF    
          ENDFOR
      ENDIF  
    
     CASE mLocalControl.BASECLASS = "Pageframe"
           IF mLocalControl.PageCount>0
                FOR j=1 TO  mLocalControl.PageCount
                    mFramControl=EVALUATE("mLocalControl."+mLocalControl.Pages(j).name)
                       IF mFramControl.ControlCount>0
                             FOR k=1 TO mFramControl.ControlCount
                                 mPageControl=EVALUATE("mFramControl."+mFramControl.Controls(k).Name)
                                   IF INLIST(UPPER(mPageControl.BaseClass),"GRID","CONTAINER","TEXTBOX","EDITBOX","COMBOBOX", "PAGEFRAME")           
                                      Thisform.mybindevent(mPageControl,ladd)  
                                   ENDIF  
                              ENDFOR
                       ENDIF     
                ENDFOR
           ENDIF      
    
    CASE  mLocalControl.Baseclass="Container"      
        IF mLocalControl.ControlCount>0
           FOR m=1 TO mLocalControl.ControlCount
              mConCurControl=EVALUATE("mLocalControl."+ mLocalControl.Controls(m).Name)              
               IF INLIST(UPPER(mConCurControl.BaseClass),"GRID","CONTAINER","TEXTBOX","EDITBOX","COMBOBOX", "PAGEFRAME")           
                 Thisform.mybindevent(mConCurControl,ladd)  
              ENDIF   
          ENDFOR
       ENDIF   

    CASE  mLocalControl.Baseclass="Form"
        IF  mLocalControl.ControlCount>0
           FOR n=1 TO mLocalControl.ControlCount
              mCurControl=EVALUATE("mLocalControl."+ mLocalControl.Controls(n).Name)               
              IF INLIST(UPPER(mCurControl.BaseClass),"GRID","CONTAINER","TEXTBOX","EDITBOX","COMBOBOX", "PAGEFRAME")           
                 Thisform.mybindevent(mCurControl,ladd)  
             ENDIF   
         ENDFOR
       ENDIF   
ENDCASE   

**********调用

Thisform.mybindevent(Thisform,.T.) &&动态添加右键系统菜单功能

Thisform.mybindevent(Thisform,.F.) &&动态取消右键右键系统菜单功能

12 楼


向你学习.新年好.

13 楼

谢谢!!!
高老师水平真高!!!
希望多抽时间,多出佳作!

我来回复

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