当前位置:首页 > 网络编程 > 软件语言 > DELPHI > 剪贴板和动态数据交换(二)

剪贴板和动态数据交换(二)

点击次数:47 次 发布日期:2008-11-09 08:43:10 作者:源代码网
源代码网推荐
广告载入中

源代码网整理以下7.3.5 控制服务器应用程序的执行 

源代码网整理以下 客户程序控制服务器应用程序的一个方面是:必要的时候客户程序可以启动服务器程序,并装载会话主题。

源代码网整理以下 而客户程序控制服务器应用程序更重要的一点是向服务器发送服务器承认的宏命令,来完成对服务器应用程序的各种操作。服务器到底支持哪些宏命令,可参阅服务器应用程序文档。

源代码网整理以下 发送宏命令要使用DDEClientConv的两个方法 ExecuteMacro和ExecuteMacroLines ,它们的语法如下: 

源代码网整理以下function ExecuteMacro(Cmd: PChar; WaitFlag: Boolean): Boolean;

软件开发网 www.mscto.com

源代码网整理以下function ExecuteMacroLines(Cmd: TStrings;WaitFlag: Boolean): Boolean; 

源代码网整理以下 Cmd是欲发送的宏命令字符串或宏命令字符串链表。WaitFlag决定了在DDE 服务器程序执行宏命令时客户程序的行为。如果WaitFlag设置为True,则在服务器宏命令执行完毕前,不允许对ExecuteMacro、ExecuteMacroLines、PokeData、PokeDataLines这些方法的成功调用,它们都不向服务器发送数据并返回False。如果WaitFlag设置为False,则调用的方法在第一个宏执行完毕前即试图向服务器发送数据。

源代码网整理以下 WaitFalg的设置也取决于服务器应用程序。一些应用程序当在第一个宏执行完之前就试图向它发送数据或命令时,可能导致第一个宏执行失败或导致不可预料的后果。具体情况可查阅服务器应用程序文档。

源代码网整理以下 函数返回值表示命令串是否被成功传输。而宏命令执行是否成功客户是无法检测到的。 

源代码网整理以下7.3.6 格式化文本 

源代码网整理以下 DDEClientConv有一个布尔属性FormartChars,用于决定是否格式化文本。所谓格式化文本是指从传输来的文本数据中过滤掉BackSpace(8)、 Tab(7) 、Linefeed(10) 、Return(13)等字符。括号内是字符的ASCII码。许多时候这些字符将导致DDE客户数据显示的混乱。

源代码网整理以下  FormatChars的缺省值是False。 

源代码网整理以下7.3.7 响应DDE事件 

软件开发网 www.mscto.com

源代码网整理以下 部件DDEClientConv有两个事件OnOpen和OnClose,分别在DDE 会话建立和中止时触发。部件DDEClientItem有一个OnChange事件。这一事件常用于DDE项目数据的转储和显示,如(7.3.1)节所示。

源代码网整理以下 在自动模式下,OnOpen事件在包含DDEClientConv部件的窗口创建时触发,或在调用SetLink方法时触发,OnClose事件在客户程序或服务器程序关闭时触发。

源代码网整理以下 在人工模式下,OnOpen事件在调用OpenLink 方法时触发,OnClose事件在调用ColseLink方法时触发。 

源代码网整理以下7.3.8 利用客户程序和Excel交换数据    软件开发网 www.mscto.com

源代码网整理以下 下面我们建立一个DDE客户程序,并利用这一程序与Excel中的一个工作表交换数据。程序设计界面

源代码网整理以下 界面中包含一个DDE会话部件DDEClientConv1和DDE项目部件DDEClientItem1,用于建立和维护DDE联接;一个RadioGroup控件和其中的两个无线电按钮AutoRadio、ManualRadio,用于设置联接模式;一个GroupBox控件和其中的两个按钮RequestBtn和PokeBtn,用于控制数据的申请和发送,其中RequestBtn在自动模式下变灰;一个文本框Memo1用于保存DDE数据;一个按钮PasteBtn用于粘贴联接信息并建立DDE联接;另外一个按钮CloseBtn用于关闭系统。

源代码网整理以下 设计时把DDEClientConv1的FormatChars属性置为True,这样可以保留服务器传来数据的显示格式;ConnectMode保留ddeAutomatic的缺省设置。

