首页 考试吧论坛 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 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

  MessageDlg('Unable to create group.', mtInformation, [mbOK], 0);

  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

  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;

  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;

  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客户程序设计的完整实例。

  程序把接收到的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.4.4 小结

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

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