打开Delphi,新建Application, 放置以下几个控件:
  Panel1, Panel2, Edit1, ListBox1, Memo1, Button1, Button2, BitBtn1, Nmudp1源程序如下:
unit main;interfaceuses
 Windows,messages,SysUtils,Classes,Graphics,Controls,Forms,Dialogs,StdCtrls,
 Buttons,ExtCtrls,NMUDP,Menus,ComCtrls,WinSock; //增加WinSocktype
 TForm1 = class(TForm)
 NMUDP1: TNMUDP;
 Panel1: TPanel;
 Panel2: TPanel;
 Label1: TLabel;
 Edit1: TEdit;
 BitBtn1: TBitBtn;
 Memo1: TMemo;
 Panel3: TPanel;
 Panel4: TPanel;
 ListBox1: TListBox;
 Button1: TButton;
 Button2: TButton;
 procedure FormShow(Sender: TObject);
 procedure BitBtn1Click(Sender: TObject);
 procedure NMUDP1DataReceived(Sender: TComponent; NumberBytes: Integer;
      FromIP: String; Port: Integer);
 procedure Edit1KeyPress(Sender: TObject; var Key: Char);
 procedure Button1Click(Sender: TObject);
 procedure Button2Click(Sender: TObject);
 private
  { Private declarations }
 public
  { Public declarations }
end;var
 Form1: TForm1;
 ComputerName: array[0..127] of Char;implementation{$R *.DFM}procedure TForm1.FormShow(Sender: TObject);
var
 sz: dword;
begin
 sz := SizeOf(Computername);
 GetComputerName(ComputerNamesz);//得到本机的标识
 ListBox1.Items.Clear;
 ListBox1.Items.Add(’大家’);//在网友清单中,增加”大家”和
 ListBox1.Items.Add(ComputerName);//本机名称
 ListBox1.ItemIndex:=0;
end;procedure TForm1.BitBtn1Click(Sender: TObject);
var
 MyStream: TMemoryStream;
 TmpStr: String;
 i:integer;
Begin
 if Edit1.Text<>’’ then //如果所说的内容不为空则发送
 begin
  NMUDP1.ReportLevel := Status_Basic;
  NMUDP1.RemotePort :=8888;//端口为:8888,可以自己定义,但必须与LocalPort相一致。
  if ListBox1.Items[ListBox1.ItemIndex]=ComputerName then
   Edit1.Text:=ComputerName+’自言自语道:’+Edit1.Text 
   //如果和自己对话.
  Else
  Edit1.Text:=ComputerName+’对’+ListBox1.Items[listbox1.itemindex]+’说:’     +Edit1.Text; 
  TmpStr :=Edit1.text;
  MyStream := TMemoryStream.Create;
  try
   MyStream.Write(TmpStr[1],Length(Edit1.Text));
   if ListBox1.ItemIndex=0 then 
   begin
    for i:=1 to ListBox1.Items.Count-1 do 
    begin //如果选择”大家”,则对所有的网友发送信息
     NMUDP1.RemoteHost :=ListBox1.Items[i];//远程主机的名称或地址.
     NMUDP1.SendStream(MyStream);//发送信息.
    End;
   end 
   else 
   begin //如果私聊
    NMUDP1.RemoteHost :=ListBox1.Items[ListBox1.itemindex]; 
    //仅对所选中的网友.
    NMUDP1.SendStream(MyStream);
   End;
  finally
   MyStream.Free;
  end;
  Edit1.Text:=’’;
  Edit1.SetFocus;
 end 
 else
  Edit1.SetFocus;
end;procedure TForm1.NMUDP1DataReceived(Sender: TComponent;NumberBytes: Integer;         FromIP:String;Port: Integer);
var
 MyStream: TMemoryStream;
 TmpStr: String;
begin
 MyStream := TMemoryStream.Create;
 try
  NMUDP1.ReadStream(MyStream);
  SetLength(TmpStrNumberBytes);
  MyStream.Read(TmpStr[1]NumberBytes);
  Memo1.Lines.Add(TmpStr); //显示对话的内容.
 finally
  MyStream.Free;
 end;
end;procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var
 MyStream: TMemoryStream;
 TmpStr: String;
 i:integer;
