设置首页  |   加入收藏  |  联系我们   
您的位置: 主页>程序设计>VFP>正文
VFP与EXCEL的动态数据交换技术
文章来源:  编辑:  发布时间:2007-12-12

DDE是所谓的“动态数据交换”。动态数据交换的操作 可视为两个应用程序在做“交谈”,当应用程序A要取得应用程序B 的数据时,A就必须要求B对话,此时A是所谓的“客户”,B是所谓的 “服务器”。只要B将数据准备好,便可以通过正常渠道传送给A。 所以一个完整数据所求的DDE过程可以由下列步骤建立:


*Sever及Client都必须处于启动状态。
*建立与服务器之间的交谈通道(连线)
*执行数据索求,或命令(交谈)
*退出交谈,关闭通道(离线)
下例中VFP与EXCEL的数据动态连接就是依据这一原则建立的。


1、建一数据库文件TREE.DBF,其中两个字段DW/C/20和DM/C/3
2、用VFP的表单向导建立一表单excel.scx
其中:
*********
FORM的LOAD EVENTS程序
*********
SET PROCEDURE TO A1
USE TREE
PUBLIC CHA
#DEFINE LINKMODE 2
RUN/N C:\Program Files\Microsoft Office\Office\EXCEL.EXE C:\BOOK.XLS

CHA=DDEINITIATE('EXCEL','SYSTEM')
IF CHA=-1
   WAIT WINDOWS 'EXCEL DDE 建立失败'
   CANCEL
ENDIF

=DDEEXECUTE(CHA,'[APP.ACTIV("FOXPRO",TRUE)]')
=DDETERMINATE(CHA)

CHA=DDEINITIATE('EXCEL','BOOK.XLS')
IF CHA=-1
   WAIT WINDOWS 'BOOK.XLS DDE 建立失败'
   CANCEL
ENDIF

GO BOTTOM
NO=RECN()
FOR I=1 TO NO
    GO RECORD I
    CELL='R'+ALLTRIM(STR(I,2))+'C1'
    =DDEPOKE(CHA,CELL,TREE.DW)

    CELL='R'+ALLTRIM(STR(I,2))+'C2'
    =DDEPOKE(CHA,CELL,TREE.DM)
NEXT

GO BOTTOM
NO=RECN()
FOR I=1 TO NO
    GO RECORD I
    CELL='R'+ALLTRIM(STR(I,2))+'C1'
    =DDEADVISE(CHA,CELL,'callback',LINKMODE)

    CELL='R'+ALLTRIM(STR(I,2))+'C2'
    =DDEADVISE(CHA,CELL,'callback',LINKMODE)
NEXT



************
退出按钮的CLICK EVENTS
************
=DDEENABLED(CHA,.F.)
=DDEEXECUTE(CHA,'[ERROR(FALSE)]')
=DDEEXECUTE(CHA,'[QUIT()]')
=DDETERMINATE(CHA)
RELEASE WINDOWS
USE
RETURN

**********
文本框DM1的VALID EVENTS
************
CELL='R'+ALLTRIM(STR(RECNO(),2))+'C2'
=DDEPOKE(CHA,CELL,THISFORM.DM1.VALUE)




另建一程序A1.PRG,其内容如下
**************************
PROC callback
*************************
PARAMETER lcChannel,lcAction,lcItem,lcData,lcFormat,lcStatus
SET TALK ON
SELE tree
ret_val=.F.
old_rec=RECNO()
IF EMPTY(lcItem)
   RETURN
ENDIF
IF LCaction = "ADVISE"
DO CASE
	 CASE lcItem="R1C1".OR.lcItem='R1C2'
        GO 1
        ret_val=.t.
        DO CASE lcItem
           case alltrim(lcItem)="R1C1"
                replace tree.dw with lcData
           case alltrim(lcItem)="R1C2"
                replace tree.dm with lcData
         ENDCASE
   CASE lcItem='R2C1'.OR.lcItem='R2C2'
        GO RECORD 2
        ret_val=.t.
        DO CASE lcItem
           case lcItem='R2C1'
                replace tree.dw with lcData
           case lcItem='R2C2'
                replace tree.dm with lcData
        ENDCASE
   CASE lcItem='R3C1'.OR.lcItem='R3C2'
        GO RECORD 3
        ret_val=.t.
        DO CASE lcItem
           case lcItem='R3C1'
                replace tree.dw with lcData
           case lcItem='R3C2'
                replace tree.dm with lcData
        ENDCASE
   CASE lcItem='R4C1'.OR.lcItem='R4C2'
        GO RECORD 4
        ret_val=.t.
        DO CASE lcItem
           case lcItem='R4C1'
                replace tree.dw with lcData
           case lcItem='R4C2'
                replace tree.dm with lcData
        ENDCASE
ENDCASE
ENDIF                
   GO OLD_REC
   show gets
   release link lc*
   RETURN RET_VAL


Tags:交换 技术 数据 动态 lcItem CHA CELL CASE lcData replace
Google
 
上一篇: 在VFP的AP中加入「扫图」的功能   下一篇: Visual FoxPro多媒体表单设计
【返回顶部】 【打印】 【大】 【中】 【小】 【关闭】

 我来说两句
用户名: 新注册) 密码: 匿名评论 [论坛讨论]
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
 相关文章
 热门文章

 
版权所有  2005-2006  Linux集中营  闽ICP备07500055号