软件开发网 www.mscto.com

源代码网整理以下 程序在类TForm1中定义了一个私有数据成员Automatic,用于标志联接模式;三个字符串数据成员DDEService、DDETopic、DDEItem用于记录联接信息。

源代码网整理以下窗口生成时进行变量和部件状态的初始化。 

源代码网整理以下procedure TForm1.FormCreate(Sender: TObject);

源代码网整理以下begin

源代码网整理以下RequestBtn.Enabled := False; 软件开发网 www.mscto.com

源代码网整理以下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;

软件开发网 www.mscto.com

源代码网整理以下end; 软件开发网 www.mscto.com

源代码网整理以下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);

软件开发网 www.mscto.com

源代码网整理以下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字符串中。字符串必须显式分配内存并在退出时释放。

源代码网整理以下 数据发送在不同联接模式下是不同的。对于人工模式,增加了联接的打开和关闭操作。程序清单如下。  软件开发网 www.mscto.com

源代码网整理以下procedure TForm1.PokeBtnClick(Sender: TObject);

软件开发网 www.mscto.com

源代码网整理以下begin

源代码网整理以下If DDEItem = " then 软件开发网 www.mscto.com

源代码网整理以下begin

源代码网整理以下MessageDlg("Can not Poke Data.",mtWarning,[mbOK],0);

源代码网整理以下Exit;

源代码网整理以下end;

源代码网整理以下if Automatic then

源代码网整理以下DDEClientConv1.PokeDataLines(DDEItem,Memo1.Lines) 软件开发网 www.mscto.com

源代码网整理以下else 软件开发网 www.mscto.com

源代码网整理以下begin

源代码网整理以下DDEClientConv1.OpenLink;

源代码网整理以下DDEClientConv1.PokeDataLines(DDEItem,Memo1.Lines);

源代码网整理以下DDEClientConv1.CloseLink;

源代码网整理以下end; 软件开发网 www.mscto.com

源代码网整理以下end; 

源代码网整理以下 打开Microsoft Office中的Excel,装入一个文件,把相关的单元选中,拷贝到剪贴板上。而后运行程序,按下Paste Link按钮,DDE联接就建立起来,相关单元中的数据显示在Memo1中。之后可以进行模式转换、数据申请、申请发送等一系列工作。运行后的屏幕显示如下图所示。

源代码网整理以下7.3.9 用客户程序控制程序管理器 

源代码网整理以下下面的例子用客户程序向程序管理器发送命令,用于创建程序组、程序项以及删除程序组。

源代码网整理以下 程序管理器提供了应用程序的DDE接口命令字符串,应用程序利用这些命令字符串可以实现以下的功能:

源代码网整理以下1.创建程序组

源代码网整理以下命令格式为:

源代码网整理以下CreateGroup(程序组名[,程序组所在的路径])

源代码网整理以下 程序组不存在时进行创建;如程序组存在则按照指定的路径激活。

软件开发网 www.mscto.com

源代码网整理以下2.删除程序组

源代码网整理以下命令格式为:

源代码网整理以下DeleteGroup(程序组名)

源代码网整理以下3.显示程序组

源代码网整理以下命令格式为;

源代码网整理以下ShowGroup(程序组名,显示标志)

软件开发网 www.mscto.com

源代码网整理以下 显示标志用于控制程序组在程序管理器中以极大、极小或正常方式显示。

源代码网整理以下4.重新装入程序组

源代码网整理以下命令格式为:

源代码网整理以下ReLoadGroup(程序组名) 软件开发网 www.mscto.com

源代码网整理以下 该命令使程序管理器先删除而后再重新装入一个已有的程序组。

源代码网整理以下5.向程序组中添加程序项

源代码网整理以下命令格式为:

软件开发网 www.mscto.com

源代码网整理以下 AddItem(命令行[,描述[,图标路径[,图标序号[,图标横坐标,图标纵坐标[,工作区目录[,热键[,是否最小化显示标志]]]]]]])

源代码网整理以下 命令行控制程序项的执行,可包括路径、参数等。其它参数分别对应在程序管理器中添加一个程序项时需要设置的参数和选项。它们都有缺省设置,因而是可选的。

