Windows的DDE原理在人工模式下,OnOpen事件在调用OpenLink 方法时触发,OnClose事件在调用ColseLink方法时触发。 7.3.8 利用客户程序和Excel交换数据 下面我们建立一个DDE客户程序,并利用这一程序与Excel中的一个工作表交换数据。程序设计界面如图。 图7.2 客户程序示例设计界面 界面中包含一个DDE会话部件DDEClientConv1和DDE项目部件DDEClientItem1,用于建立和维护DDE联接;一个RadioGroup控件和其中的两个无线电按钮AutoRadio、ManualRadio,用于设置联接模式;一个GroupBox控件和其中的两个按钮RequestBtn和PokeBtn,用于控制数据的申请和发送,其中RequestBtn在自动模式下变灰;一个文本框Memo1用于保存DDE数据;一个按钮PasteBtn用于粘贴联接信息并建立DDE联接;另外一个按钮CloseBtn用于关闭系统。 设计时把DDEClientConv1的FormatChars属性置为True,这样可以保留服务器传来数据的显示格式;ConnectMode保留ddeAutomatic的缺省设置。 程序在类TForm1中定义了一个私有数据成员Automatic,用于标志联接模式;三个字符串数据成员DDEService、DDETopic、DDEItem用于记录联接信息。 窗口生成时进行变量和部件状态的初始化。 procedure TForm1.FormCreate(Sender: TObject); begin RequestBtn.Enabled := False; AutoRadio.Checked := True; Automatic := True; end; 当联接模式改变时,程序进行相应的处理。 自动模式转换为人工模式: procedure TForm1.ManualRadioClick(Sender: TObject); begin if Automatic then begin RequestBtn.Enabled := ManualRadio.Checked; DDEClientConv1.ConnectMode := ddeManual; Automatic := False; end; end; 人工模式转换为自动模式: procedure TForm1.AutoRadioClick(Sender: TObject); begin if not Automatic then begin RequestBtn.Enabled := ManualRadio.Checked; If (DDEService = '') or (DDETopic = '') then begin MessageDlg(' Can not Set Link.',mtWarning,[mbOK],0); Exit; end; DDEClientConv1.SetLink (DDEService, DDETopic); DDEClientItem1.DdeConv := DDEClientConv1; DDEClientItem1.DDEItem := DDEItem; DDEClientConv1.ConnectMode := ddeAutomatic; Automatic := True; end; end; 当从自动模式转换到人工模式,只需要简单修改相应属性即可;而从人工模式转换到自动模式,则需要调用SetLink重新建立联接,否则往往会引发一个DDE异常。 联接的建立采用从剪贴板粘贴联接信息的方式,这是最具有灵活性的一种方法。 procedure TForm1.PasteBtnClick(Sender: TObject); begin if GetPasteLinkInfo (DDEService, DDETopic, DDEItem) then begin DDEClientConv1.SetLink (DDEService, DDETopic); if Automatic then begin DDEClientItem1.DdeConv := DDEClientConv1; DDEClientItem1.DDEItem := DDEItem; end; end; end; GetPasteInfo是 DDEMan库单元中定义的一个函数,用于检测剪贴板上是否有联接信息并返回相应的DDE服务、主题和项目。 对于人工模式,必须由客户显式向服务器申请数据。在这种模式下DDE项目部件是多余的,接收到的DDE联接信息用一个字符串来记录。下面是实现代码。 procedure TForm1.RequestBtnClick(Sender: TObject); var TheData: PChar; begin If DDEItem = '' then begin MessageDlg('Can not Request Data',mtWarning,[mbOK],0); Exit; end; TheData := StrAlloc(79); DDEClientConv1.OpenLink; TheData := DDEClientConv1.RequestData(DDEItem); DDEClientConv1.CloseLink; if TheData <> nil then Memo1.Text := StrPas(TheData); StrDisPose(TheData); end; OpenLink、CloseLink方法用于打开和关闭联接。RequestData方法向服务器申请数据并返回到一个PChar字符串中。字符串必须显式分配内存并在退出时释放。 数据发送在不同联接模式下是不同的。对于人工模式,增加了联接的打开和关闭操作。程序清单如下。 procedure TForm1.PokeBtnClick(Sender: TObject); begin If DDEItem = '' then begin MessageDlg('Can not Poke Data.',mtWarning,[mbOK],0); Exit; end; if Automatic then DDEClientConv1.PokeDataLines(DDEItem,Memo1.Lines) else begin DDEClientConv1.OpenLink; DDEClientConv1.PokeDataLines(DDEItem,Memo1.Lines); DDEClientConv1.CloseLink; end; end; 打开Microsoft Office中的Excel,装入一个文件,把相关的单元选中,拷贝到剪贴板上。而后运行程序,按下Paste Link按钮,DDE联接就建立起来,相关单元中的数据显示在Memo1中。之后可以进行模式转换、数据申请、申请发送等一系列工作。运行后的屏幕显示如下图所示。 图7.3 DDE客户和Excel交换数据 7.3.9 用客户程序控制程序管理器 下面的例子用客户程序向程序管理器发送命令,用于创建程序组、程序项以及删除程序组。 程序管理器提供了应用程序的DDE接口命令字符串,应用程序利用这些命令字符串可以实现以下的功能: 1.创建程序组 命令格式为: CreateGroup(程序组名[,程序组所在的路径]) 程序组不存在时进行创建;如程序组存在则按照指定的路径激活。 2.删除程序组 命令格式为: DeleteGroup(程序组名) 3.显示程序组 命令格式为; ShowGroup(程序组名,显示标志) 显示标志用于控制程序组在程序管理器中以极大、极小或正常方式显示。 4.重新装入程序组 命令格式为: ReLoadGroup(程序组名) 该命令使程序管理器先删除而后再重新装入一个已有的程序组。 5.向程序组中添加程序项 命令格式为: AddItem(命令行[,描述[,图标路径[,图标序号[,图标横坐标,图标纵坐标[,工作区目录[,热键[,是否最小化显示标志]]]]]]]) 上一篇:校验码辅导讲座 下一篇:delphi中command/action的疑惑 更多相关文章
|
推荐文章
精彩文章
|