下面这段代码导致windows无法正常关机,看是我怎么也找不出原因
哪位高手帮忙看看
谢谢了
unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, TFlatEditUnit, TFlatButtonUnit, ExtCtrls,
  TFlatPanelUnit, TFlatTitlebarUnit, TFlatSpinEditUnit, ComCtrls,
  TFlatMemoUnit, TFlatListBoxUnit,winsock, NMUDP, TFlatCheckListBoxUnit,
  AVLabelPack, CoolTrayIcon, Menus, MPlayer,Registry;
type
  TNetResourceArray=^TNetResource;
  TForm1 = class(TForm)
    FlatTitlebar1: TFlatTitlebar;
    FlatPanel1: TFlatPanel;
    FlatButton1: TFlatButton;
    UserList: TFlatListBox;
    Flatmemo1: TFlatMemo;
    StatusBar1: TStatusBar;
    udp1: TNMUDP;
    FlatButton2: TFlatButton;
    TextBox: TFlatEdit;
    FlatButton3: TFlatButton;
    FlatButton4: TFlatButton;
    FlatPanel2: TFlatPanel;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Up: TLabel;
    Down: TLabel;
    Trayicon: TCoolTrayIcon;
    PopupMenu1: TPopupMenu;
    About2: TMenuItem;
    Exit1: TMenuItem;
    Sound: TAVLedLabel;
    Sound1: TMenuItem;
    StayOnTop1: TMenuItem;
    NoTrouble1: TMenuItem;
    player: TMediaPlayer;
    procedure FlatButton1Click(Sender: TObject);
    procedure AddCumputer(Name:String;IP:string);
    procedure FlatButton2Click(Sender: TObject);
    procedure udp1DataReceived(Sender: TComponent; NumberBytes: Integer;FromIP: String; Port: Integer);
    procedure sendMsg(msgbody:string;ip:string);
    procedure readMsg(msgbody:string;ip:string);
    function newMate(ip:string;name:string):boolean;
    procedure FormCreate(Sender: TObject);
    procedure freshComList();
    procedure FlatButton3Click(Sender: TObject);
    procedure FlatButton4Click(Sender: TObject);
    procedure showpm(name:string;ip:string;msg:string);
    procedure Flatmemo1Change(Sender: TObject);
    procedure TextBoxKeyPress(Sender: TObject; var Key: Char);
    procedure UpClick(Sender: TObject);
    procedure DownClick(Sender: TObject);
    procedure Exit1Click(Sender: TObject);
    procedure About2Click(Sender: TObject);
    procedure playit(kind:string);
    procedure StayOnTop1Click(Sender: TObject);
    procedure Sound1Click(Sender: TObject);
    procedure NoTrouble1Click(Sender: TObject);
    procedure TrayiconClick(Sender: TObject);
    procedure addtoregedit();
    procedure SoundChangeState(Sender: TObject);
    procedure FormPaint(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;
  AllCom:array of array of string;
  AllComNum,NewComCoun,TempTextNum:integer;
  newcomlist:array of string;
  myname:string;
  TempText:array of string;
  runup: boolean=true;
implementation
uses unit2,unit3,unit4;
{$R *.dfm}procedure TForm1.FlatButton1Click(Sender: TObject);
begin
hide;
end;procedure TForm1.FlatButton2Click(Sender: TObject);
var
refresh:TLoading;i:integer;
begin
SetLength(AllCom,0,0);
AllComNum:=0;
FlatMemo1.Clear;
UserList.Items.Clear;
refresh:=Tloading.Create(self);
refresh.Top :=screen.Height - refresh.Height-32;
refresh.Left :=screen.Width-refresh.Width-3 ;
refresh.Show;
for i:=0 to 255 do
begin
 refresh.Flatgauge1.Progress:=i*100 div 255;
 refresh.label1.Caption:='192.168.0.'+inttostr(i);
 sendmsg('^_^!^o^<m>cheers+'+myname,'192.168.0.'+inttostr(i));
end;
refresh.Close;
end;procedure Tform1.AddCumputer(Name:String;IP:string);
begin
 NewComCoun:=NewComCoun+1;
 setlength(newcomlist,NewComCoun);
 newcomlist[NewComCoun-1]:=IP;
end;procedure TForm1.udp1DataReceived(Sender: TComponent;NumberBytes: Integer; FromIP: String; Port: Integer);
var
  MyStream: TMemoryStream;
  TmpStr: String;
begin
statusbar1.Panels[2].Text :='Receive Data From '+fromip+ ' ('+inttostr(NumberBytes)+' Bytes)';
  if numberbytes>-1 then
  begin
  MyStream := TMemoryStream.Create;
  try
    UDP1.ReadStream(MyStream);
    SetLength(TmpStr,NumberBytes);
    MyStream.Read(TmpStr[1],NumberBytes);
    readmsg(TmpStr,FromIp);
  finally
    MyStream.Free;
  end;
  end;
end;procedure TForm1.readMsg(msgbody:string;ip:string);
var msg,todo:string;i,j:integer;
begin
  if copy(msgbody,0,7)='^_^!^o^' then
  begin
   msg:=copy(msgbody,8,length(msgbody));
   case msg[2] of
   'm':  //message
       begin
       todo:=copy(msgbody,11,length(msgbody));
       todo:=copy(todo,0,pos('+',todo)-1);
       if todo='cheers' then
         if newmate(ip,copy(msgbody,pos('+',msgbody)+1,length(msgbody))) then
          sendmsg('^_^!^o^<m>cheers+' + myname,ip)
         else
          sendmsg('^_^!^o^<m>cheers:)+'+myname,ip);
       if todo='cheers:)' then newmate(ip,copy(msgbody,pos('+',msgbody)+1,length(msgbody)));
      end;
   't':   //speaking
       begin
        if NOT form1.Showing  then playIT('speak');
        flatmemo1.Lines.Insert(0,(copy(msg,4,pos('+',msg)-4)+' : '+copy(msg,pos('+',msg)+1,length(msg))));
       end;
   'p':   //Special Message
       begin
        playIT('SM');
        if notrouble1.Checked then flatmemo1.Lines.Insert(0,'* user '+copy(msg,4,pos('+',msg)-4)+' sent you a Special Message to you : '+ copy(msg,pos('+',msg)+1,length(msg)))
        else showPM(copy(msg,4,pos('+',msg)-4),ip,copy(msg,pos('+',msg)+1,length(msg)));
       end;
   'q':   //someone quit
       begin
        for i:=0 to AllComNum-1 do
         if AllCom[i,1]=ip then
         begin
          for j:=i to AllComNum-2 do
          begin
           AllCom[j,0]:=AllCom[j+1,0];
           AllCom[j,1]:=AllCom[j+1,1];
          end;
         AllComNum:=AllComNum-1;
         SetLength(AllCom,AllComNum,2);
         Flatmemo1.Lines.Insert(0,'* User '+copy(msg,4,length(msg))+' ['+ip+']'+' has quit *');
         playit('quit');
         end;
        freshComList;
       end;
   end;
  end;
end;(未完,看下贴)

解决方案 »

  1.   

    (接上)Function TForm1.newMate (ip:string;name:string):boolean;
    var i:integer;
    begin
     result:=true;
     for i:=0 to AllComNum-1 do
      if AllCom[i,1]=ip then
      begin
        AllCom[i,0]:=name;
        result:=false;
      end;
     if result then
     begin
       AllComNum:=AllComNum+1;
       setlength(AllCom,AllComNum,2);
       AllCom[AllComNum-1,0]:=name;
       AllCom[AllComNum-1,1]:=ip;
       flatmemo1.Lines.Insert(0,'* '+name+' ['+ip+'] enterd ^o^');
     end;
    freshComList();
    end;procedure Tform1.sendMsg(msgbody:string;ip:string);
    var
    MyStream: TMemoryStream;
    begin
      UDP1.ReportLevel := Status_Basic;
      UDP1.RemotePort:= 9933;
      MyStream := TMemoryStream.Create;
       try
         MyStream.Write(msgbody[1],length(msgbody));
         UDP1.RemoteHost := ip;
         UDP1.SendStream(MyStream);
       finally
       end;
       MyStream.Free;
    end;procedure Tform1.freshComList ();
    var i:integer;
    begin
     UserList.Items.Clear;
     UserList.Items.Append('-= All Users =-');
     for i:=0 to AllComNum-1 do
      UserList.Items.Append(AllCom[i,0]);
     UserList.Selected[0]:=true;
     UserList.ItemIndex:=0;
    end;procedure TForm1.FormCreate(Sender: TObject);
    var
    ComputerName: PChar;
    size: DWord;
    begin
    addtoregedit;
    TrayIcon.HideTaskbarIcon;
    TempTextNum:=0;
    TrayIcon.IconVisible:=true;
    GetMem(ComputerName,255) ;
    size:=255;
    if GetComputerName(ComputerName,size)=False then
    begin
    FreeMem(ComputerName);
    Exit;
    end;
    Myname:=ComputerName;
    statusbar1.Panels[0].Text:=Myname;
    FreeMem(ComputerName);
    flatbutton2.OnClick(nil);
    end;procedure TForm1.FlatButton3Click(Sender: TObject);
    var i:integer;
    begin
    if (textbox.Text <>'') then
     for i:=0 to AllComNum-1 do
     sendmsg('^_^!^o^<t>'+myname+'+'+ textbox.Text ,AllCom[i,1]);
    textbox.Text :='';
    end;procedure TForm1.FlatButton4Click(Sender: TObject);
    var msg:string;i:integer;
    begin
    if userlist.ItemIndex > userlist.Items.Count then
    begin
     userlist.Selected[0]:=true;
     userlist.itemindex:=0;
     exit;
    end;
      if inputquery('A Special Message to '+ userlist.Items.Strings[userlist.ItemIndex] ,'Please enter your Special Message below',msg) and (msg<>'') then
       for i:=0 to AllComNum-1 do
        if AllCom[i,0]=userlist.Items.Strings[userlist.ItemIndex] then  sendmsg('^_^!^o^<p>'+myname+'+'+msg,AllCom[i,1])
        else if UserList.ItemIndex=0 then sendmsg('^_^!^o^<p>'+myname+'+'+msg,AllCom[i,1]);
      playit('send');
    end;procedure Tform1.showpm(name:string;ip:string;msg:string);
    var newPM:TPM;
    begin
    newPM:=TPM.Create(self);
    newPM.addmessage(name,ip,msg);
    newPM.Show;
    end;procedure TForm1.Flatmemo1Change(Sender: TObject);
    begin
    label2.Caption :=flatmemo1.Text;
    end;procedure TForm1.TextBoxKeyPress(Sender: TObject; var Key: Char);
    begin
      if key =#13 then
      begin
       flatbutton3.OnClick(nil);
       key:=#0;
      end;
    end;procedure TForm1.UpClick(Sender: TObject);
    begin
     if (TempTextNum<>0) then
     begin
      Flatmemo1.Lines.Insert(0,TempText[TempTextNum-1]);
      TempTextNum:=TempTextNum-1;
      SetLength(TempText,TempTextNum);
     end; 
    end;procedure TForm1.DownClick(Sender: TObject);
    begin
    if (Flatmemo1.Lines[0]<>'') then
     begin
      TempTextNum:=TempTextNum+1;
      SetLength(TempText,TempTextNum);
      TempText[TempTextNum-1]:=Flatmemo1.Lines[0];
      Flatmemo1.Lines.Delete(0);
     end;
    end;procedure TForm1.Exit1Click(Sender: TObject);
    var i:integer;
    begin
     for i:=0 to AllComNum-1 do
      sendmsg('^_^!^o^<q>'+myname,AllCom[i,1]);
    close;
    end;procedure TForm1.About2Click(Sender: TObject);
    begin
     about.Show;
    end;procedure tform1.playit(kind:string);
    begin
     if sound.Lit then
     begin
     try
      player.FileName:=kind+'.wav';
      player.Open;
      player.Play;
     except
     end;
     end;
    end;procedure TForm1.StayOnTop1Click(Sender: TObject);
    begin
    stayontop1.Checked:= not stayontop1.Checked;
     if stayontop1.Checked then
       form1.FormStyle:=fsStayOnTop
     else
       form1.FormStyle:=fsNormal;
    end;procedure TForm1.Sound1Click(Sender: TObject);
    begin
     sound1.Checked:=not sound1.Checked;
     sound.Lit:=sound1.Checked;
    end;procedure TForm1.NoTrouble1Click(Sender: TObject);
    begin
     notrouble1.Checked:=not notrouble1.Checked;
    end;procedure TForm1.TrayiconClick(Sender: TObject);
    begin
     if form1.Showing then form1.Hide else form1.Show;
    end;procedure tform1.addtoregedit();
    var
      Reg: TRegistry;
      Workgroup,ComputerName:string;
    begin
      Reg := TRegistry.Create;
      try
        Reg.RootKey := HKEY_CURRENT_USER;
        Reg.OpenKey('\Software\Microsoft\Windows\CurrentVersion\Run',true);
        Reg.WriteString('LAN Chatting',application.ExeName);
      finally
        Reg.CloseKey;
        Reg.Free;
      end;
    end;procedure TForm1.SoundChangeState(Sender: TObject);
    begin
    Sound1.Checked :=sound.Lit;
    end;procedure TForm1.FormPaint(Sender: TObject);
    begin
     if runup then
     begin
     hide;
     runup:=false;
     end;end;end.
      

  2.   

    你把这么长的代码写在上面,人家看了都烦,你不如把你做的东西发到谁的邮箱,让他给你看看.我的email [email protected]
      

  3.   

    我记得在BCB里,用TNMUDP的话,在formclose时要有Nmudp->~Nmudp就是把他析构调,或者free了好像也行,因为她有时是不会自动释放的导致关不了机,我看你的的代码好像没有这东西啊!!看看有没有帮助!