源代码网整理以下6.替换程序组中的程序项

源代码网整理以下命令格式为:

源代码网整理以下ReplaceItem(程序项名)

源代码网整理以下 该命令删除一个程序项,并将所删除程序项的位置记录下来,以后通过AddItem在这个所记录的位置增加新项目。

源代码网整理以下7.从程序组中删除程序项

源代码网整理以下命令格式为:

源代码网整理以下DeleteItem(程序项名)

源代码网整理以下从当前活动程序组中删除一个程序项。

软件开发网 www.mscto.com

源代码网整理以下8.关闭程序管理器

源代码网整理以下命令格式为:

软件开发网 www.mscto.com

源代码网整理以下ExitProgram(是否保存程序组信息标志)

源代码网整理以下 从应用程序向程序管理器发送命令字符串的方法是基本一致的。为简便起见,在例程中只实现了其中仅包含一个字符串参数的情形,读者可以很容易作进一步的扩展。

源代码网整理以下 程序设计界面如图所示,包含一个DDE客户会话(DDEClientConv)部件和四个完成不同功能的按钮。

源代码网整理以下 DDEClientConv在设计时和程序管理器建立一个DDE会话,其中DDE服务器和DDE主题 都为PROGMAN。联接模式ConnectMode设置为ddeManual。 软件开发网 www.mscto.com

源代码网整理以下 我们把只有一个字符串参数的命令发送情况抽象出来,形成下面的SendMacro函数。 

源代码网整理以下function TForm1.SendMacro(Name: String;Command: String): Boolean;

源代码网整理以下var

源代码网整理以下Macro: String;

源代码网整理以下Cmd: array[0..255] of Char;

源代码网整理以下begin

源代码网整理以下Result := True;

源代码网整理以下if Name <> " then

源代码网整理以下begin

源代码网整理以下Macro := Format("[" Command "(%s)]", [Name]) #13#10;

源代码网整理以下StrPCopy (Cmd, Macro);

源代码网整理以下DDEClient.OpenLink;

源代码网整理以下if not DDEClient.ExecuteMacro(Cmd, False) then

源代码网整理以下Result := False;

源代码网整理以下DDEClient.CloseLink;

源代码网整理以下end;

源代码网整理以下end; 

源代码网整理以下 过程首先利用Format函数形成宏字符串:  软件开发网 www.mscto.com

源代码网整理以下Macro := Format("[" Command "(%s)]", [Name]) #13#10;  软件开发网 www.mscto.com

源代码网整理以下 而后把Pascal类型的字符串拷贝到一个程序管理器可接受的PChar类型字符串中。

源代码网整理以下 DDE联接采用人工模式。首先调用OpenLink方法。而后调用ExecuteMacro方法发送命令,如失败则返回False。最后用CloseLink关闭联接。 软件开发网 www.mscto.com

源代码网整理以下 三个按钮CreateButton、AddButton、DeleteButton分别用于创建程序组、添加程序项、删除程序组。它们的程序实现大同小异,如下所示。

源代码网整理以下创建程序组: 

源代码网整理以下procedure TForm1.CreateButtonClick(Sender: TObject);

源代码网整理以下var

源代码网整理以下Name: String;

源代码网整理以下begin

