首页 考试吧论坛 Exam8视线 考试商城 网络课程 模拟考试 考友录 实用文档 求职招聘 论文下载
2011中考 | 2011高考 | 2012考研 | 考研培训 | 在职研 | 自学考试 | 成人高考 | 法律硕士 | MBA考试
MPA考试 | 中科院
四六级 | 职称英语 | 商务英语 | 公共英语 | 托福 | 雅思 | 专四专八 | 口译笔译 | 博思 | GRE GMAT
新概念英语 | 成人英语三级 | 申硕英语 | 攻硕英语 | 职称日语 | 日语学习 | 法语 | 德语 | 韩语
计算机等级考试 | 软件水平考试 | 职称计算机 | 微软认证 | 思科认证 | Oracle认证 | Linux认证
华为认证 | Java认证
公务员 | 报关员 | 银行从业资格 | 证券从业资格 | 期货从业资格 | 司法考试 | 法律顾问 | 导游资格
报检员 | 教师资格 | 社会工作者 | 外销员 | 国际商务师 | 跟单员 | 单证员 | 物流师 | 价格鉴证师
人力资源 | 管理咨询师考试 | 秘书资格 | 心理咨询师考试 | 出版专业资格 | 广告师职业水平
驾驶员 | 网络编辑
卫生资格 | 执业医师 | 执业药师 | 执业护士
会计从业资格考试会计证) | 经济师 | 会计职称 | 注册会计师 | 审计师 | 注册税务师
注册资产评估师 | 高级会计师 | ACCA | 统计师 | 精算师 | 理财规划师 | 国际内审师
一级建造师 | 二级建造师 | 造价工程师 | 造价员 | 咨询工程师 | 监理工程师 | 安全工程师
质量工程师 | 物业管理师 | 招标师 | 结构工程师 | 建筑师 | 房地产估价师 | 土地估价师 | 岩土师
设备监理师 | 房地产经纪人 | 投资项目管理师 | 土地登记代理人 | 环境影响评价师 | 环保工程师
城市规划师 | 公路监理师 | 公路造价师 | 安全评价师 | 电气工程师 | 注册测绘师 | 注册计量师
缤纷校园 | 实用文档 | 英语学习 | 作文大全 | 求职招聘 | 论文下载 | 访谈 | 游戏
您现在的位置: 考试吧(Exam8.com) > 计算机等级考试 > 计算机二级 > Delphi > 复习资料 > 正文

2011年等考Delphi讲义:剪贴板和动态数据交换

