|
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
|