- Rongsen.Com.Cn 版权所有 2008-2010 京ICP备08007000号 京公海网安备11010802026356号 朝阳网安编号:110105199号
- 北京黑客防线网安工作室-黑客防线网安服务器维护基地为您提供专业的
服务器维护
,企业网站维护
,网站维护
服务 - (建议采用1024×768分辨率,以达到最佳视觉效果) Powered by 黑客防线网安 ©2009-2010 www.rongsen.com.cn
作者:黑客防线网安网站维护基地 来源:黑客防线网安网站维护基地 浏览次数:0 |
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用于动态数据交换、控制其它程序运行等场合。这些内容对于多用户环境下的程序开发是很重要的。
我要申请本站:N点 | 黑客防线官网 | |
专业服务器维护及网站维护手工安全搭建环境,网站安全加固服务。黑客防线网安服务器维护基地招商进行中!QQ:29769479 |