来源:考试吧Exam8.com) 2010-10-27 14:34:24 考试吧:中国教育培训第一门户 模拟考场
应用程序间的数据交换是象Windows 这样的多任务环境的重要特性。

  窗口创建时,把该窗口登录为剪贴板观察器,添加到剪贴板观察器链中,同时进行变量、部件和剪贴板的初始化。

  procedure TClipSaveForm.FormCreate(Sender: TObject);

  begin

  View := False;

  SpeedButton2.Down := True;

  MyBitmap := TBitmap.create;

  try

  MyBitmap.Width := 0;

  MyBitmap.Height := 0 ;

  except

  Application.terminate;

  end;

  Clipboard.Clear;

  NextViewerHandle := SetClipboardViewer(Handle);

  end;

  窗口关闭时,退出剪贴板观察器链,并释放内存:

  procedure TClipSaveForm.FormDestroy(Sender: TObject);

  begin

  ChangeClipboardChain(Handle,NextViewerHandle);

  MyBitmap.Free;

  end;

  在以上两段程序中用到的两个Windows API函数SetClipboardViewer和ChangeClipboardChain分别用于登录和退出剪贴板观察器链。

  程序保存位图的功能是在消息响应过程WMDrawClipboard中实现的。该过程在剪贴板内容有变化时被调用。

  procedure TClipSaveForm.WMDrawClipboard(var Msg: TWMDrawClipboard);

  var

  FileName: String;

  begin

  If NextViewerHandle <> 0 then

  SendMessage(NextViewerHandle,msg.Msg,0,0);

  If ClipBoard.HasFormat(CF_BITMAP) then

  begin

  MyBitmap.Assign(Clipboard);

  If SaveDialog1.Execute then

  begin

  FileName := SaveDialog1.FileName;

  MyBitmap.SaveToFile(FileName);

  end;

  If View then

  begin

  WindowState := wsNormal;

  Image1.Picture.Bitmap := MyBitmap;

  end;

  end;

  Msg.Result := 0;

  end;

  程序首先判断在剪贴板观察器链中是否还存在下一个观察器。如果有,则把消息传递下去,这是剪贴板观察器程序的义务。而后判断剪贴板上内容的格式是否为位图。如是,则首先把剪贴板上内容保存到数据成员MyBitmap中,并激活一个文件保存对话框把位图保存到文件中。如果View=True,则把窗口状态(WindowState)设置为wsNormal,并把MyBitmap赋给Image部件的相应值,使用户可以对剪贴板上的位图进行观察。

  消息响应过程WMChangeCBChain在剪贴板观察器链上其它观察器退出时被调用。根据被移出观察器的不同位置决定了不同的处理方法。

  procedure TClipSaveForm.WMChangeCBChain(var Msg: TWMChangeCBChain);

  begin

  if Msg.Remove = NextViewerHandle then

  NextViewerHandle := Msg.Next

  else

  if NextViewerHandle <> 0 then

  SendMessage(NextViewerHandle,Msg.Msg,Msg.Remove,Msg.Next);

  Msg.Result := 0;

  end;

  窗口上有两个加速按钮,两个按钮。它们击键(click)事件处理过程如下。每一程序段的意义是非常显然的。

  procedure TClipSaveForm.Button1Click(Sender: TObject);

  begin

  Close;

  end;

  procedure TClipSaveForm.Button2Click(Sender: TObject);

  begin

  WindowState := wsMinimized;

  end;

  procedure TClipSaveForm.SpeedButton1Click(Sender: TObject);

  begin

  View := True;

  Image1.Picture.Bitmap := MyBitmap;

  end;

  procedure TClipSaveForm.SpeedButton2Click(Sender: TObject);

  begin

  View := False;

  Image1.Picture.Bitmap := nil;

  end;

  通过对这个程序的介绍,以下几点是应该注意的:

  1.提供了一种自己截获和处理剪贴板上内容的方法。读者可以根据需要进一步扩充;

  2.提供了响应Windows消息的方法。在第三篇有关自定义部件开发的内容中,这一问题还要详细论述;

  3.最后的一点启示是:在Delphi程序开发中巧妙应用传统的Windows方法(如消息处理、 API函数等)仍是很有必要的。而在应用这些方法中所体现的方便之处,正是Delphi胜过其它可视化开发工具的一个重要方面。

  7.2 Windows的DDE原理和 Dephi的DDE实现机制

  7.2.1 Windows的DDE原理

  Windows的DDE机制基于Windows的消息机制。两个Windows应用程序通过相互之间传递DDE消息进行DDE会话(Conversation),从而完成数据的请求、应答、传输。这两个应用程序分别称为服务器(Server)和客户(Client)。服务器是数据的提供者,客户是数据的请求和接受者。

  DDE会话由客户程序启动。客户程序把一条消息(WM_DDE_INITIATE)传播给当前运行的所有Windows程序。这条消息指明了客户程序所需要的一般数据(应用程序、主题)。拥有这些数据的DDE服务器可以响应这条被传播的消息。此时,DDE会话就开始了。

  由于在每个主题中,DDE服务器可以支持一个或多个数据项,所以在客户请求数据时应同时指明应用程序名、主题名和项目名。应用程序、主题、项目是DDE中三个最基本的概念。

  利用Windows本身提供的DDE消息和API进行DDE编程是一件相当棘手的问题。 虽然使用DDE管理库(ddeml.dll)可以一定程度上减轻开发者的工作负担,但开发DDE程序仍不是一件轻松的事情。

  此时Delphi出现了!Delphi通过其自身巧妙的设计使开发一个DDE应用程序同开发一个普通程序一样地快捷、方便。

  7.2.2 Delphi的DDE实现机制简介

  Delphi把所有的DDE功能做到四个部件中,它们是:

  ● TDDEClientConv : 用于客户程序建立和维护一个DDE会话

  ● TDDEClientItem : 用于客户程序建立和维护数据交换通道

  ● TDDEServerConv : 用于服务器程序响应DDE会话

  ● TDDEServerItem : 用于服务器程序维护数据交换通道

  前两个部件用于生成一个DDE客户程序,后两个部件用于生成一个DDE服务器程序。如果一个应用程序同时拥有这些部件,则这一程序既可以充当DDE客户,也可以充当DDE服务器。

  会话部件TDDEClientConv、TDDEServerConv用于建立和维护一个DDE会话。DDE会话包括DDE服务和DDE主题两部分。

  DDE服务是DDE服务器的名称,即在一般的Windows DDE机制中所讲的应用程序名。一般说来这一名称是DDE服务器应用程序执行文件名去掉 .EXE后缀。比如你的应用程序要和Word 6.0建立会话,则DDE服务为WINWORD。但也不尽然。比如你的应用程序要和Borland ReportSmith ( RPTSMITH.EXE ) 建立会话,则DDE 服务为 Report Smith。DDE服务到底如何,读者可参看相关的DDE服务器应用程序文档。

  DDE主题是一个包含了联接信息的数据单元。一般说来DDE 主题是一个包括扩展名的完整文件名。例如和Excel中的一个文件建立DDE会话,则主题可能是

  Topic = 'c:\excel\Example\sale.xls'

  如果服务器是一个Delphi应用程序,缺省情况下主题是包含欲联接数据窗体的标题。如果服务器使用了DDEServerConv部件,则要求使用部件DDEServerConv的名称作为DDE主题。

  项目部件TDDEclientItem、TDDEServerItem用于建立和维护DDE数据的传输通道。 DDE项目中包含着实际欲传输的数据。DDE项目的格式取决于DDE服务器应用程序。一个可能的DDE项目例子是电子表格中的单元和数据库表中的域。如果服务器是Delphi应用程序,则项目是连接的 DDEServerItem部件的名称。

  Delphi的DDE实现机制方便、实用,但也有一个令人遗憾的缺陷:只能传输文本数据以及命令、宏,而不能传输图像数据。在这一点上微软公司推出的Visual Basic 要略胜一筹。不过在目前文本数据的使用仍是最广泛的,而且图像传输可以利用剪贴板和OLE来实现,则这一缺陷也并无很大的影响

  7.3 DDE客户程序的实现

  DDE客户程序启动DDE会话,向服务器请求并从服务器接收数据。同时还可以向服务器发送数据、命令、宏,改变服务器的状态并控制服务器的运行。

  7.3.1 联接模式(ConnectMode)

  Delphi的DDE提供了两种联接模式:自动和人工。这可以通过DDEClinetConv 部件的ConnectMode属性进行设置。如下表所示。

  表 7.5 DDE的联接模式

  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

  值 意 义

  ───────────────────────────────

  ddeAutomatic 在运行中当包含TDDEClientConv部件的窗口创建时

  联接自动建立

  ddeManual 只有当调用OpenLink方法时联接才建立

  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

  不同联接模式,DDE客户程序的实现方式不同。

  对于自动模式:

  1. 向窗体中加入DDEClientConv和DDEClientItem部件并命名;

  2. 把DDEClientItem部件的DdeConv属性设置为DDEClientConv部件的名称;

  如果在设计时建立,则通过对象观察器进行选择;如果在运行时建立联系, 则通过如下的一条语句设置属性的值:

  DDEClientItem1.DdeConv := 'DDEClientConv1' ;

  3. 和服务器建立联系,实现数据共享。

  对于人工模式:

  1.向窗体中加入DDEClientConv部件;

  2.和服务器建立联系;

  3. 数据更新时调用RequestData方法申请并获得数据。

  7.3.2 和DDE服务器建立联系

  和DDE服务器建立联系,既可以在设计时进行,也可以在运行时进行。

  在设计时,DDE联接可以通过剪贴板进行粘贴。具体步骤如下:

  1. 激活服务器程序,并选中你的客户程序欲联接的数据;

  2. 把数据和DDE联接信息拷贝到剪贴板上。一般说来这只需要选择服务器应用程序的 Edit|Copy 菜单;

  3. 在Delphi IDE的设计窗体中选中DDEClientConv部件;

  4. 在Object Inspector(对象观察器)中单击DDEService属性或DDETopic属性,然后再单击Ellipsis按钮,打开DDE Info对话框;

  5.选择Paste Link按钮。此时App编辑框和Topic编辑框被自动填充。如果Paste Link按钮变灰,说明你准备用作服务器的应用程序不支持DDE或者DDE信息没有被成功地拷贝到剪贴板上;

  6.选择OK 按钮。此时Object Inspector中的DDEService、DDETopic 属性包含了建立一个DDE联接的正确值。

  对于人工模式以下步骤是不需要的。

  7.选中DDEClientItem部件,并在Object Inspector中设置DdeConv属性为已完成联接的DDEClientConv部件名称;

  8.假如剪贴板上的DDE 联接信息仍保留的话,从Object Inspector的下拉列表框中选择 DDEItem 属性的值。否则输入正确的值。

  在运行时,调用 SetLink 方法来建立DDE联接。

  SetLink有两个String类型的参数,分别用来接受DDEService和DDETopic的值。过程执行后DDEClientConv部件的DDEService 和DDeTopic属性被设置。要注意的是:在运行时直接设置DDEService和DDETopic的值并不能建立一个DDE联接,而必须调用SetLink 方法进行初始化。

  比如,下面的语句和Excel的System主题建立联接:

  DDEClietnConv. SetLink('Excel','System');

  调用SetLink方法后,还需要设置DDEClientItem部件的DDEItem属性。

  比如,下面的语句联接Excel的Topics项目,用以获取当前活跃文件的文件名:

  DDEClietnItem.DDEItem := 'Topics';

  当DDE联接建立后,联接的数据保存在DDEClientItem部件的Text和Lines 属性中,Text用于保存一个字符串(String),Lines用于保存一个字符串链表(TStrings)对象。

  为了显示联接数据,可以在DDEClientItem的OnChange事件中把数值赋给一个可视部件。

  下面的事件过程把联接数据实时地显示在一个编辑框中。

  procedure Form1.DDEClientItemChange(Sender: Tobject);

  begin

  Edit1.Text := DDEClientItem1.Text;

  end;

  运行状态下也可以从剪贴板上粘贴DDE联接信息,并调用SetLink建立DDE会话。下面的例子显示了当用户按下应用程序中的Paste Link按钮时,动态建立DDE会话的过程。

  procedure Form1.OnPasteLink(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;

  GetPasteLinkInfo是DDEMan 库单元中定义的一个过程。如果返回True,则DDE联接信息保存在三个参数中;如果返回False,说明剪贴板上没有正确格式的DDE联接信息。

  7.3.3 数据申请

  虽然自动模式快捷、方便,但仍有一些理由使用DDE的人工模式:

  1.服务器程序可能不支持自动数据传输,客户必须显式申请服务器更新一个特定的项目;

  2.节省通信费用。假如没有实时传输的要求,则人工模式可以大幅度降低通信的开销;

  3.若客户程序只用于控制服务器的运行,则往往没有必要使用自动模式。

  人工模式下客户程序的数据更新需要采用数据申请的方式。数据申请需要调用DDEClientConv部件的RequestData方法。RequestData有一个参数,指向要申请的DDE项目。RequestData返回一个Pchar类型的无结束符字符串,包含了申请到的文本。返回字符串占用的内存必须在程序终止前显式释放。

  在人工模式下,即使存在一个DDEClientItem部件且与DDEClientConv相联接,数据更新后DDEClientItem部件的Text、Lines属性的值也不会改变。

上一页  1 2 3 4 5 下一页
  相关推荐:2010年9月计算机等级考试试题及答案解析专题
       预告:名师解析2010年9月计算机等级考试试题答案
       2010年9月计算机等级考试成绩查询时间及入口
       2010年9月计算机等考成绩查询短信免费提醒开通
文章搜索
版权声明:如果计算机等级考试网所转载内容不慎侵犯了您的权益,请与我们联系800@exam8.com,我们将会及时处理。如转载本计算机等级考试网内容,请注明出处。