DDE方式下Delphi7程序间及与VB6程序的数据交换

WINDOWS平台的DDE功能,为不同应用程序间数据实时交互提供了简便的方法。下面的内容,是我的具体实践。

  1. Delphi7程序间的DDE数据交互

DDE SERVER和DDE CLIENT做到了同一个程序界面下,将其分成两个不同程序是同样的方法,只不过做在一个程序界面下更简便。

DDE换有三个重要因素:SERVICE、TOPIC和ITEM,这是DDE本身定义的,与编程语言无关。就是说无论用什么语言编程,都要操作DDE的这三个核心要素。

DELPHI下DDE编程,程序名就是SERVICE名,DdeServerCon就是TOPIC,DdeServerItem就是ITEM,其内容就是用于交互的数据,比如文本框中的内容或其它变量中的内容,使用的是文本方式。

在FORM上,将Server和Client控件同时摆放好。

Server端的两个控件配置时,将SERVER控件的名称填到SERVERITEM控件的ServerConv处;Client端的两个控件用类似的方法配置。

控件配置好后,在窗体上放置一个TIMER,每秒更新一下EDIT1控件的内容,同时更新DdeServerItem1的TEXT成员的内容。

Edit1.Text := FormatDateTime('hh:mm:ss', now);

DdeServerItem1.Text := Edit1.Text;

接下来在COMMAND1下,进行DDE连接。如果控件属性没填写,还可以在程序中完成。

try

DdeClientItem1.DdeConv := DdeClientConv1;

if (DdeClientConv1.SetLink('Project1','DdeServerConv1') = False) then

begin

ShowMessage('Unable to connect DDEserver!');

Exit;

end;

DdeClientItem1.DdeItem := 'DdeServerItem1';

DdeClientConv1.OpenLink;

except

end;

上面的程序一是设置连接SetLink,然后是让DdeClientConv去OpenLink,可以清楚地看到SERVICE和TOPIC的表示 'Project1','DdeServerConv1'

一旦建立连接,SERVER端EDIT1中的内容,可以在CLIENT端自动同步。用的是DdeClientItem控件中的DdeClientItem1Change事件驱动的。

procedure TForm1.DdeClientItem1Change(Sender: TObject);

begin

Edit2.Text := DdeClientItem1.Text;

end;

DELPHI简单的DDE实时数据交换就完成了,下面是完整代码。

Delphi 复制代码
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, DdeMan;

type
  TForm1 = class(TForm)
    DdeServerConv1: TDdeServerConv;
    DdeServerItem1: TDdeServerItem;
    DdeClientConv1: TDdeClientConv;
    DdeClientItem1: TDdeClientItem;
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Timer1: TTimer;
    Button2: TButton;
    Label1: TLabel;
    Label2: TLabel;
    procedure Timer1Timer(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure DdeClientItem1Change(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Edit1.Text := FormatDateTime('hh:mm:ss', now);
  DdeServerItem1.Text := Edit1.Text;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
    try
        DdeClientConv1.CloseLink;
    except
    end;

    Application.Terminate;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
    try
        DdeClientItem1.DdeConv := DdeClientConv1;
        if (DdeClientConv1.SetLink('Project1','DdeServerConv1') = False) then
        begin
            ShowMessage('Unable to connect DDEserver!');
            Exit;
        end;
        DdeClientItem1.DdeItem := 'DdeServerItem1';
        DdeClientConv1.OpenLink;
    except
    end;
end;

procedure TForm1.DdeClientItem1Change(Sender: TObject);
begin
  Edit2.Text := DdeClientItem1.Text;
end;

end.

利用上面Delphi的DDE server,写VB6客户端就更简单了。

放个TEXT1,用它DDE相关的属性,用好SERVICE和TOPIC,数据就会从DELPHI程序的SERVER中传送过来。

完整的VB6程序代码如下:

vbnet 复制代码
Option Explicit

Private Sub Command1_Click()
  On Error Resume Next
  ' 连接Delphi的DDE服务:服务名=DelphiDDE,主题=DataTopic
  Text1.LinkTopic = "Project1|DdeServerConv1"
  ' 指定数据项(与Delphi的DdeServerItem1.Name一致)
  Text1.LinkItem = "DdeServerItem1"
  ' 设置连接模式:1=自动更新,2=手动更新
  Text1.LinkMode = 1 ' 自动接收数据更新
  Text1.LinkMode = 0 ' Broke connection
End Sub

' 断开连接
Private Sub Command2_Click()
   End
End Sub

Private Sub Timer1_Timer()
  On Error Resume Next
  Command1_Click
End Sub

DDE delphi7 client 和 DDE vb6 client 同时接收 DDE delphi7 server

DDE Delphi7 及 VB6 代码链接

https://download.csdn.net/download/weixin_45707491/92132828