源代码网整理以下Name := InputBox("Input Box","Input Group Name",");

源代码网整理以下if Name = " then

源代码网整理以下MessageDlg("Group name can not be blank.", mtError, [mbOK], 0)

源代码网整理以下else

源代码网整理以下if SendMacro(Name,"CreateGroup") = False then 软件开发网 www.mscto.com

源代码网整理以下MessageDlg("Unable to create group.", mtInformation, [mbOK], 0); 软件开发网 www.mscto.com

源代码网整理以下end;

源代码网整理以下添加程序项: 

源代码网整理以下procedure TForm1.AddButtonClick(Sender: TObject);

源代码网整理以下var

源代码网整理以下Name: String;

源代码网整理以下begin

源代码网整理以下Name := InputBox("Input Box","Input Application full_Path name",");

源代码网整理以下if Name = " then

源代码网整理以下MessageDlg("Application name can not be blank.", mtError, [mbOK], 0)

源代码网整理以下else

源代码网整理以下if SendMacro(Name,"AddItem") = False then[page]

软件开发网 www.mscto.com

源代码网整理以下MessageDlg("Unable to Add Item.", mtInformation, [mbOK], 0);

源代码网整理以下end;

源代码网整理以下删除程序组: 

源代码网整理以下procedure TForm1.DeleteButtonClick(Sender: TObject);

源代码网整理以下var

源代码网整理以下Name: String;

源代码网整理以下begin

源代码网整理以下Name := InputBox("Input Box","Input Group Name to be Deleted",");

源代码网整理以下if Name = " then

源代码网整理以下MessageDlg("Group name can not be blank.", mtError, [mbOK], 0)

源代码网整理以下else

源代码网整理以下if SendMacro(Name,"DeleteGroup") = False then

源代码网整理以下MessageDlg("Unable to create group.", mtInformation, [mbOK], 0);

源代码网整理以下end;

7.4 DDE服务器程序的实现 

源代码网整理以下  DDE服务器程序响应DDE客户的请求,一般地它包含了客户程序希望获取的数据。

源代码网整理以下 创建一个DDE服务器程序,必须要把一个DDEServerItem部件添加到窗体中。DDEServerItem的text或Lines属性包含了要联接的数据。一般地 DDEServerItem部件又和另一个文本控件相联系。当文本控件中的内容变化时则更新DDEServerItem 的text或Lines属性的值。下面的一段程序把DDEServerItem和一个列表框相联系。这一联系是在列表框的OnChange事件中实现。 

源代码网整理以下procedure Form1.OnListBoxChange(Sender: TObject);

源代码网整理以下begin

源代码网整理以下DDEServerItem1.Lines := ListBox1.Items;

软件开发网 www.mscto.com

源代码网整理以下end; 

源代码网整理以下 创建DDE服务器程序时也可以再加入一个DDEServerConv部件,并把两个部件利用DDEServerItem的ServerConv属性联系起来。此时DDE主题成为部件DDEServerConv的名称,而不是拥有DDEServerItem部件窗体的标题。

源代码网整理以下在下列情况下使用DDEServerConv部件成为必要:

源代码网整理以下 1.拥有DDEServerItem 部件窗体的标题可能在运行时改变或可能有其它窗体拥有同样的标题。在这种情况下DDE联接可能无法建立;

源代码网整理以下 2.DDE客户程序可能会向你的服务器程序发送一条宏命令。在这种情况下只有拥有一个DDEServerConv部件才能响应OnMacroExecute事件并执行相应的动作。 

源代码网整理以下7.4.1 和DDE客户程序建立联接 

源代码网整理以下 一般说来,建立DDE联接是客户程序的任务。但服务器程序可以把一个联接拷贝到剪贴板上供客户程序粘贴并建立DDE会话。步骤如下:

源代码网整理以下1.调用DDEServerItem部件的CopyToClipboard方法, 把Text(或Lines)属性的值和DDE联接信息拷贝到剪贴板上;

源代码网整理以下2.DDE客户程序插入联接的数据。一般地这是通过选择适当的命令(如Edit|Paste Special或Edit|Paste Link)来实现的。

源代码网整理以下7.4.2 响应DDE事件 

源代码网整理以下 部件DDEServerConv有三个事件:OnOpen、OnClose、OnExecuteMacro。前两个事件在DDE会话建立和终止时触发。同(7.3.7)中的介绍。

源代码网整理以下 OnExecuteMacro事件用于响应客户程序发送过来的宏指令。OnExecuteMacro事件处理过程有一个Msg参数,保存发送过来的指令串。用户可以在该过程中决定如何响应这些宏指令。

源代码网整理以下 DDEServerItem部件只有一个事件OnPokeData。这一事件用于响应客户程序发送来的数据。如果客户程序是Delphi程序,则客户程序调用了PokeData或PokeDataLines方法。在这一事件的处理过程中用户可以把发送来的数据保存到一个合适的地方。一般说来这应该就是DDEServerItem所联系的文本控件。

源代码网整理以下下面的程序把发送来的数据保存到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.根据客户程序发送来的宏指令改变自身的运行状态。

源代码网整理以下其中各部件的关键属性如下: 

源代码网整理以下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; 软件开发网 www.mscto.com

源代码网整理以下end; 

源代码网整理以下 这是通过菜单项Edit|Copy来调用的。

源代码网整理以下 接收客户程序发送来的数据,是在DDETestItem的OnPokeData事件处理过程中。在接收过程中改变FInPoke的值,以阻止数据的无效反送。 

源代码网整理以下procedure TDDESrvrForm.doOnPoke(Sender: TObject);

软件开发网 www.mscto.com

源代码网整理以下begin

源代码网整理以下FInPoke := True;

源代码网整理以下Memo1.Lines := DDETestItem.Lines;

源代码网整理以下FInPoke := False;

软件开发网 www.mscto.com

源代码网整理以下end;  软件开发网 www.mscto.com

源代码网整理以下 在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

软件开发网 www.mscto.com

源代码网整理以下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 软件开发网 www.mscto.com

源代码网整理以下WindowState := wsMaximized 软件开发网 www.mscto.com

源代码网整理以下else

源代码网整理以下MessageDlg("Invalid Command",mtWarning,[mbOK],0);

源代码网整理以下end;

源代码网整理以下end; 

源代码网整理以下 下面的DDE客户程序,主要是为了验证上面的DDE服务器程序而设计的,但同时也提供了一个DDE客户程序设计的完整实例。

源代码网整理以下 

源代码网整理以下程序把接收到的DDE数据保存在一个TMemo类部件DDEDat中,而欲发送给服务器的数据和宏指令在另一个TMemo类部件PokeDat中输入。两个按钮PokeBtn、ExecuteBtn用于发送数据和宏指令。两个菜单项File|New Link和Edit|Paste Link用于根据用户的输入建立新联接和从剪贴板上粘贴DDE联接。

源代码网整理以下DDE联接的建立通过调用SetLink方法实现。

源代码网整理以下建立新联接的实现代码如下。 

源代码网整理以下procedure TFormD.doNewLink(Sender: TObject);

软件开发网 www.mscto.com

源代码网整理以下begin

源代码网整理以下DDEClient.SetLink (AppName.Text, TopicName.Text);

源代码网整理以下DDEClientItem.DdeConv := DDEClient;

源代码网整理以下DDEClientItem.DDEItem := ItemName.Text;

源代码网整理以下end; 

源代码网整理以下通过从剪贴板粘贴联接信息来建立联接的实现代码如下。 

软件开发网 www.mscto.com

源代码网整理以下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;

软件开发网 www.mscto.com

源代码网整理以下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 软件开发网 www.mscto.com

源代码网整理以下DDECli := DDEClientItem.DdeConv; 软件开发网 www.mscto.com

源代码网整理以下if DdeCli <> nil then

源代码网整理以下DDECli.PokeDataLines (DDEClientItem.DDEItem, PokeDat.Lines);

源代码网整理以下end;

源代码网整理以下宏指令发送的实现代码如下。 

源代码网整理以下procedure TFormD.doMacro (Sender: TObject);

源代码网整理以下var 软件开发网 www.mscto.com

源代码网整理以下DDECli: TDDEClientConv;

软件开发网 www.mscto.com

源代码网整理以下Cmd: String;

源代码网整理以下begin

源代码网整理以下DDECli := DDEClientItem.DdeConv;

软件开发网 www.mscto.com

源代码网整理以下if DDECli <> nil then

源代码网整理以下begin

源代码网整理以下Cmd := PokeDat.Text #13#10;

源代码网整理以下DDECli.ExecuteMacroLines (PokeDat.Lines, True);

源代码网整理以下end; 软件开发网 www.mscto.com

源代码网整理以下end; 

源代码网整理以下 运行以上两个程序,建立DDE联接。经测试,数据传输、数据发送和宏指令的发送与执行都达到预期要求。

源代码网整理以下7.4.4 小结 

源代码网整理以下 剪贴板和DDE是Windows下数据通信的两种方法。Delphi以简便、友好的方式实现了相应的功能,为用户编程提供了方便。一般说来,剪贴板多用于静态数据传输,而DDE用于动态数据交换、控制其它程序运行等场合。这些内容对于多用户环境下的程序开发是很重要的

软件开发网 www.mscto.com


源代码网推荐

源代码网供稿.
网友评论 (0)
会员中心
网络编程
本站推荐
网络编程之精华