知识大全 剪贴板和动态数据交换(一)[3]

Posted

篇首语:常识是人类的守护神。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 剪贴板和动态数据交换(一)[3]相关的知识,希望对你有一定的参考价值。

DELPHI基础教程:剪贴板和动态数据交换(一)[3]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  procedure TClipSaveForm FormCreate(Sender: TObject)

  begin

  View := False;

  SpeedButton Down := True;

  MyBitmap := TBitmap create;

  try

  MyBitmap Width := ;

  MyBitmap Height := ;

  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: MDrawClipboard)

  var

  FileName: String;

  begin

  If NextViewerHandle <> then

  SendMessage(NextViewerHandle msg Msg )

  If ClipBoard HasFormat(CF_BITMAP) then

  begin

  MyBitmap Assign(Clipboard)

  If SaveDialog Execute then

  begin

  FileName := SaveDialog FileName;

  MyBitmap SaveToFile(FileName)

  end;

  If View then

  begin

  WindowState := wsNormal;

  Image Picture Bitmap := MyBitmap;

  end;

  end;

  Msg Result := ;

  end;

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

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

  procedure TClipSaveForm WMChangeCBChain(var Msg: MChangeCBChain)

  begin

  if Msg Remove = NextViewerHandle then

  NextViewerHandle := Msg Next

  else

  if NextViewerHandle <> then

  SendMessage(NextViewerHandle Msg Msg Msg Remove Msg Next)

  Msg Result := ;

  end;

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

  procedure TClipSaveForm Button Click(Sender: TObject)

  begin

  Close;

  end;

  procedure TClipSaveForm Button Click(Sender: TObject)

  begin

  WindowState := wsMinimized;

  end;

  procedure TClipSaveForm SpeedButton Click(Sender: TObject)

  begin

  View := True;

  Image Picture Bitmap := MyBitmap;

  end;

  procedure TClipSaveForm SpeedButton Click(Sender: TObject)

  begin

  View := False;

  Image Picture Bitmap := nil;

  end;

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

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

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

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

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

   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应用程序同开发一个普通程序一样地快捷 方便

   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 建立会话 则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来实现 则这一缺陷也并无很大的影响

cha138/Article/program/Delphi/201311/25230

相关参考

知识大全 剪贴板和动态数据交换(一)[2]

DELPHI基础教程:剪贴板和动态数据交换(一)[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧

知识大全 剪贴板和动态数据交换(一)[1]

DELPHI基础教程:剪贴板和动态数据交换(一)[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧

知识大全 剪贴板和动态数据交换(一)[4]

DELPHI基础教程:剪贴板和动态数据交换(一)[4]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧

知识大全 剪贴板和动态数据交换(二)[2]

DELPHI基础教程:剪贴板和动态数据交换(二)[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧

知识大全 剪贴板和动态数据交换(二)[4]

DELPHI基础教程:剪贴板和动态数据交换(二)[4]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧

知识大全 剪贴板和动态数据交换(二)[1]

DELPHI基础教程:剪贴板和动态数据交换(二)[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧

知识大全 利用剪贴板实现高速导出数据到Excel

利用剪贴板实现高速导出数据到Excel  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在很多的时

知识大全 数据结构考研分类复习真题 第八章 动态存储管理[3]

  .试叙述动态存储分配伙伴系统的基本思想它和边界标识法不同点是什么?【青岛大学十(分)】【中国人民大学一(分)】  .组织成循环链表的可利用空间表附加什么条件时首次适配策略就转变为最佳适配策略?【北

知识大全 动态性能视图,Oracle数据库维护的好帮手(一)

动态性能视图,Oracle数据库维护的好帮手(一)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 

知识大全 数据结构考研分类复习真题 第十章 答案[3]

  题中p指向无序区第一个记录q指向最小值结点一趟排序结束p和q所指结点值交换同时向后移p指针  ()!=null()p>next()r!=null()r>data<q>dat