打开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地址加入到网友中即可实现实时聊天了一个属于自己版权的聊天程序,就这样编写成功了。程序运行时,自动加入两个网友:”大家”和本地计算机名称.当然,你可以增加更多的内容,使程序更加的完善,以求更多的功能。
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地址加入到网友中即可实现实时聊天了一个属于自己版权的聊天程序,就这样编写成功了。程序运行时,自动加入两个网友:”大家”和本地计算机名称.当然,你可以增加更多的内容,使程序更加的完善,以求更多的功能。
解决方案 »
- delphi 调用 webservice问题,求助!
- 一个小问题,但是急
- [转帖]深圳柴刀匪猖獗 砍手脚抢手机
- 用ADOTABLE在DELPHI中写一个BUTTONCLIK事件来动态创建表!求求各位高手大哥大姐们赐教了!
- delphi高手们帮助呀, 我用了很多方法,都不能实现画圆无锯齿,photoshop中画圆就没有锯齿.如何编写的了,请帮助.
- 为什么我用IEhelper,地址栏会被3721抢先拦截了?
- 为什么我无法访问数据库!
- 关于“数据库记录太多,如何解决?(500分解决该问题)”问题的给分,请firetoucher(风焱) 、gfh_79_0(ghf) 领分
- 早回复 早揭贴-----------?
- 各位大侠:哪能找到adoexpress for delphi5 update的序列号?
- 一个关于combobox控件的小问题!!
- 祝福高手ihihonline和百合美女~~~~~~~~
2.这句改成这样不就不用重复那么多代码了吗?
if (key=#13) and (Edit1.Text<>’’) then
//如果所说的内容不为空,且最后一个按键为”Enter”则发送。
begin
BitBtn1.Click;
end;
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('´ó¼Ò');
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+'×ÔÑÔ×ÔÓïµÀ:'+Edit1.Text
else
edit1.Text:=ComputerName+'¶Ô'+listBox1.Items[listbox1.ItemIndex]+'µÀ:'+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('Ôö¼ÓÈËÔ±','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;
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.