说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

SOS大家救急啊,小弟是delphi菜鸟,过两天要交程序,还没调通,高分求救

编辑:说三道四文库 发布时间:2018-05-21 01:31
HTML文档下载 WORD文档下载 PDF文档下载
小弟要整个聊天程序,其实用NMMsg组件很简单就实现了,可是老师要求用udp组件实现,小弟去网上找到了一个聊天程序用udp实现的,可是在delphi6环境下运行时说“stream write error”不知道是否程序自身有问题?请大虾们看看,拜托一定要帮忙,解决问题马上给分决不拖贴字!!!!
单元文件代码如下:
   unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, NMUDP, ComCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Button1: TButton;
    Memo1: TMemo;
    Memo2: TMemo;
    StatusBar1: TStatusBar;
    NMUDP1: TNMUDP;
    Label1: TLabel;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure NMUDP1DataReceived(Sender: TComponent; NumberBytes: Integer;
      FromIP: String; Port: Integer);
    procedure Memo1Change(Sender: TObject);
    procedure NMUDP1Status(Sender: TComponent; status: String);
    procedure NMUDP1DataSend(Sender: TObject);
    procedure NMUDP1BufferInvalid(var handled: Boolean;
      var Buff: array of Char; var length: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
Var MyStream:TMemoryStream;  //在内存中建立一个数据块对象
    TmpStr:string;
begin
     NMUDP1.ReportLevel:=Status_basic;  //指明通过Status和OnStatus事件返回的状态消息的内容
     NMUDP1.RemoteHost:=edit1.Text; //远端主机的主机名或端口号
     NMUDP1.RemotePort:=strtoint(edit2.Text); //端口号,可以用6767
     Memo1.Enabled:=true;
     Tmpstr:='聊天好吗?';
     MyStream:= TMemoryStream.Create; //构造一个MyStream实例
     try
        MyStream.Write(TmpStr[1],length(Tmpstr)); //把'聊天好吗?'写入MyStream
        NMUDP1.SendStream(MyStream);   //把数据块发送出去
     Finally
        MyStream.Free;   //释放数据块
     end;

end;

procedure TForm1.NMUDP1DataReceived(Sender: TComponent;
  NumberBytes: Integer; FromIP: String; Port: Integer);

Var MyStream:TMemoryStream;  //在内存中建立一个数据块对象
    TmpStr:string;
begin
    MyStream:= TMemoryStream.Create; //构造一个MyStream实例
    try
      NMUDP1.ReadStream(MyStream); //接收远方传来的数据流,保存到MyStream里面去
      SetLength(Tmpstr,Numberbytes); //设置字符串的长度是Tmpstr的内容,用Numberbytes表示
      MyStream.Read(Tmpstr,Numberbytes); //把MyStream的内容读给mpstr
      //下面进行处理
      if (Tmpstr='聊天好吗?') and (Memo1.Enabled=false) then
      begin
        //出现一个提示牌,你可以选择是否接受聊天
        if MessageDlg(FromIP+':  '+Tmpstr,mtconfirmation,[mbYes,MbNo],0)=mrYes then
           begin
               Edit1.Text:=FromIP;    //把对方主机信息添加上去,可以实现聊天
               Edit2.Text:=inttostr(port);
               Memo1.Enabled:=true;
               Memo1.SetFocus;      //焦点给Memo1
           end;
      end
      else
      begin
          //这是对方传过来的话,直接添加进Memo2
          Memo2.Clear;
          memo2.Lines.Add(Tmpstr);
      end;

    finally
       MyStream.Free; //释放MyStream
    end;
end;

procedure TForm1.Memo1Change(Sender: TObject);
Var MyStream:TMemoryStream;  //在内存中建立一个数据块对象
    TmpStr:string;
begin
    NMUDP1.ReportLevel:=Status_basic;  //指明通过Status和OnStatus事件返回的状态消息的内容
    NMUDP1.RemoteHost:=edit1.Text; //远端主机的主机名或端口号
    NMUDP1.RemotePort:=strtoint(edit2.Text); //端口号,可以用6767
    Tmpstr:=Memo1.Text;
    MyStream:= TMemoryStream.Create; //构造一个MyStream实例
     try
        MyStream.Write(TmpStr[1],length(Tmpstr)); //把'聊天好吗?'写入MyStream
        NMUDP1.SendStream(MyStream);   //把数据块发送出去
     Finally
        MyStream.Free;   //释放数据块
     end;
end;

procedure TForm1.NMUDP1Status(Sender: TComponent; status: String);
begin
if statusBar1<>NIL then
   statusBar1.SimpleText:=status;
end;

procedure TForm1.NMUDP1DataSend(Sender: TObject);
begin
  statusBar1.SimpleText:='数据已发送';
end;



procedure TForm1.NMUDP1BufferInvalid(var handled: Boolean;
  var Buff: array of Char; var length: Integer);
begin
   //这个事件反映远端主机不存在
   statusBar1.SimpleText:='远端主机不存在';
end;

end.
自己顶一下
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