Windows的DDE原理下面的程序把发送来的数据保存到ListBox中。 procedure Form1.OnDDEServerItemPokeData(Serder: TObject); begin ListBox1.Items := DDEServerItem1.Lines; end; 7.4.3 DDE服务器应用例程 下面我们创建一个DDE服务器例程和一个相应的DDE客户例程。 DDE服务器例程可以完成的工作有: 1.把DDE联接信息拷贝到剪贴板上供其它程序使用; 2.利用一个TMemo部件为其它程序提供数据源; 3.接收客户程序发送来的数据; 4.根据客户程序发送来的宏指令改变自身的运行状态。 服务器例程的设计界面如图。 图7.5 服务器例程设计界面 其中各部件的关键属性如下: DDESrvrForm.ActiveControl = Memo1 DDESrvrForm.Menu = MainMenu1 Bevel1.Align = alTop Memo1.Align = alClient DDETestItem.ServerConv = DDETestTopic 通过设置Bevel1、Memo1的Align属性,可以保证窗口大小变化时仍能有较为美观的屏幕显示。 Memo1是服务器的数据源,DDE项目部件DDETestItem通过Memo1的OnChange事件与Memo1 建立联系。 procedure TDdeSrvrForm.doOnChange(Sender: TObject); begin if not FInPoke then DDETestItem.Lines := Memo1.Lines; end; 其中FInPoke是一个布尔类型的私有数据成员,用于标志程序是否在处理客户程序的数据发送。当数据是由客户发送过来转存到数据源时,则没有必要再把数据传给DDE项目部件。 把联接信息拷贝到剪贴板,只需简单调用DDETestItem的CopyToClipboard方法。 procedure TDDESrvrForm.CopyClick(Sender: TObject); begin DDETestItem.CopyToClipboard; end; 这是通过菜单项Edit|Copy来调用的。 接收客户程序发送来的数据,是在DDETestItem的OnPokeData事件处理过程中。在接收过程中改变FInPoke的值,以阻止数据的无效反送。 procedure TDDESrvrForm.doOnPoke(Sender: TObject); begin FInPoke := True; Memo1.Lines := DDETestItem.Lines; FInPoke := False; end; 在DDE会话部件DDETestTopic的OnExecuteMacro事件处理过程中处理客户发送来的宏指令。我们共定义了五种可以响应的宏指令:CopyDDE、Clear、WS_Normal、WS_MINIMIZED、WS_MAXIMIZED,分别用于拷贝联接信息、清除Memo1中的内容以及改变窗口显示状态。 procedure TDdeSrvrForm.doMacro(Sender: TObject;Msg: TStrings); var Cmd: String; i: Integer; begin Cmd := ''; if Msg.Count = 0 then Exit; for I := 0 to Msg.Count-1 do begin Cmd := Msg.Strings[i]; if UpperCase(Cmd) = 'COPYDDE' then DDETestItem.CopyToClipboard else if UpperCase(Cmd) = 'CLEAR' then Memo1.text: = '' else if UpperCase(Cmd) = 'WS_NORMAL' then WindowState := wsNormal else if UpperCase(Cmd) = 'WS_MINIMIZED' then WindowState := wsMinimized else if UpperCase(Cmd) = 'WS_MAXIMIZED' then WindowState := wsMaximized else MessageDlg('Invalid Command',mtWarning,[mbOK],0); end; end; 下面的DDE客户程序,主要是为了验证上面的DDE服务器程序而设计的,但同时也提供了一个DDE客户程序设计的完整实例。程序设计界面如图。 图7.6 DDE客户程序的设计界面 程序把接收到的DDE数据保存在一个TMemo类部件DDEDat中,而欲发送给服务器的数据和宏指令在另一个TMemo类部件PokeDat中输入。两个按钮PokeBtn、ExecuteBtn用于发送数据和宏指令。两个菜单项File|New Link和Edit|Paste Link用于根据用户的输入建立新联接和从剪贴板上粘贴DDE联接。 DDE联接的建立通过调用SetLink方法实现。 建立新联接的实现代码如下。 procedure TFormD.doNewLink(Sender: TObject); begin DDEClient.SetLink (AppName.Text, TopicName.Text); DDEClientItem.DdeConv := DDEClient; DDEClientItem.DDEItem := ItemName.Text; end; 通过从剪贴板粘贴联接信息来建立联接的实现代码如下。 procedure TFormD.Edit1Click(Sender: TObject); var Service, Topic, Item : String; begin PasteLink1.Enabled := GetPasteLinkInfo (Service, Topic, Item); end; procedure TFormD.doPasteLink(Sender: TObject); var Service, Topic, Item : String; begin if GetPasteLinkInfo (Service, Topic, Item) then begin AppName.Text := Service; TopicName.Text := Topic; ItemName.Text := Item; DDEClient.SetLink (Service, Topic); DDEClientItem.DdeConv := DDEClient; DDEClientItem.DdeItem := ItemName.Text; end; end; 在DDEClientItem的OnChange事件处理过程中把接收到的事件保存在DDEDat中。 procedure TFormD.DDEClientItemChange(Sender: TObject); begin DDEDat.Lines := DDEClientItem.Lines; end; 数据发送的实现代码如下。 procedure TFormD.doPoke (Sender: TObject); var DDECli : TDDEClientConv; begin DDECli := DDEClientItem.DdeConv; if DdeCli <> nil then DDECli.PokeDataLines (DDEClientItem.DDEItem, PokeDat.Lines); end; 宏指令发送的实现代码如下。 procedure TFormD.doMacro (Sender: TObject); var DDECli: TDDEClientConv; Cmd: String; begin DDECli := DDEClientItem.DdeConv; if DDECli <> nil then begin Cmd := PokeDat.Text + #13#10; DDECli.ExecuteMacroLines (PokeDat.Lines, True); end; end; 运行以上两个程序,建立DDE联接。经测试,数据传输、数据发送和宏指令的发送与执行都达到预期要求。下面是两个程序同时运行后的屏幕显示。 图7.7 服务器和客户间的动态数据交换示例 7.4.4 小结 剪贴板和DDE是Windows下数据通信的两种方法。Delphi以简便、友好的方式实现了相应的功能,为用户编程提供了方便。一般说来,剪贴板多用于静态数据传输,而DDE用于动态数据交换、控制其它程序运行等场合。这些内容对于多用户环境下的程序开发是很重要的。 上一篇:校验码辅导讲座 下一篇:delphi中command/action的疑惑 更多相关文章
|
推荐文章
精彩文章
|