第七章-剪贴板和动态数据交换(二)(2)

7.3.8 利用客户程序和Excel交换数据   

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

界面中包含一个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中。之后可以进行模式转换、数据申请、申请发送等一系列工作。运行后的屏幕显示如下图所示。

时间: 2024-09-15 22:57:21

第七章-剪贴板和动态数据交换(二)(2)的相关文章

第七章-剪贴板和动态数据交换(一)(1)

应用程序间的数据交换是象Windows这样的多任务环境的重要特性.作为一种基于Windows的开发工具,Delphi支持如下四种数据交换方式:剪贴板.动态数据交换(DDE).对象联接与嵌入(OLE)以及动态联接库(DLLs).这中间前三种方式最为常用,OLE功能最为强大,DDE次之.而剪贴板使用最为方便.在本章,我们只讨论剪贴板和动态数据交换.利用OLE实现数据交换见下一章,利用动态联接库(DLLs)进行数据交换将在第十章中介绍. 7.1剪贴板及其应用 本质上,剪贴板只是一个全局内存块.当一个应

第七章-剪贴板和动态数据交换(二)(5)

DDE联接的建立通过调用SetLink方法实现. 建立新联接的实现代码如下. procedure TFormD.doNewLink(Sender: TObject); begin DDEClient.SetLink (AppName.Text, TopicName.Text); DDEClientItem.DdeConv := DDEClient; DDEClientItem.DDEItem := ItemName.Text; end; 通过从剪贴板粘贴联接信息来建立联接的实现代码如下. pro

第七章-剪贴板和动态数据交换(二)(4)

7.4 DDE服务器程序的实现 DDE服务器程序响应DDE客户的请求,一般地它包含了客户程序希望获取的数据. 创建一个DDE服务器程序,必须要把一个DDEServerItem部件添加到窗体中.DDEServerItem的text或Lines属性包含了要联接的数据.一般地 DDEServerItem部件又和另一个文本控件相联系.当文本控件中的内容变化时则更新DDEServerItem 的text或Lines属性的值.下面的一段程序把DDEServerItem和一个列表框相联系.这一联系是在列表框的

第七章-剪贴板和动态数据交换(二)(3)

7.3.9 用客户程序控制程序管理器 下面的例子用客户程序向程序管理器发送命令,用于创建程序组.程序项以及删除程序组. 程序管理器提供了应用程序的DDE接口命令字符串,应用程序利用这些命令字符串可以实现以下的功能: 1.创建程序组 命令格式为: CreateGroup(程序组名[,程序组所在的路径]) 程序组不存在时进行创建:如程序组存在则按照指定的路径激活. 2.删除程序组 命令格式为: DeleteGroup(程序组名) 3.显示程序组 命令格式为: ShowGroup(程序组名,显示标志)

第七章-剪贴板和动态数据交换(二)(1)

7.3.5 控制服务器应用程序的执行 客户程序控制服务器应用程序的一个方面是:必要的时候客户程序可以启动服务器程序,并装载会话主题. 而客户程序控制服务器应用程序更重要的一点是向服务器发送服务器承认的宏命令,来完成对服务器应用程序的各种操作.服务器到底支持哪些宏命令,可参阅服务器应用程序文档. 发送宏命令要使用DDEClientConv的两个方法 ExecuteMacro和ExecuteMacroLines ,它们的语法如下: function ExecuteMacro(Cmd: PChar;

第七章-剪贴板和动态数据交换(一)(3)

7.1.3.3 粘贴 从剪贴板上粘贴图像,首先检测剪贴板上的数据格式.如果格式为CF_BITMAP,则调用目标位图的Assign 方法粘贴图像. 程序清单如下. procedure TForm1.PasteButtonClick(Sender: TObject); var Bitmap: TBitmap; begin if Clipboard.HasFormat(CF_BITMAP) then begin Bitmap := TBitmap.Create; try Bitmap.Assign(C

第七章-剪贴板和动态数据交换(一)(6)

7.3.2 和DDE服务器建立联系 和DDE服务器建立联系,既可以在设计时进行,也可以在运行时进行. 在设计时,DDE联接可以通过剪贴板进行粘贴.具体步骤如下: 1. 激活服务器程序,并选中你的客户程序欲联接的数据: 2. 把数据和DDE联接信息拷贝到剪贴板上.一般说来这只需要选择服务器应用程序的 Edit|Copy 菜单: 3. 在Delphi IDE的设计窗体中选中DDEClientConv部件: 4. 在Object Inspector(对象观察器)中单击DDEService属性或DDET

第七章-剪贴板和动态数据交换(一)(5)

消息响应过程WMChangeCBChain在剪贴板观察器链上其它观察器退出时被调用.根据被移出观察器的不同位置决定了不同的处理方法. procedure TClipSaveForm.WMChangeCBChain(var Msg: TWMChangeCBChain); begin if Msg.Remove = NextViewerHandle then NextViewerHandle := Msg.Next else if NextViewerHandle <> 0 then SendMe

第七章-剪贴板和动态数据交换(一)(4)

为解决这些问题,我开发了下面的程序.程序启动时,以极小化方式运行.此时只要剪贴板中存入位图,则自动弹出一个对话框请求用户保存.如果用户希望查看确认,则可以双击运行程序图标,选择相应按钮,剪贴板中的位图就会显示在屏幕上. 部件关键属性设计如下: ClipSaveForm: Caption='Save Bitmap in Clipboard ' Panel1: Align = ' Top ' Image1: Align = ' Client ' SaveDialog1: FileEditStyle