Begin
 if (key=#13) and (Edit1.Text<>’’) then 
 //如果所说的内容不为空,且最后一个按键为”Enter”则发送。
 begin
  NMUDP1.ReportLevel := Status_Basic;
  NMUDP1.RemotePort :=8888;
  if ListBox1.Items[ListBox1.ItemIndex]=ComputerName then
   Edit1.Text:=ComputerName+’自言自语道:’+Edit1.Text
 else
  Edit1.Text:=ComputerName+’对’+ListBox1.Items[listbox1.itemindex]+’说:’     +Edit1.Text;
  TmpStr :=Edit1.text;
  MyStream := TMemoryStream.Create;
  try
   MyStream.Write(TmpStr[1],Length(Edit1.Text));
   if ListBox1.ItemIndex=0 then 
   begin
    for i:=1 to ListBox1.Items.Count-1 do 
    begin
     NMUDP1.RemoteHost :=ListBox1.Items[i];
     NMUDP1.SendStream(MyStream);
    end;
   end
   else 
   begin
    NMUDP1.RemoteHost :=ListBox1.Items[ListBox1.itemindex];
    NMUDP1.SendStream(MyStream);
   end;
  finally
   MyStream.Free;
  end;
  Edit1.Text:=’’;
  edit1.SetFocus;
 end
 else
  Edit1.SetFocus;
 end;
end;procedure TForm1.Button1Click(Sender: TObject);
var
 InputString:String;
begin //增加网友,输入的可以是IP地址或计算机名称。
 InputString:=InputBox(’增加人员’,’IP地址或计算机名’,’’);
 if Inputstring<>’’ then ListBox1.Items.Add(Inputstring);
 ListBox1.ItemIndex:=0;
end;procedure TForm1.Button2Click(Sender: TObject);
begin //删除当前选中的网友,但”大家”不能被删除.
 if ListBox1.ItemIndex<>0 then 
  ListBox1.Items.Delete(ListBox1.ItemIndex);
end;end.  这样,一个简单的聊天工具就做好了,只要双方同时运行本程序,且将对方的计算机名称或IP地址加入到网友中即可实现实时聊天了一个属于自己版权的聊天程序,就这样编写成功了。程序运行时,自动加入两个网友:”大家”和本地计算机名称.当然,你可以增加更多的内容,使程序更加的完善,以求更多的功能。

解决方案 »

  1.   

    1.为什么要取 Length(Edit1.Text) 的长度.而不是 Length(TmpStr) 呢?
    2.这句改成这样不就不用重复那么多代码了吗? 
       if (key=#13) and (Edit1.Text<>’’) then 
            //如果所说的内容不为空,且最后一个按键为”Enter”则发送。
      begin
          BitBtn1.Click;
       end;
      

  2.   

    谢谢 summax(夏天的冰) 
    1。取 Length(Edit1.Text) 的长度.而不是 Length(TmpStr)。其实这两个是一样的请看 procedure TForm1.BitBtn1Click(Sender: TObject);中的TmpStr :=Edit1.text;
    2。我改了一下,还是“Stream Write error!”
    修改后的源代码如下:
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, NMUDP, Buttons,ComCtrls, Menus,ExtCtrls,WinSock;type
      TForm1 = class(TForm)
        Panel1: TPanel;
        Panel2: TPanel;
        Edit1: TEdit;
        Button1: TButton;
        Button2: TButton;
        BitBtn1: TBitBtn;
        NMUDP1: TNMUDP;
        ListBox1: TListBox;
        Memo1: TMemo;
        procedure Formshow(Sender: TObject);
        procedure BitBtn1Click(Sender: TObject);
        procedure edit1keypress(Sender: TObject; var Key: Char);
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure nmudpdatareceive(Sender: TComponent; NumberBytes: Integer;
          FromIP: String; Port: Integer);  private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      Computername:array[0..127] of Char;implementation{$R *.dfm}procedure TForm1.Formshow(Sender: TObject);
    var
     sz:dword;
    begin
      sz:=SizeOf(Computername);
      GetComputerName(Computername,sz);
      listbox1.Items.Clear;
      listbox1.Items.Add('&acute;ó&frac14;&Ograve;');
      listbox1.Items.Add(ComputerName);
      listbox1.ItemIndex:=0;
    end;procedure TForm1.BitBtn1Click(Sender: TObject);
    var
      MyStream:TMemoryStream;
      TmpStr:String;
      i:integer;
    begin
       if edit1.Text<>'' then
       begin
         nmudp1.ReportLevel:=1;//Status_Basic;
         nmudp1.RemotePort:=8888;
         if listBox1.Items[listbox1.ItemIndex]=ComputerName then
         Edit1.Text:=ComputerName+'×&Ocirc;&Ntilde;&Ocirc;×&Ocirc;&Oacute;&iuml;&micro;&Agrave;:'+Edit1.Text
         else
          edit1.Text:=ComputerName+'&para;&Ocirc;'+listBox1.Items[listbox1.ItemIndex]+'&micro;&Agrave;:'+Edit1.Text;
         TmpStr:=edit1.Text;
         MyStream:=TMemoryStream.Create;
         try
            MyStream.Write(TmpStr[1],Length(TmpStr));
            if listbox1.ItemIndex=0 then
              begin
                for i:=1 to listbox1.Items.Count-1 do
                 begin
                 nmudp1.RemoteHost:=listbox1.Items[i];
                 nmudp1.SendStream(MyStream);
                 end;
              end
            else
            begin
            nmudp1.RemoteHost:=listbox1.Items[listbox1.Itemindex];
            nmudp1.SendStream(MyStream);
            end;
         finally
          MyStream.Free;
          end;
        edit1.Text:='';
        edit1.SetFocus;
       end   else
        edit1.SetFocus;
    end;
    procedure TForm1.edit1keypress(Sender: TObject; var Key: Char);begin
       if(key=#13)and(edit1.Text<>'')then
       begin
       bitbtn1.Click;
       end;end;
    procedure TForm1.Button1Click(Sender: TObject);
    var
      inputstring:String;
    begin
    inputstring:=InputBox('&Ocirc;&ouml;&frac14;&Oacute;&Egrave;&Euml;&Ocirc;±','ip &micro;&Oslash;&Ouml;·&raquo;ò&frac14;&AElig;&Euml;&atilde;&raquo;ú&Atilde;&ucirc;','');
    if inputstring<>''then listbox1.Items.Add(inputstring);
    listbox1.ItemIndex:=0;
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
    if listbox1.ItemIndex<>0 then
    listbox1.Items.Delete(listbox1.ItemIndex);
    end;
    procedure TForm1.nmudpdatareceive(Sender: TComponent; NumberBytes: Integer;
      FromIP: String; Port: Integer);
    var
       MyStream:TMemoryStream;
       TmpStr:String;
    begin
        MyStream:=TMemoryStream.Create;
        try
        nmudp1.ReadStream(MyStream);
        SetLength(TmpStr,NumberBytes);
        MyStream.Read(TmpStr[1],NumberBytes);
        memo1.Lines.Add(TmpStr);
        finally
        MyStream.Free;
        end;
    end;end.
      

  3.   

    建议看一下Delphi自带的例子。应该可以解决。