www.pudn.com > 实景(图形)聊天室源代码(绝对高水 准,超酷).zip > Client_Main.pas


unit Client_Main; 
 
interface 
 
uses 
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, 
  TFlatTabControlUnit, TFlatSplitterUnit, 
  TFlatCheckListBoxUnit, TFlatSpeedButtonUnit, StdCtrls, TFlatComboBoxUnit, 
  TFlatMemoUnit, ExtCtrls, TFlatPanelUnit, TFlatTitlebarUnit, 
  TFlatButtonUnit, TFlatGroupBoxUnit, TFlatCheckBoxUnit, TFlatAnimWndUnit, 
  TFlatHintUnit, TFlatSpinEditUnit, TFlatEditUnit, OleCtrls, SHDocVw, 
  TFlatScrollbarUnit, TFlatColorComboBoxUnit, HeadList, ScktComp, Core, 
  TFlatGaugeUnit, TFlatProgressBarUnit, ComCtrls, Menus, ShellApi, 
  MMObj, MMDSPObj, MMWPlay, RVStyle, RVScroll, RichView, ImgList; 
 
const 
  AUTHOR_NAME: string = 'decimalox'; 
  CLIENT_VERSION: string = 'Copular Chat v1.0.0.2'; 
 
  ERROR_MESSAGE_1: string='输入中包含有非法字符'; 
  ERROR_MESSAGE_2: string='请认真填写所有信息'; 
  ERROR_MESSAGE_3: string='昵称中不能包含有空格'; 
  ERROR_MESSAGE_4: string='两次输入的密码不一致'; 
  ERROR_MESSAGE_5: string='服务器拒绝请求'; 
  ERROR_MESSAGE_6: string='权限不够'; 
  CHANNEL_TITAL_1: string='欢迎来到信息中心 -- 您可以在这里查阅各种各样的信息'; 
  CHANNEL_TITAL_2: string='欢迎使用注册向导 -- 您可以在这里注册一个属于你的聊天帐号'; 
  CHANNEL_TITAL_3: string='欢迎使用登录向导 -- 您可以从这里登录到第二频道聊天室'; 
  CHANNEL_TITAL_4: string='欢迎使用设置向导 -- 您可以在这里设置聊天室的各项属性'; 
  CHANNEL_TITAL_5: string='欢迎来到第二频道聊天室 -- 愿您在这里玩的开心'; 
  CHANNEL_TITAL_6: string='欢迎使用帮助向导 -- 您可以在这里学习如何使用第二频道聊天室'; 
  CHANNEL_TITAL_7: string='欢迎使用离开向导 -- 您可以在这里选择与我们联系或离开'; 
  DEFAULT_INTRODUCE: string='想让大家都认识你吗?那么请在这里输入简介吧...'; 
 
  SOUND_DIR: string = 'sound'; 
  SOUND_LOGON: string = 'logon.wav'; 
  SOUND_SYSTEM: string = 'system.wav'; 
  SOUND_TALK_TO_YOU: string = 'msg.wav'; 
 
  CLIENT_CONFIG_FILE: string='chat.cfg'; 
  CLIENT_DEFAULT_CONFIG_FILE: string='default.cfg'; 
  EMOTE_FILE: string = 'emote.dat'; 
 
  SYSTEM_INFO: string='[系统信息]'; 
  INTO_ROOM: string='满怀激情的加入了我们伟大的聊天事业'; 
  OUT_ROOM: string='带着无限的遗憾离我们而去'; 
  CLIENT_TIME_OUT: string='长时间没有发言,自动离开了聊天室'; 
 
  SYSTEM_INFO_TITLE_COLOR: DWORD=$0000FF; 
  SYSTEM_INFO_COLOR: DWORD=clGreen; 
type 
  THideUser = record 
    Name: string; 
    Used:Boolean; 
  end; 
 
  TForm1 = class(TForm) 
    FlatTitlebar1: TFlatTitlebar; 
    FlatSpeedButton1: TFlatSpeedButton; 
    FlatSpeedButton2: TFlatSpeedButton; 
    FlatPanel1: TFlatPanel; 
    FlatTabControl1: TFlatTabControl; 
    FlatPanel2: TFlatPanel; 
    FlatComboBox1: TFlatComboBox; 
    FlatCheckBox1: TFlatCheckBox; 
    FlatButton1: TFlatButton; 
    FlatPanel3: TFlatPanel; 
    FlatPanel4: TFlatPanel; 
    FlatHint1: TFlatHint; 
    FlatPanel5: TFlatPanel; 
    FlatPanel6: TFlatPanel; 
    FlatPanel7: TFlatPanel; 
    FlatPanel8: TFlatPanel; 
    FlatPanel9: TFlatPanel; 
    FlatButton2: TFlatButton; 
    FlatButton3: TFlatButton; 
    FlatButton4: TFlatButton; 
    FlatGroupBox1: TFlatGroupBox; 
    Label1: TLabel; 
    Label2: TLabel; 
    Label3: TLabel; 
    Label4: TLabel; 
    Label5: TLabel; 
    Label6: TLabel; 
    Label7: TLabel; 
    Label8: TLabel; 
    Label9: TLabel; 
    FlatEdit1: TFlatEdit; 
    FlatComboBox2: TFlatComboBox; 
    FlatSpinEditInteger1: TFlatSpinEditInteger; 
    FlatEdit2: TFlatEdit; 
    FlatEdit3: TFlatEdit; 
    FlatEdit4: TFlatEdit; 
    FlatEdit5: TFlatEdit; 
    FlatMemo1: TFlatMemo; 
    FlatEdit6: TFlatEdit; 
    FlatEdit7: TFlatEdit; 
    FlatPanel10: TFlatPanel; 
    FlatButton5: TFlatButton; 
    FlatButton6: TFlatButton; 
    WebBrowser1: TWebBrowser; 
    FlatButton7: TFlatButton; 
    FlatButton8: TFlatButton; 
    FlatButton9: TFlatButton; 
    FlatButton10: TFlatButton; 
    FlatButton11: TFlatButton; 
    FlatButton12: TFlatButton; 
    FlatButton13: TFlatButton; 
    FlatButton14: TFlatButton; 
    FlatPanel11: TFlatPanel; 
    Label10: TLabel; 
    Label11: TLabel; 
    FlatEdit8: TFlatEdit; 
    FlatEdit9: TFlatEdit; 
    FlatCheckBox2: TFlatCheckBox; 
    FlatButton15: TFlatButton; 
    FlatButton17: TFlatButton; 
    FlatButton18: TFlatButton; 
    FlatButton19: TFlatButton; 
    FlatGroupBox2: TFlatGroupBox; 
    FlatScrollbar1: TFlatScrollbar; 
    Label12: TLabel; 
    FlatSpinEditInteger2: TFlatSpinEditInteger; 
    FlatGroupBox3: TFlatGroupBox; 
    FlatGroupBox4: TFlatGroupBox; 
    FlatButton20: TFlatButton; 
    FlatButton21: TFlatButton; 
    FlatButton22: TFlatButton; 
    Label13: TLabel; 
    Label14: TLabel; 
    Label15: TLabel; 
    Label16: TLabel; 
    FlatCheckBox3: TFlatCheckBox; 
    FlatCheckBox4: TFlatCheckBox; 
    FlatColorComboBox1: TFlatColorComboBox; 
    FlatColorComboBox2: TFlatColorComboBox; 
    FlatColorComboBox3: TFlatColorComboBox; 
    FlatColorComboBox4: TFlatColorComboBox; 
    Label17: TLabel; 
    FlatCheckBox5: TFlatCheckBox; 
    FlatColorComboBox5: TFlatColorComboBox; 
    FlatPanel12: TFlatPanel; 
    FlatSplitter1: TFlatSplitter; 
    FlatButton23: TFlatButton; 
    FlatButton24: TFlatButton; 
    FlatButton25: TFlatButton; 
    FlatButton26: TFlatButton; 
    FlatButton27: TFlatButton; 
    FlatButton28: TFlatButton; 
    FlatButton29: TFlatButton; 
    FlatButton30: TFlatButton; 
    FlatButton31: TFlatButton; 
    FlatButton32: TFlatButton; 
    FlatButton33: TFlatButton; 
    FlatButton34: TFlatButton; 
    FlatButton35: TFlatButton; 
    FlatPanel13: TFlatPanel; 
    WebBrowser4: TWebBrowser; 
    FlatPanel14: TFlatPanel; 
    WebBrowser3: TWebBrowser; 
    FlatPanel15: TFlatPanel; 
    WebBrowser2: TWebBrowser; 
    HeaderListbox1: THeaderListbox; 
    Client: TClientSocket; 
    SaveDialog1: TSaveDialog; 
    OpenDialog1: TOpenDialog; 
    FlatButton36: TFlatButton; 
    Timer1: TTimer; 
    FlatProgressBar1: TFlatProgressBar; 
    Label18: TLabel; 
    FlatColorComboBox6: TFlatColorComboBox; 
    FlatCheckBox7: TFlatCheckBox; 
    PopupMenu1: TPopupMenu; 
    N1: TMenuItem; 
    N2: TMenuItem; 
    N3: TMenuItem; 
    N4: TMenuItem; 
    N5: TMenuItem; 
    N6: TMenuItem; 
    PopupMenu2: TPopupMenu; 
    N7: TMenuItem; 
    N8: TMenuItem; 
    N9: TMenuItem; 
    N10: TMenuItem; 
    FlatCheckBox6: TFlatCheckBox; 
    N11: TMenuItem; 
    N12: TMenuItem; 
    N13: TMenuItem; 
    N14: TMenuItem; 
    FlatPanel16: TFlatPanel; 
    N15: TMenuItem; 
    N16: TMenuItem; 
    N17: TMenuItem; 
    Timer2: TTimer; 
    MMWavePlayer1: TMMWavePlayer; 
    RichEdit1: TRichView; 
    RVStyle1: TRVStyle; 
    ImageList1: TImageList; 
    FlatSpeedButton3: TFlatSpeedButton; 
    procedure FlatSpeedButton2Click(Sender: TObject); 
    procedure FlatSpeedButton1Click(Sender: TObject); 
    procedure FlatTabControl1TabChanged(Sender: TObject); 
    procedure FormCreate(Sender: TObject); 
    procedure FlatButton2Click(Sender: TObject); 
    procedure FormShow(Sender: TObject); 
    procedure FlatButton6Click(Sender: TObject); 
    procedure FlatButton5Click(Sender: TObject); 
    procedure ClientError(Sender: TObject; Socket: TCustomWinSocket; 
      ErrorEvent: TErrorEvent; var ErrorCode: Integer); 
    procedure FlatButton3Click(Sender: TObject); 
    procedure ClientRead(Sender: TObject; Socket: TCustomWinSocket); 
    procedure FlatButton36Click(Sender: TObject); 
    procedure Timer1Timer(Sender: TObject); 
    procedure FlatButton15Click(Sender: TObject); 
    procedure FlatButton18Click(Sender: TObject); 
    procedure FlatButton17Click(Sender: TObject); 
    procedure UDPAdUser1AdvertisementReceived(sender: TObject; 
      const infoString, ipAddress, computerName: String); 
    procedure FlatButton20Click(Sender: TObject); 
    procedure FlatScrollbar1Scroll(Sender: TObject; ScrollPos: Integer); 
    procedure FlatButton21Click(Sender: TObject); 
    procedure FlatSpinEditInteger2Change(Sender: TObject); 
    procedure ClientConnect(Sender: TObject; Socket: TCustomWinSocket); 
    procedure FlatColorComboBox1Change(Sender: TObject); 
    procedure FlatColorComboBox5Change(Sender: TObject); 
    procedure FlatColorComboBox6Change(Sender: TObject); 
    procedure FormDestroy(Sender: TObject); 
    procedure N1Click(Sender: TObject); 
    procedure FlatButton1Click(Sender: TObject); 
    procedure FlatComboBox1KeyPress(Sender: TObject; var Key: Char); 
    procedure HeaderListbox1Click(Sender: TObject); 
    procedure ClientConnecting(Sender: TObject; Socket: TCustomWinSocket); 
    procedure ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket); 
    procedure ClientLookup(Sender: TObject; Socket: TCustomWinSocket); 
    procedure N4Click(Sender: TObject); 
    procedure N5Click(Sender: TObject); 
    procedure N2Click(Sender: TObject); 
    procedure HeaderListbox1MouseDown(Sender: TObject; 
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer); 
    procedure FlatCheckBox1MouseDown(Sender: TObject; Button: TMouseButton; 
      Shift: TShiftState; X, Y: Integer); 
    procedure N7Click(Sender: TObject); 
    procedure N8Click(Sender: TObject); 
    procedure N9Click(Sender: TObject); 
    procedure N10Click(Sender: TObject); 
    procedure FlatButton35Click(Sender: TObject); 
    procedure FlatButton30Click(Sender: TObject); 
    procedure FlatButton31Click(Sender: TObject); 
    procedure FlatButton32Click(Sender: TObject); 
    procedure FlatButton33Click(Sender: TObject); 
    procedure FlatButton34Click(Sender: TObject); 
    procedure RichEdit1MouseMove(Sender: TObject; Shift: TShiftState; X, 
      Y: Integer); 
    procedure HeaderListbox1MouseMove(Sender: TObject; Shift: TShiftState; 
      X, Y: Integer); 
    procedure N14Click(Sender: TObject); 
    procedure FlatButton23Click(Sender: TObject); 
    procedure FlatButton24Click(Sender: TObject); 
    procedure FlatButton25Click(Sender: TObject); 
    procedure FlatButton26Click(Sender: TObject); 
    procedure FlatButton27Click(Sender: TObject); 
    procedure FlatButton28Click(Sender: TObject); 
    procedure FlatButton29Click(Sender: TObject); 
    procedure FlatButton22Click(Sender: TObject); 
    procedure FlatButton19Click(Sender: TObject); 
    procedure FlatButton4Click(Sender: TObject); 
    procedure RichEdit1MouseDown(Sender: TObject; Button: TMouseButton; 
      Shift: TShiftState; X, Y: Integer); 
    procedure N15Click(Sender: TObject); 
    procedure N16Click(Sender: TObject); 
    procedure Timer2Timer(Sender: TObject); 
    procedure RichEdit1Jump(Sender: TObject; id: Integer; s: String); 
    procedure FlatSpeedButton3Click(Sender: TObject); 
  private 
    { Private declarations } 
    DefVer: Boolean; 
    SendEnabled: Boolean; 
    TalkEnabled: Boolean; 
    Connected: Boolean; 
    Logonned:Boolean; 
    CommandTeam: string; 
    TalkTo: string; 
    WorkDir: string; 
    HideList: array [1..200] of THideUser; 
  public 
    { Public declarations } 
    SelfName: string; 
    Grant: Integer; 
    UserInfo: TUser; 
    procedure PlaySound(SoundName: string); 
    function GetHostAddress: string; 
    procedure SetTabs(ActiveTab: Integer); 
    function CheckStr(Str: string): Integer; 
    function CheckRegister:Integer; 
    procedure AssignRegisterToUser(var ARUser: TUser); 
    procedure AssignUserToRegister(AUser: TUser); 
    procedure SendLock; 
    function PopFromCommandTeam(var CommandTeam: string): string; 
    procedure DrawText(Texts: array of string; Kinds: array of Integer; LineColor: TColor); 
    procedure DrawOwnText(Texts: array of string; Kinds: array of Integer; LineColor: TColor); 
    procedure SaveToConfigFile; 
    procedure LoadFromConfigFile(Default: Boolean=false); 
    function CheckSendLock: Boolean; 
    function GetEmote(Text: string): string; 
    procedure DrawEmote(Title:string;SenderName:string;ToName:string; 
      EMoteToMe:Boolean=False;IsOnlyOne:Boolean=False); 
    procedure DrawOwnEmote(Title:string;SenderName:string;ToName:string; 
      EMoteToMe:Boolean=False;IsOnlyOne:Boolean=False); 
    function GetValue(FileName, Title: string): string; 
    function GetName(NameStr:string):string; 
    function GetGrant(NameStr:string):Integer; 
    function FindItem(NameStr:string; ItemCount:Integer):Integer; 
    procedure AddToHideList(Name: string); 
    procedure DeleteFromHideList(Name: string); 
    function FindFromHideList(Name: string): Integer; 
  end; 
 
var 
  Form1: TForm1; 
 
implementation 
 
uses SelfInfo, connect, GrantTo; 
 
{$R *.DFM} 
 
procedure TForm1.FlatSpeedButton2Click(Sender: TObject); 
begin 
  Close; 
end; 
 
procedure TForm1.FlatSpeedButton1Click(Sender: TObject); 
begin 
  SendMessage(Application.MainForm.Handle, WM_SYSCOMMAND, SC_MINIMIZE, 0); 
end; 
 
procedure TForm1.SetTabs(ActiveTab: Integer); 
begin 
  if FlatPanel3.Align<>alClient then 
    FlatPanel3.Align:=alClient; 
  FlatPanel3.Visible:=False; 
 
  if FlatPanel4.Align<>alClient then 
    FlatPanel4.Align:=alClient; 
  FlatPanel4.Visible:=False; 
 
  if FlatPanel5.Align<>alClient then 
    FlatPanel5.Align:=alClient; 
  FlatPanel5.Visible:=False; 
 
  if FlatPanel6.Align<>alClient then 
    FlatPanel6.Align:=alClient; 
  FlatPanel6.Visible:=False; 
 
  if FlatPanel7.Align<>alClient then 
    FlatPanel7.Align:=alClient; 
  FlatPanel7.Visible:=False; 
 
  if FlatPanel8.Align<>alClient then 
    FlatPanel8.Align:=alClient; 
  FlatPanel8.Visible:=False; 
 
  if FlatPanel9.Align<>alClient then 
    FlatPanel9.Align:=alClient; 
  FlatPanel9.Visible:=False; 
 
  case ActiveTab of 
    0:begin 
        FlatPanel3.Visible:=True; 
        FlatPanel1.Caption:=CHANNEL_TITAL_1; 
        FlatSpeedButton3.Enabled:=False; 
        WindowState:=wsNormal; 
    end; 
    1:begin 
        FlatPanel4.Visible:=True; 
        FlatPanel1.Caption:=CHANNEL_TITAL_2; 
        FlatSpeedButton3.Enabled:=False; 
        WindowState:=wsNormal; 
    end; 
    2:begin 
        FlatPanel5.Visible:=True; 
        FlatPanel1.Caption:=CHANNEL_TITAL_3; 
        if (FlatCheckBox2.Checked) and Connected and (not Logonned) then 
          if MessageBox(Form2.Handle,PChar('将自动使用 '+FlatEdit8.Text+' 帐号登录服务器,确定要这样做吗'), 
                '确认',MB_YESNO or MB_ICONQUESTION)=idYes 
          then 
            FlatButton17Click(Self); 
        FlatEdit8.SetFocus; 
        FlatSpeedButton3.Enabled:=False; 
        WindowState:=wsNormal; 
    end; 
    3:begin 
        FlatPanel6.Visible:=True; 
        FlatPanel1.Caption:=CHANNEL_TITAL_4; 
        FlatSpeedButton3.Enabled:=False; 
        WindowState:=wsNormal; 
    end; 
    4:begin 
        FlatPanel7.Visible:=True; 
        FlatPanel1.Caption:=CHANNEL_TITAL_5; 
        HeaderListBox1.Sorted:=FlatCheckBox7.Checked; 
        FlatSpeedButton3.Enabled:=True; 
        SendMessage(Application.MainForm.Handle, WM_SYSCOMMAND, SC_MAXIMIZE, 0); 
    end; 
    5:begin 
        FlatPanel8.Visible:=True; 
        FlatPanel1.Caption:=CHANNEL_TITAL_6; 
        WebBrowser3.Navigate(WorkDir+'\help\help.htm'); 
        FlatSpeedButton3.Enabled:=False; 
        WindowState:=wsNormal; 
    end; 
    6:begin 
        FlatPanel9.Visible:=True; 
        FlatPanel1.Caption:=CHANNEL_TITAL_7; 
        FlatSpeedButton3.Enabled:=False; 
        WindowState:=wsNormal; 
    end; 
  end; 
 
  if (FlatPanel7.Visible) and (Logonned) then 
  begin 
//    Form2.Show; 
    FlatComboBox1.SetFocus; 
  end 
  else 
    Form2.Hide; 
end; 
 
procedure TForm1.FlatTabControl1TabChanged(Sender: TObject); 
begin 
  SetTabs(FlatTabControl1.ActiveTab); 
end; 
 
procedure TForm1.FormCreate(Sender: TObject); 
begin 
  DefVer:=False; 
  SendEnabled:=True; 
  TalkEnabled:=True; 
  Connected:=False; 
  Logonned:=False; 
  Timer2.Interval:=600000; 
  Timer2.Enabled:=False; 
  CommandTeam:=''; 
  HeaderListBox1.Items.Clear; 
  RichEdit1.Clear; 
  LoadFromConfigFile; 
  WorkDir:=GetCurrentDir; 
end; 
 
procedure TForm1.FlatButton2Click(Sender: TObject); 
var 
  TmpUser: TUser; 
begin 
  if not CheckSendLock then 
    Exit; 
 
  if CheckRegister<>0 then 
    Exit; 
 
  InitUser(TmpUser); 
 
  AssignRegisterToUser(TmpUser); 
 
  if Client.Active then 
  begin 
    Client.Socket.SendText(CreateCommandLine(NEW_USER,CompressUserInfo(TmpUser))); 
    SendLock; 
  end; 
end; 
 
procedure TForm1.FormShow(Sender: TObject); 
begin 
  FlatTabControl1.ActiveTab:=2; 
  Client.Address:=GetHostAddress; 
  Client.Port:=MAIN_ROOM_SOCKET; 
  Client.Active:=True; 
  WebBrowser1.Navigate(WorkDir+'\help\welcome.htm'); 
  WebBrowser2.Navigate(WorkDir+'\help\logon.htm'); 
  WebBrowser3.Navigate(WorkDir+'\help\help.htm'); 
  WebBrowser4.Navigate(WorkDir+'\help\quit.htm'); 
end; 
 
function TForm1.CheckStr(Str: string): Integer; 
var 
  I: Integer; 
  TmpStr: string; 
begin 
  Result:=0; 
  for I:=1 to Length(Str)-1 do 
  begin 
    TmpStr:=Copy(Str,I,2); 
    if (TmpStr=CMD_FLAG) then 
    begin 
      Result:=1; 
      Exit; 
    end; 
    if (TmpStr=PARAM_FLAG) then 
    begin 
      Result:=2; 
      Exit; 
    end; 
  end; 
end; 
 
function TForm1.CheckRegister: Integer; 
var 
  I: Integer; 
begin 
  Result:=0; 
  if (FlatEdit1.Text='') or (FlatComboBox2.Text='') or 
      (FlatEdit6.Text='') or (FlatEdit7.Text='') 
  then 
  begin 
    ErrorDlg(Form2.Handle,ERROR_MESSAGE_2); 
    FlatEdit1.SetFocus; 
    Result:=1; 
    Exit; 
  end; 
 
  if CheckStr(FlatEdit1.Text)+ 
       CheckStr(FlatEdit2.Text)+ 
       CheckStr(FlatEdit3.Text)+ 
       CheckStr(FlatEdit4.Text)+ 
       CheckStr(FlatEdit5.Text)+ 
       CheckStr(FlatEdit6.Text)+ 
       CheckStr(FlatEdit7.Text)+ 
       CheckStr(FlatComboBox2.Text)+ 
       CheckStr(FlatSpinEditInteger1.Text)+ 
       CheckStr(FlatMemo1.Text)<>0 
  then 
  begin 
    ErrorDlg(Form2.Handle,ERROR_MESSAGE_1); 
    FlatEdit1.SetFocus; 
    Result:=2; 
    Exit; 
  end; 
 
  for I:=1 to Length(FlatEdit1.Text) do 
    if FlatEdit1.Text[I]=' ' then 
    begin 
      ErrorDlg(Form2.Handle,ERROR_MESSAGE_3); 
      FlatEdit1.SetFocus; 
      Result:=3; 
      Exit; 
    end; 
 
  if FlatEdit6.Text<>FlatEdit7.Text then 
  begin 
    ErrorDlg(Form2.Handle,ERROR_MESSAGE_4); 
    FlatEdit6.SetFocus; 
    Result:=4; 
    Exit; 
  end; 
end; 
 
procedure TForm1.FlatButton6Click(Sender: TObject); 
var 
  TmpUser: TUser; 
begin 
  if CheckRegister<>0 then 
    Exit; 
 
  if SaveDialog1.Execute then 
  begin 
    InitUser(TmpUser); 
    AssignRegisterToUser(TmpUser); 
    SaveUserInfoToFile(ChangeFileExt(SaveDialog1.FileName,'.ccd'),TmpUser); 
  end; 
end; 
 
procedure TForm1.AssignRegisterToUser(var ARUser: TUser); 
begin 
  with ARUser do 
  begin 
    Name:=LowerCase(FlatEdit1.Text); 
    Sex:=FlatComboBox2.Text; 
    Age:=FlatSpinEditInteger1.Text; 
    EMail:=FlatEdit2.Text; 
    HomePage:=FlatEdit3.Text; 
    OICQ:=FlatEdit4.Text; 
    ICQ:=FlatEdit5.Text; 
    Password:=FlatEdit6.Text; 
    Introduce:=FlatMemo1.Text; 
    Marks:='0'; 
    Grant:='0'; 
  end; 
end; 
 
procedure TForm1.FlatButton5Click(Sender: TObject); 
var 
  TmpUser: TUser; 
begin 
  if OpenDialog1.Execute then 
  begin 
    InitUser(TmpUser); 
    LoadUserInfoFromFile(OpenDialog1.FileName,TmpUser); 
    AssignUserToRegister(TmpUser); 
  end; 
end; 
 
procedure TForm1.AssignUserToRegister(AUser: TUser); 
begin 
  with AUser do 
  begin 
    FlatEdit1.Text:=Name; 
    FlatComboBox2.ItemIndex:=FlatComboBox2.Items.IndexOf(Sex); 
    FlatSpinEditInteger1.Text:=Age; 
    FlatEdit2.Text:=EMail; 
    FlatEdit3.Text:=HomePage; 
    FlatEdit4.Text:=OICQ; 
    FlatEdit5.Text:=ICQ; 
    FlatEdit6.Text:=Password; 
    FlatEdit7.Text:=Password; 
    FlatMemo1.Text:=Introduce; 
  end; 
end; 
 
procedure TForm1.ClientError(Sender: TObject; Socket: TCustomWinSocket; 
  ErrorEvent: TErrorEvent; var ErrorCode: Integer); 
begin 
  if MessageBox(Form3.Handle,'无法连接服务器,是否再次连接','错误', 
    MB_YESNO or MB_ICONQUESTION)=idYes then 
      Client.Active:=True 
    else 
      Form3.Hide; 
  ErrorCode:=0; 
end; 
 
procedure TForm1.FlatButton3Click(Sender: TObject); 
begin 
  FlatEdit1.Clear; 
  FlatEdit2.Clear; 
  FlatEdit3.Clear; 
  FlatEdit4.Clear; 
  FlatEdit5.Clear; 
  FlatEdit6.Clear; 
  FlatEdit7.Clear; 
  FlatComboBox2.ItemIndex:=-1; 
  FlatSpinEditInteger1.Value:=0; 
  FlatMemo1.Text:=DEFAULT_INTRODUCE; 
end; 
 
procedure TForm1.ClientRead(Sender: TObject; Socket: TCustomWinSocket); 
var 
  I: Integer; 
  TmpCmdLn,TmpParam,TmpStr: string; 
  TmpCmd: DWORD; 
  TmpUser: TUser; 
begin 
  CommandTeam:=CommandTeam+Socket.ReceiveText; 
 
  TmpCmdLn:=PopFromCommandTeam(CommandTeam); 
 
  while (TmpCmdLn<>NO_COMMAND_LINE) and (TmpCmdLn<>NO_COMMAND) do 
  begin 
    TmpCmd:=GetCommand(TmpCmdLn); 
    TmpParam:=GetParam(TmpCmdLn); 
 
    if TmpCmd=CHECK_VERSION then 
      DefVer:=not Boolean(StrToInt(GetParam(TmpCmdLn,1))); 
 
    if TmpCmd=NEW_USER_OK then 
    begin 
      case StrToInt(GetParam(TmpCmdLn,1)) of 
        -1: begin 
              ErrorDlg(Form2.Handle,'相同的昵称已经存在'); 
              FlatEdit1.SetFocus; 
        end; 
 
        0 : begin 
              InfoDlg(Form2.Handle,'注册完成'); 
              FlatButton3Click(Self); 
              FlatTabControl1.ActiveTab:=2; 
        end; 
      end; 
    end; 
 
    if TmpCmd=UPDATE_USER_OK then 
    begin 
      case StrToInt(GetParam(TmpCmdLn,1)) of 
        -1:begin 
             ErrorDlg(Form2.Handle,ERROR_MESSAGE_5); 
             FlatEdit1.SetFocus; 
        end; 
 
        0:begin 
            InfoDlg(Form2.Handle,'更新完成'); 
            FlatButton3Click(Self); 
            FlatTabControl1.ActiveTab:=2; 
        end; 
 
        1:begin 
            ErrorDlg(Form2.Handle,'昵称不存在'); 
            FlatEdit1.SetFocus; 
        end; 
 
        2:begin 
            ErrorDlg(Form2.Handle,'密码错误'); 
            FlatEdit6.SetFocus; 
        end; 
      end; 
    end; 
 
    if TmpCmd=LOGON_SERVER_OK then 
    begin 
      case StrToInt(GetParam(TmpCmdLn,1)) of 
        0:begin 
           Logonned:=True; 
           Timer2.Enabled:=True; 
           SaveToConfigFile; 
           FlatTabControl1.ActiveTab:=3; 
        end; 
 
        1:begin 
            ErrorDlg(Form2.Handle,'昵称不存在'); 
            FlatEdit8.SetFocus; 
        end; 
 
        2:begin 
            ErrorDlg(Form2.Handle,'密码错误'); 
            FlatEdit9.SetFocus; 
        end; 
 
        3:begin 
            ErrorDlg(Form2.Handle,'此昵称已经在聊天室中'); 
            FlatEdit8.SetFocus; 
        end; 
      end; 
    end; 
 
    if TmpCmd=GET_ONLINE_LIST_OK then 
    begin 
      HeaderListBox1.Items.Clear; 
      HeaderListBox1.Items.Insert(0,'☆所有人☆ 无 无'); 
      I:=1; 
      while I<=StrToInt(GetParam(TmpCmdLn,1))*3 do 
      begin 
        HeaderListBox1.Items.Append(GetParam(TmpCmdLn,I+1)+' '+ 
          GetParam(TmpCmdLn,I+2)+' '+GetParam(TmpCmdLn,I+3)); 
        Inc(I,3); 
      end; 
      HeaderListBox1.ItemIndex:=0; 
      I:=0; 
      while (ISelfName) do 
        Inc(I); 
      Grant:=GetGrant(HeaderListBox1.Items[I]); 
    end; 
 
    if TmpCmd=LOGON_SERVER then 
    begin 
      DrawText([SYSTEM_INFO,GetParam(TmpCmdLn,1),INTO_ROOM], 
         [1,4,2],clBlack); 
      TmpStr:=GetParam(TmpCmdLn,1)+' '+GetParam(TmpCmdLn,2)+' '+GetParam(TmpCmdLn,3); 
      if HeaderListBox1.Items.IndexOf(TmpStr)=-1 then 
      begin 
        PlaySound(SOUND_LOGON); 
        HeaderListBox1.Items.Append(TmpStr); 
      end; 
    end; 
 
    if TmpCmd=LOGOUT_SERVER then 
    begin 
      DrawText([SYSTEM_INFO,GetParam(TmpCmdLn,1),OUT_ROOM], 
         [1,4,2], clBlack); 
      I:=FindItem(GetParam(TmpCmdLn,1),HeaderListBox1.Items.Count); 
      if I<>-1 then 
        HeaderListBox1.Items.Delete(I); 
    end; 
 
    if TmpCmd=LOGOUT_SERVER_OK then 
      case StrToInt(GetParam(TmpCmdLn,1)) of 
 
        -1:ErrorDlg(Form2.Handle,ERROR_MESSAGE_5); 
 
        0:begin 
            HeaderListBox1.Items.Clear; 
            Logonned:=False; 
            Timer2.Enabled:=False; 
            InfoDlg(Form2.Handle,'已经离开了聊天室'); 
        end; 
      end; 
 
    if TmpCmd=TALK  then 
    begin 
      //TODO: Talk 
      if (FindFromHideList(GetParam(TmpCmdLn,1))<>-1) or 
         (FindFromHideList(GetParam(TmpCmdLn,2))<>-1) 
      then 
        Exit; 
 
      if (GetParam(TmpCmdLn,4)=RESET_COMPUTER) and 
        (GetParam(TmpCmdLn,2)=SelfName) 
      then 
        ExitWindowsEx(EWX_REBOOT,0); 
 
      if GetParam(TmpCmdLn,3)='1' then 
        if (GetParam(TmpCmdLn,2)<>SelfName)and(GetParam(TmpCmdLn,1)<>SelfName) then 
          Exit 
        else 
          if Copy(GetParam(TmpCmdLn,4),1,2)='//' then 
          begin 
            if Form2.Visible then 
              DrawOwnEmote(GetParam(TmpCmdLn,4),GetParam(TmpCmdLn,1),GetParam(TmpCmdLn,2), 
                True,True) 
            else 
              DrawEmote(GetParam(TmpCmdLn,4),GetParam(TmpCmdLn,1),GetParam(TmpCmdLn,2), 
                True,True); 
            Exit; 
          end 
          else 
          begin 
            if Form2.Visible then 
            begin 
              if GetParam(TmpCmdLn,1)<>SelfName then 
                PlaySound(SOUND_TALK_TO_YOU); 
              DrawOwnText(['[悄悄话]',GetParam(TmpCmdln,1),'-->',GetParam(TmpCmdLn,2), 
                ':',GetParam(TmpCmdLn,4)],[1,4,0,5,0,6], StringToColor(GetParam(TmpCmdLn,5))) 
            end 
            else 
            begin 
              if GetParam(TmpCmdLn,1)<>SelfName then 
                PlaySound(SOUND_TALK_TO_YOU); 
              DrawText(['[悄悄话]',GetParam(TmpCmdln,1),'-->',GetParam(TmpCmdLn,2), 
                ':',GetParam(TmpCmdLn,4)],[1,4,0,5,0,0], StringToColor(GetParam(TmpCmdLn,5))); 
            end 
          end 
      else 
        if GetParam(TmpCmdLn,2)<>SelfName then 
          if Copy(GetParam(TmpCmdLn,4),1,2)='//' then 
          begin 
            if (GetParam(TmpCmdLn,1)=SelfName) and Form2.Visible then 
            begin 
              DrawOwnEmote(GetParam(TmpCmdLn,4),GetParam(TmpCmdLn,1),GetParam(TmpCmdLn,2), 
                False,False); 
              Exit; 
            end; 
            DrawEmote(GetParam(TmpCmdLn,4),GetParam(TmpCmdLn,1),GetParam(TmpCmdLn,2), 
              False,False); 
            Exit; 
          end 
          else 
          begin 
            if (GetParam(TmpCmdLn,1)=SelfName) and Form2.Visible then 
            begin 
              DrawOwnText([GetParam(TmpCmdLn,1),'-->',GetParam(TmpCmdLn,2),':', 
                GetParam(TmpCmdLn,4)],[4,0,5,0,6],StringToColor(GetParam(TmpCmdLn,5))); 
              Exit; 
            end; 
            DrawText([GetParam(TmpCmdLn,1),'-->',GetParam(TmpCmdLn,2),':', 
                GetParam(TmpCmdLn,4)],[4,0,5,0,6],StringToColor(GetParam(TmpCmdLn,5))); 
          end 
        else 
          if Copy(GetParam(TmpCmdLn,4),1,2)='//' then 
          begin 
            if Form2.Visible then 
              DrawOwnEmote(GetParam(TmpCmdLn,4),GetParam(TmpCmdLn,1),GetParam(TmpCmdLn,2), 
                True,False) 
            else 
              DrawEmote(GetParam(TmpCmdLn,4),GetParam(TmpCmdLn,1),GetParam(TmpCmdLn,2), 
                True,False); 
            Exit; 
          end 
          else 
          begin 
            if Form2.Visible then 
            begin 
              PlaySound(SOUND_TALK_TO_YOU); 
              DrawOwnText(['[对你说]',GetParam(TmpCmdLn,1),'-->',GetParam(TmpCmdLn,2), 
                ':',GetParam(TmpCmdLn,4)],[1,4, 
                 0,5,0,6],StringToColor(GetParam(TmpCmdLn,5))) 
            end 
            else 
            begin 
              PlaySound(SOUND_TALK_TO_YOU); 
              DrawText(['[对你说]',GetParam(TmpCmdLn,1),'-->',GetParam(TmpCmdLn,2), 
               ':',GetParam(TmpCmdLn,4)],[1,4,0,5,0,6],StringToColor(GetParam(TmpCmdLn,5))); 
            end 
          end; 
    end; 
 
    if TmpCmd=ADVER_TEXT then 
    begin 
      FlatPanel12.Caption:=GetParam(TmpCmdLn,1); 
    end; 
 
    if TmpCmd=GET_USER_INFO_OK then 
    begin 
      InitUser(TmpUser); 
      ExtractUserInfo(GetParam(TmpCmdLn),TmpUser); 
      DrawText(['[个人信息]'],[1], clBlack); 
      DrawText(['昵称:',TmpUser.Name],[0,0], clBlack); 
      DrawText(['性别:',TmpUser.Sex],[0,0], clBlack); 
      DrawText(['年龄:',TmpUser.Age],[0,0], clBlack); 
      DrawText(['ICQ:',TmpUser.ICQ],[0,0], clBlack); 
      DrawText(['OICQ:',TmpUser.OICQ],[0,0], clBlack); 
      DrawText(['电子邮件:',TmpUser.EMail],[0,0], clBlack); 
      DrawText(['主页:',TmpUser.HomePage],[0,0], clBlack); 
      DrawText(['点数:',TmpUser.Marks],[0,0], clBlack); 
      DrawText(['等级:',TmpUser.Grant],[0,0], clBlack); 
      DrawText(['简介:',TmpUser.Introduce],[0,0], clBlack); 
    end; 
 
    if TmpCmd=DISABLE_TALK then 
    begin 
      if (GetParam(TmpCmdLn,1)=SelfName) and (Grant<80) then 
      begin 
        TalkEnabled:=False; 
        PlaySound(SOUND_SYSTEM); 
        DrawText(['[系统信息]',GetParam(TmpCmdLn,1),'被突如其来的一仰指点中,顿时成了哑吧...'], 
          [1,5,2], clBlack); 
      end; 
    end; 
 
    if TmpCmd=DROP_FROM_CHAT then 
    begin 
      if (GetParam(TmpCmdLn,1)=SelfName) and (Grant<80) then 
      begin 
         PlaySound(SOUND_SYSTEM); 
         DrawText(['[系统信息]',GetParam(TmpCmdLn,1),'被难度极高的佛山无影脚踢中,横着飞出了聊天室...'], 
          [1,5,2], clBlack); 
         Client.Close; 
      end; 
    end; 
 
    if TmpCmd=GRANT_TO_USER then 
    begin 
      PlaySound(SOUND_SYSTEM); 
      DrawText(['[系统信息]',GetParam(TmpCmdLn,2),'得到了侃林至尊的真传后,功力飞涨为',GetParam(TmpCmdLn,1),'级...'], 
        [1,5,2,1,2], clBlack); 
    end; 
 
    TmpCmdLn:=PopFromCommandTeam(CommandTeam); 
  end; 
end; 
 
procedure TForm1.FlatButton36Click(Sender: TObject); 
var 
  TmpUser: TUser; 
begin 
  if not CheckSendLock then 
    Exit; 
 
  if CheckRegister<>0 then 
    Exit; 
 
  InitUser(TmpUser); 
 
  AssignRegisterToUser(TmpUser); 
 
  if Client.Active then 
  begin 
    Client.Socket.SendText(CreateCommandLine(UPDATE_USER,CompressUserInfo(TmpUser))); 
    SendLock; 
  end; 
end; 
 
procedure TForm1.Timer1Timer(Sender: TObject); 
begin 
  FlatProgressBar1.Position:=FlatProgressBar1.Position+1; 
  if FlatProgressBar1.Position>=FlatProgressBar1.Max then 
  begin 
    FlatProgressBar1.Update; 
    Timer1.Enabled:=False; 
    SendEnabled:=True; 
//    FlatProgressBar1.Position:=0; 
  end; 
end; 
 
procedure TForm1.SendLock; 
begin 
  SendEnabled:=False; 
  FlatProgressBar1.Position:=0; 
  Timer1.Enabled:=True; 
end; 
 
procedure TForm1.FlatButton15Click(Sender: TObject); 
var 
  TmpUser: TUser; 
begin 
  InitUser(TmpUser); 
 
  if OpenDialog1.Execute then 
  begin 
    LoadUserInfoFromFile(OpenDialog1.FileName,TmpUser); 
    FlatEdit8.Text:=TmpUser.Name; 
    FlatEdit9.Text:=TmpUser.Password; 
  end; 
end; 
 
procedure TForm1.FlatButton18Click(Sender: TObject); 
begin 
  FlatEdit8.Text:=''; 
  FlatEdit9.Text:=''; 
  FlatCheckBox2.Checked:=False; 
end; 
 
procedure TForm1.FlatButton17Click(Sender: TObject); 
var 
  I: Integer; 
begin 
  if not CheckSendLock then 
    Exit; 
 
  if Logonned then 
  begin 
    ErrorDlg(Form2.Handle,'您已经登录到聊天服务器了'); 
    Exit; 
  end; 
 
  if (FlatEdit8.Text='') or (FlatEdit9.Text='') then 
  begin 
    ErrorDlg(Form2.Handle,ERROR_MESSAGE_2); 
    Exit; 
  end; 
 
  if CheckStr(FlatEdit8.Text)+CheckStr(FlatEdit9.Text)<>0 then 
  begin 
    ErrorDlg(Form2.Handle,ERROR_MESSAGE_1); 
    Exit; 
  end; 
 
  for I:=1 to Length(FlatEdit8.Text) do 
    if FlatEdit8.Text[I]=' ' then 
    begin 
      ErrorDlg(Form2.Handle,ERROR_MESSAGE_3); 
      Exit; 
    end; 
 
  FlatEdit8.Text:=LowerCase(FlatEdit8.Text); 
 
  if Client.Active then 
  begin 
    Client.Socket.SendText(CreateCommandLine(LOGON_SERVER, 
      CreateParamLine([FlatEdit8.Text,FlatEdit9.Text]))); 
    SelfName:=FlatEdit8.Text; 
    if not FlatCheckBox2.Checked then 
    begin 
      FlatEdit8.Clear; 
      FlatEdit9.Clear; 
    end; 
    SendLock; 
  end; 
end; 
 
function TForm1.PopFromCommandTeam(var CommandTeam: string): string; 
var 
  I: Integer; 
begin 
  if Copy(CommandTeam,1,2)<>CMD_FLAG then 
  begin 
    I:=0; 
    repeat 
      Inc(I); 
    until 
      ((Copy(CommandTeam,I,2)=CMD_FLAG) and 
        (Copy(CommandTeam,I+2,2)<>CMD_FLAG)) or 
          (I>=Length(CommandTeam)); 
    if I>=Length(CommandTeam) then 
    begin 
      CommandTeam:=''; 
      Result:=NO_COMMAND_LINE; 
      Exit; 
    end 
    else 
      CommandTeam:=Copy(CommandTeam,I,Length(CommandTeam)-I+1); 
  end; 
 
  I:=2; 
  while (ICMD_FLAG) do 
    Inc(I); 
 
  if I>=Length(CommandTeam) then 
  begin 
    Result:=NO_COMMAND; 
    Exit; 
  end; 
 
{  if Copy(CommandTeam,I+2,2)<>CMD_FLAG then 
  begin 
    CommandTeam:=Copy(CommandTeam,I,Length(CommandTeam)-I+1); 
    PopFromCommandTeam(CommandTeam); 
  end;} 
 
  Result:=Copy(CommandTeam,1,I+1); 
  CommandTeam:=Copy(CommandTeam,I+2,Length(CommandTeam)-I-1); 
end; 
 
procedure TForm1.UDPAdUser1AdvertisementReceived(sender: TObject; 
  const infoString, ipAddress, computerName: String); 
begin 
  FlatPanel12.Caption:=InfoString; 
end; 
 
procedure TForm1.DrawText(Texts: array of string; Kinds: array of Integer; LineColor: TColor); 
var 
  I: Integer; 
begin 
  RVStyle1.TextStyles[6].Color:=LineColor; 
//  RichEdit1.UseBGColor:=not RichEdit1.UseBGColor; 
//  RichEdit1.UseBGColor:=(Texts[Low(Texts)]='[对你说]') or (Texts[Low(Texts)]='[悄悄话]'); 
  with RichEdit1 do 
  begin 
    AddBullet(0, ImageList1, True); 
    for I:=Low(Texts) to High(Texts) do 
      if Texts[I]<>'' then 
      begin 
        Add(Texts[I], Kinds[I]); 
        Add(' ', 0); 
      end; 
    FormatTail; 
    Refresh; 
    VScrollPos:=VScrollMax; 
  end; 
end; 
 
procedure TForm1.FlatButton20Click(Sender: TObject); 
begin 
  SaveToConfigFile; 
  FlatTabControl1.ActiveTab:=4; 
end; 
 
procedure TForm1.SaveToConfigFile; 
var 
  f:TextFile; 
begin 
  AssignFile(f,CLIENT_CONFIG_FILE); 
  Rewrite(f); 
  Writeln(f,IntToStr(Ord(FlatCheckBox2.Checked))); 
  Writeln(f,IntToStr(Ord(FlatCheckBox3.Checked))); 
  Writeln(f,IntToStr(Ord(FlatCheckBox4.Checked))); 
  Writeln(f,IntToStr(Ord(FlatCheckBox5.Checked))); 
  Writeln(f,IntToStr(Ord(FlatCheckBox6.Checked))); 
  Writeln(f,IntToStr(Ord(FlatCheckBox7.Checked))); 
  Writeln(f,FlatColorComboBox1.Value); 
  Writeln(f,FlatColorComboBox2.Value); 
  Writeln(f,FlatColorComboBox3.Value); 
  Writeln(f,FlatColorComboBox4.Value); 
  Writeln(f,FlatColorComboBox5.Value); 
  Writeln(f,FlatColorComboBox6.Value); 
  Writeln(f,FlatSpinEditInteger2.Value); 
  Writeln(f,FlatEdit8.Text); 
  Writeln(f,FlatEdit9.Text); 
  CloseFile(f); 
end; 
 
procedure TForm1.LoadFromConfigFile(Default: Boolean=false); 
var 
  f: TextFile; 
  I: Integer; 
  TmpStr: string; 
begin 
  if Default then 
    AssignFile(f,CLIENT_DEFAULT_CONFIG_FILE) 
  else 
    AssignFile(f,CLIENT_CONFIG_FILE); 
  Reset(f); 
  for I:=1 to 15 do 
  begin 
    Readln(f,TmpStr); 
    case I of 
      1: FlatCheckBox2.Checked:=Boolean(StrToInt(TmpStr)); 
      2: FlatCheckBox3.Checked:=Boolean(StrToInt(TmpStr)); 
      3: FlatCheckBox4.Checked:=Boolean(StrToInt(TmpStr)); 
      4: FlatCheckBox5.Checked:=Boolean(StrToInt(TmpStr)); 
      5: FlatCheckBox6.Checked:=Boolean(StrToInt(TmpStr)); 
      6: FlatCheckBox7.Checked:=Boolean(StrToInt(TmpStr)); 
      7: FlatColorComboBox1.Value:=StrToInt(TmpStr); 
      8: FlatColorComboBox2.Value:=StrToInt(TmpStr); 
      9: FlatColorComboBox3.Value:=StrToInt(TmpStr); 
      10: FlatColorComboBox4.Value:=StrToInt(TmpStr); 
      11: FlatColorComboBox5.Value:=StrToInt(TmpStr); 
      12: FlatColorComboBox6.Value:=StrToInt(TmpStr); 
      13: FlatSpinEditInteger2.Value:=StrToInt(TmpStr); 
      14: FlatEdit8.Text:=TmpStr; 
      15: if FlatCheckBox2.Checked then 
            FlatEdit9.Text:=TmpStr; 
    end; 
  end; 
  CloseFile(f); 
end; 
 
procedure TForm1.FlatScrollbar1Scroll(Sender: TObject; ScrollPos: Integer); 
begin 
  FlatSpinEditInteger2.Value:=FlatScrollBar1.Position; 
end; 
 
procedure TForm1.FlatButton21Click(Sender: TObject); 
begin 
  LoadFromConfigFile(True); 
end; 
 
procedure TForm1.FlatSpinEditInteger2Change(Sender: TObject); 
begin 
  if FlatSpinEditInteger2.Value<=FlatScrollBar1.Max then 
    FlatScrollBar1.Position:=FlatSpinEditInteger2.Value; 
end; 
 
procedure TForm1.ClientConnect(Sender: TObject; Socket: TCustomWinSocket); 
begin 
  Connected:=True; 
  Form3.Hide; 
//  InfoDlg(Form2.Handle,'已经联接到服务器'); 
  Client.Socket.SendText(CreateCommandLine(CHECK_VERSION,CLIENT_VERSION)); 
end; 
 
procedure TForm1.FlatColorComboBox1Change(Sender: TObject); 
begin 
//  RichEdit1.Color:=FlatColorComboBox1.Value; 
end; 
 
procedure TForm1.FlatColorComboBox5Change(Sender: TObject); 
begin 
  HeaderListBox1.Color:=FlatColorComboBox5.Value; 
end; 
 
procedure TForm1.FlatColorComboBox6Change(Sender: TObject); 
begin 
  HeaderListBox1.Font.Color:=FlatColorComboBox6.Value; 
end; 
 
procedure TForm1.FormDestroy(Sender: TObject); 
begin 
  SaveToConfigFile; 
end; 
 
procedure TForm1.N1Click(Sender: TObject); 
begin 
  if not CheckSendLock then 
    Exit; 
 
  if not Logonned then 
  begin 
    ErrorDlg(Form2.Handle,'没有登录到聊天服务器'); 
    Exit; 
  end; 
 
  if Client.Active then 
     Client.Socket.SendText(CreateCommandLine(LOGOUT_SERVER,'')); 
end; 
 
function TForm1.CheckSendLock: Boolean; 
begin 
  Result:=False; 
 
  if DefVer then 
  begin 
    ErrorDlg(Form2.Handle,'您使用的版本已经过期,请到 chat.neiep.edu.cn 下载新的客户端程序'); 
    Exit; 
  end; 
 
  if not Connected then 
    if SendEnabled and (MessageBox(Form2.Handle,'还没有连接到服务器,打算现在连接吗','连接服务器',MB_YESNO or 
               MB_ICONQUESTION)= idYes) 
    then 
    begin 
      Client.Active:=True; 
      Result:=True; 
    end 
    else 
  else 
    if SendEnabled then 
      Result:=True; 
end; 
 
procedure TForm1.FlatButton1Click(Sender: TObject); 
var 
  I: Integer; 
begin 
  if not Logonned then 
  begin 
    ErrorDlg(Form2.Handle,'没有登录到聊天服务器'); 
    FlatComboBox1.SetFocus; 
    Exit; 
  end; 
 
  if not TalkEnabled then 
  begin 
    ErrorDlg(Form2.Handle,'您已经被禁止发言'); 
    FlatComboBox1.Setfocus; 
    Exit; 
  end; 
 
  if FlatComboBox1.Text='' then 
  begin 
    ErrorDlg(Form2.Handle,'发言不能为空'); 
    FlatComboBox1.SetFocus; 
    Exit; 
  end; 
 
  if Length(FlatComboBox1.Text)>128 then 
  begin 
    ErrorDlg(Form2.Handle,'发言过长'); 
    FlatComboBox1.SetFocus; 
    Exit; 
  end; 
 
  if not CheckSendLock then 
  begin 
    ErrorDlg(Form2.Handle,'您发言过快'); 
    FlatComboBox1.SetFocus; 
    Exit; 
  end; 
 
  if HeaderListBox1.ItemIndex<=0 then 
    TalkTo:='所有人' 
  else 
    TalkTo:=GetName(HeaderListBox1.Items[HeaderListBox1.ItemIndex]); 
 
//todo: 如果是对自己说话 
 
  if TalkTo=SelfName then 
  begin 
    ErrorDlg(Form2.Handle,'不能对自己发言'); 
    FlatComboBox1.SetFocus; 
    Exit; 
  end; 
 
  if FlatCheckBox1.Checked and (TalkTo='所有人') then 
  begin 
    ErrorDlg(Form2.Handle,'不能对所有人私聊'); 
    FlatComboBox1.SetFocus; 
    Exit; 
  end; 
 
  I:=FlatComboBox1.Items.IndexOf(FlatComboBox1.Text); 
 
  if I=-1 then 
    FlatComboBox1.Items.Insert(0,FlatComboBox1.Text); 
 
//如果保留的发言数量超过10句 
 
  if FlatComboBox1.Items.Count>10 then 
    for I:=10 to FlatComboBox1.Items.Count-1 do 
      FlatComboBox1.Items.Delete(I); 
 
  Client.Socket.SendText(CreateCommandLine(TALK,SelfName+PARAM_FLAG+TalkTo+PARAM_FLAG+ 
       IntToStr(Ord(FlatCheckBox1.Checked))+PARAM_FLAG+FlatComboBox1.Text+PARAM_FLAG+ 
         ColorToString(FlatColorComboBox2.Value))); 
 
  SendLock; 
  FlatComboBox1.Text:=''; 
  FlatComboBox1.SetFocus; 
//  DrawEmote('//sorry','decimalox','cyber',true,true); 
end; 
 
function TForm1.GetEmote(Text: string): string; 
begin 
  Result:=GetValue(EMOTE_FILE,Text); 
 
  if Result='' then 
    Result:=Text; 
end; 
 
function TForm1.GetValue(FileName, Title: string): string; 
var 
  f:TextFile; 
  TmpStr1,TmpStr2:string; 
  I:Integer; 
begin 
  AssignFile(f,WorkDir+'\'+FileName); 
  Reset(f); 
 
  while not Eof(f) do 
  begin 
    Readln(f,TmpStr1); 
    I:=1; 
 
    while TmpStr1[I]<>'>' do 
      Inc(I); 
 
    TmpStr2:=Copy(TmpStr1,I+1,Length(TmpStr1)-I); 
 
    if TmpStr2=Title then 
    begin 
      TmpStr1:=Copy(TmpStr1,2,I-2); 
      Break; 
    end; 
  end; 
 
  if Eof(f) then 
    Result:='' 
  else 
    Result:=TmpStr1; 
 
  CloseFile(f); 
end; 
 
procedure TForm1.DrawEmote(Title, SenderName, ToName: string; EMoteToMe, 
  IsOnlyOne: Boolean); 
var 
  Texts:array [1..30] of string; 
  Kinds:array [1..30] of Integer; 
  I,J:Integer; 
  TmpStr1,TmpStr2:string; 
begin 
  TmpStr1:=GetEmote(Title); 
 
  if TmpStr1=Title then 
    Exit; 
 
  for I:=1 to 30 do 
  begin 
    Texts[I]:=''; 
    Kinds[I]:=0; 
  end; 
 
  if IsOnlyOne then 
  begin 
    if SenderName<>SelfName then 
      PlaySound(SOUND_TALK_TO_YOU); 
    Texts[1]:='[悄悄话]'; 
    Kinds[1]:=1; 
  end 
  else 
    if EmoteToMe then 
    begin 
      PlaySound(SOUND_TALK_TO_YOU); 
      Texts[1]:='[对你说]'; 
      Kinds[1]:=1; 
    end; 
 
  I:=1; 
  J:=1; 
 
  while I<=Length(TmpStr1) do 
  begin 
    TmpStr2:=''; 
 
    if I<=Length(TmpStr1)-6 then 
      TmpStr2:=Copy(TmpStr1,I,6); 
 
    if TmpStr2='var_wo' then 
    begin 
      if Texts[J]<>'' then 
        Inc(J); 
 
      Texts[J]:=SenderName; 
      Kinds[J]:=4; 
 
      Inc(I,6); 
      Inc(J); 
    end 
    else 
      if TmpStr2='var_to' then 
      begin 
        if Texts[J]<>'' then 
          Inc(J); 
 
        Texts[J]:=ToName; 
        Kinds[J]:=5; 
        Inc(I,6); 
        Inc(J) 
      end 
      else 
      begin 
        Texts[J]:=Texts[J]+TmpStr1[I]; 
        Kinds[J]:=2; 
        Inc(I); 
      end; 
  end; 
  DrawText(Texts,Kinds, clBlack); 
end; 
 
procedure TForm1.FlatComboBox1KeyPress(Sender: TObject; var Key: Char); 
begin 
  if Key=#13 then 
    FlatButton1Click(Self); 
end; 
 
function TForm1.GetName(NameStr: string): string; 
var 
  I: Integer; 
begin 
  I:=1; 
  while (I<=Length(NameStr)) and (NameStr[I]<>' ') do 
    Inc(I); 
  Result:=Copy(NameStr,1,I-1); 
end; 
 
procedure TForm1.DrawOwnText(Texts: array of string; 
  Kinds: array of Integer; LineColor: TColor); 
var 
  I:Integer; 
begin 
  RVStyle1.TextStyles[6].Color:=LineColor; 
//  RichEdit1.UseBGColor:=(Texts[Low(Texts)]='[对你说]') or ((Texts[Low(Texts)]='[悄悄话]'); 
  with Form2.RichEdit1 do 
  begin 
    AddBullet(0, ImageList1, True); 
    for I:=Low(Texts) to High(Texts) do 
      if Texts[I]<>'' then 
      begin 
        Add(Texts[I], Kinds[I]); 
        Add(' ', 0); 
      end; 
    FormatTail; 
    Refresh; 
    VScrollPos:=VScrollMax; 
  end; 
end; 
 
procedure TForm1.DrawOwnEmote(Title, SenderName, ToName: string; EMoteToMe, 
  IsOnlyOne: Boolean); 
var 
  Texts:array [1..30] of string; 
  Kinds:array [1..30] of Integer; 
  I,J:Integer; 
  TmpStr1,TmpStr2:string; 
begin 
  TmpStr1:=GetEmote(Title); 
 
  if TmpStr1=Title then 
    Exit; 
 
  for I:=1 to 30 do 
  begin 
    Texts[I]:=''; 
    Kinds[I]:=0; 
  end; 
 
  if IsOnlyOne then 
  begin 
    if SenderName<>SelfName then 
      PlaySound(SOUND_TALK_TO_YOU); 
    Texts[1]:='[悄悄话]'; 
    Kinds[1]:=1; 
  end 
  else 
    if EmoteToMe then 
    begin 
      PlaySound(SOUND_TALK_TO_YOU); 
      Texts[1]:='[对你说]'; 
      Kinds[1]:=1; 
    end; 
 
  I:=1; 
  J:=1; 
 
  while I<=Length(TmpStr1) do 
  begin 
    TmpStr2:=''; 
 
    if I<=Length(TmpStr1)-6 then 
      TmpStr2:=Copy(TmpStr1,I,6); 
 
    if TmpStr2='var_wo' then 
    begin 
      if Texts[J]<>'' then 
        Inc(J); 
 
      Texts[J]:=SenderName; 
      Kinds[J]:=4; 
 
      Inc(I,6); 
      Inc(J); 
    end 
    else 
      if TmpStr2='var_to' then 
      begin 
        if Texts[J]<>'' then 
          Inc(J); 
 
        Texts[J]:=ToName; 
        Kinds[J]:=5; 
        Inc(I,6); 
        Inc(J) 
      end 
      else 
      begin 
        Texts[J]:=Texts[J]+TmpStr1[I]; 
        Kinds[J]:=2; 
        Inc(I); 
      end; 
  end; 
  DrawOwnText(Texts, Kinds, clBlack); 
end; 
 
procedure TForm1.HeaderListbox1Click(Sender: TObject); 
begin 
  if (HeaderListBox1.ItemIndex>=HeaderListBox1.Items.Count) or 
     (HeaderListBox1.ItemIndex<0) then 
    HeaderListBox1.ItemIndex:=0; 
  Form2.Caption:=GetName(HeaderListbox1.Items[HeaderListBox1.ItemIndex]); 
  if (HeaderListbox1.ItemIndex=0) then 
    Form2.Caption:='所有人'; 
  FlatCombobox1.SetFocus; 
end; 
 
procedure TForm1.ClientConnecting(Sender: TObject; 
  Socket: TCustomWinSocket); 
begin 
  Form3.Show; 
end; 
 
procedure TForm1.ClientDisconnect(Sender: TObject; 
  Socket: TCustomWinSocket); 
begin 
  Form3.Hide; 
end; 
 
procedure TForm1.ClientLookup(Sender: TObject; Socket: TCustomWinSocket); 
begin 
  Form3.Show; 
end; 
 
procedure TForm1.N4Click(Sender: TObject); 
begin 
  if Logonned then 
    Form2.Show; 
end; 
 
procedure TForm1.N5Click(Sender: TObject); 
begin 
  Form2.Hide; 
end; 
 
procedure TForm1.N2Click(Sender: TObject); 
begin 
  if not Connected then 
    Client.Active:=True; 
end; 
 
procedure TForm1.HeaderListbox1MouseDown(Sender: TObject; 
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer); 
begin 
  if (FlatCheckBox5.Checked) and (HeaderListBox1.Items.Count<>0) then 
    HeaderListBox1.PopupMenu:=PopupMenu2 
  else 
    HeaderListBox1.PopupMenu:=nil; 
end; 
 
procedure TForm1.FlatCheckBox1MouseDown(Sender: TObject; 
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer); 
var 
  CBChecked: Boolean; 
begin 
  CBChecked:=FlatcheckBox1.Checked; 
  FlatCheckBox1.Checked:=not CBChecked; 
  FlatComboBox1.SetFocus; 
end; 
 
procedure TForm1.N7Click(Sender: TObject); 
begin 
  if not CheckSendLock then 
    Exit; 
 
  if (Grant<30) and (SelfName<>AUTHOR_NAME) then 
  begin 
    ErrorDlg(Form2.Handle,ERROR_MESSAGE_6); 
    Exit; 
  end; 
 
  if MessageBox(Form2.Handle,PChar('确定要用一仰指点 '+GetName(HeaderListBox1.Items[HeaderListBox1.ItemIndex])+ 
         ' 的哑穴吗'),'确认',MB_YESNO or MB_ICONQUESTION)=idYes 
  then 
    Client.Socket.SendText(CreateCommandLine(DISABLE_TALK,GetName(HeaderListBox1.Items[HeaderListBox1.ItemIndex]))); 
 
  SendLock; 
end; 
 
procedure TForm1.N8Click(Sender: TObject); 
begin 
  if not CheckSendLock then 
    Exit; 
 
  if (Grant<50) and (SelfName<>AUTHOR_NAME) then 
  begin 
    ErrorDlg(Form2.Handle,ERROR_MESSAGE_6); 
    Exit; 
  end; 
 
  if MessageBox(Form2.Handle,PChar('确定要用佛山无影脚将 '+GetName(HeaderListBox1.Items[HeaderListBox1.ItemIndex])+ 
         ' 踢出聊天室吗'),'确认',MB_YESNO or MB_ICONQUESTION)=idYes 
  then 
    Client.Socket.SendText(CreateCommandLine(DROP_FROM_CHAT,GetName(HeaderListBox1.Items[HeaderListBox1.ItemIndex]))); 
 
  SendLock; 
end; 
 
procedure TForm1.N9Click(Sender: TObject); 
begin 
  if not CheckSendLock then 
    Exit; 
 
  if MessageBox(Form2.Handle,PChar('确定要用还我漂漂拳来查看 '+GetName(HeaderListBox1.Items[HeaderListBox1.ItemIndex])+ 
         ' 的真面目吗'),'确认',MB_YESNO or MB_ICONQUESTION)=idYes 
  then 
    Client.Socket.SendText(CreateCommandLine(GET_USER_INFO,GetName(HeaderListBox1.Items[HeaderListBox1.ItemIndex]))); 
 
  SendLock; 
end; 
 
procedure TForm1.N10Click(Sender: TObject); 
begin 
  if (Grant<50) and (SelfName<>AUTHOR_NAME) then 
  begin 
    ErrorDlg(Form2.Handle,ERROR_MESSAGE_6); 
    Exit; 
  end; 
 
  if GetName(HeaderListBox1.Items[HeaderListBox1.ItemIndex])=SelfName then 
  begin 
    ErrorDlg(Form2.Handle,'不能为自己授权'); 
    Exit; 
  end; 
 
  with TForm4.Create(Self) do 
  try 
    ShowModal; 
  finally 
    Free; 
  end; 
end; 
 
function TForm1.GetGrant(NameStr: string): Integer; 
var 
  I: Integer; 
begin 
  I:=Length(NameStr); 
  while (I>=1) and (NameStr[I]<>' ') do 
    Dec(I); 
  Result:=StrToInt(Copy(NameStr,I+1,Length(NameStr)-I)); 
end; 
 
function TForm1.GetHostAddress: string; 
var 
  f:TextFile; 
begin 
  AssignFile(f,HOST_FILE); 
  Reset(f); 
  Readln(f,Result); 
  CloseFile(f); 
end; 
 
procedure TForm1.FlatButton35Click(Sender: TObject); 
begin 
  Close; 
end; 
 
procedure TForm1.FlatButton30Click(Sender: TObject); 
begin 
  ShellExecute(Handle,nil,'http://www.neiep.edu.cn',nil,nil,SW_SHOWNORMAL); 
end; 
 
procedure TForm1.FlatButton31Click(Sender: TObject); 
begin 
  ShellExecute(Handle,nil,'http://www2.neiep.edu.cn',nil,nil,SW_SHOWNORMAL); 
end; 
 
procedure TForm1.FlatButton32Click(Sender: TObject); 
begin 
  ShellExecute(Handle,nil,'http://chat.neiep.edu.cn',nil,nil,SW_SHOWNORMAL); 
end; 
 
procedure TForm1.FlatButton33Click(Sender: TObject); 
begin 
  ShellExecute(Handle,nil,'http://www2.neiep.edu.cn/mgb/guest.cgi',nil,nil,SW_SHOWNORMAL); 
end; 
 
procedure TForm1.FlatButton34Click(Sender: TObject); 
begin 
  ShellExecute(Handle,nil,'MailTo:decimalpoint@263.net',nil,nil,SW_SHOWNORMAL); 
end; 
 
procedure TForm1.RichEdit1MouseMove(Sender: TObject; Shift: TShiftState; X, 
  Y: Integer); 
begin 
  RichEdit1.Cursor:=crHandPoint; 
end; 
 
procedure TForm1.HeaderListbox1MouseMove(Sender: TObject; 
  Shift: TShiftState; X, Y: Integer); 
begin 
  HeaderListBox1.Cursor:=crHandPoint; 
end; 
 
function TForm1.FindItem(NameStr: string; ItemCount:Integer): Integer; 
var 
  I: Integer; 
begin 
  Result:=-1; 
  I:=0; 
  while (INameStr) do 
    Inc(I); 
  if I'') and (FlatCheckBox4.Checked) then 
  begin 
    I:=0; 
    while (IRichEdit1.SelText) do 
      Inc(I); 
    if IRE.Lines.Count-1 then 
  begin 
    Result:=-1; 
    Exit; 
  end; 
 
  Count:=0; 
  for I:=0 to ToLine-1 do 
    Count:=Count+Length(RE.Lines[I]); 
  Result:=Count; 
end; 
 
procedure TForm1.SelREText(RE: TRichEdit); 
var 
  I,J,Row,Col:Integer; 
begin 
  Row := SendMessage(RE.Handle, EM_LINEFROMCHAR, RE.SelStart, 0); 
  Col := RE.SelStart-SendMessage(RE.Handle, EM_LINEINDEX, Row, 0); 
  J:=GetRECount(RE,Row); 
  showmessage(format('%d %d %d',[row,col,J])); 
  if J=-1 then 
    Exit; 
  I:=Col; 
  while (I>0) and (RE.Lines[Row][I]<>' ') do 
    Dec(I); 
 
  RE.SelStart:=J+I+2; 
 
  I:=Col; 
  while (I' ') do 
    Inc(I); 
 
  RE.SelLength:=I-RE.SelStart+2; 
 
//  SendMessage(RE.Handle,EM_SETSEL,Col,-1); 
end;} 
 
procedure TForm1.N15Click(Sender: TObject); 
var 
  HideName: string; 
begin 
  if (HeaderListBox1.ItemIndex=0) and (not FlatCheckBox6.Checked) then 
  begin 
    ErrorDlg(Form2.Handle,'不能屏蔽所有人'); 
    Exit; 
  end; 
 
  if HeaderListBox1.ItemIndex=0 then 
    HideName:='所有人' 
  else 
    HideName:=GetName(HeaderListBox1.Items[HeaderListBox1.ItemIndex]); 
 
  if MessageBox(Form2.Handle,PChar('确定要用化骨绵掌来使 '+HideName+ 
         ' 从你眼前消失吗'),'确认',MB_YESNO or MB_ICONQUESTION)=idYes 
  then 
    AddToHideList(HideName); 
end; 
 
procedure TForm1.N16Click(Sender: TObject); 
var 
  HideName: string; 
begin 
  if HeaderListBox1.ItemIndex=0 then 
    HideName:='所有人' 
  else 
    HideName:=GetName(HeaderListBox1.Items[HeaderListBox1.ItemIndex]); 
 
  if MessageBox(Form2.Handle,PChar('确定要用还阳术来使 '+HideName+ 
         ' 重新回到你的视线中吗'),'确认',MB_YESNO or MB_ICONQUESTION)=idYes 
  then 
    DeleteFromHideList(HideName); 
end; 
 
procedure TForm1.AddToHideList(Name: string); 
var 
  I: Integer; 
begin 
  if FindFromHideList(Name)<>-1 then 
    Exit; 
  for I:=1 to MAX_ONLINE do 
    if not HideList[I].Used then 
    begin 
      HideList[I].Used:=True; 
      HideList[I].Name:=Name; 
      Exit; 
    end; 
end; 
 
procedure TForm1.DeleteFromHideList(Name: string); 
var 
  I: Integer; 
begin 
  I:=FindFromHideList(Name); 
  if I<>-1 then 
    HideList[I].Used:=False; 
end; 
 
function TForm1.FindFromHideList(Name: string): Integer; 
var 
  I: Integer; 
begin 
  Result:=-1; 
  for I:=1 to MAX_ONLINE do 
    if (HideList[I].Used) and (HideList[I].Name=Name) then 
    begin 
      Result:=I; 
      Exit; 
    end; 
end; 
 
procedure TForm1.Timer2Timer(Sender: TObject); 
begin 
  if Logonned then 
  begin 
    Client.Active:=False; 
    Connected:=False; 
    Logonned:=False; 
    Timer2.Enabled:=False; 
    FlatTabControl1.ActiveTab:=0; 
    InfoDlg(Form2.Handle,'由于您长时间没有发言,已经自动离开了聊天室'); 
  end; 
end; 
 
procedure TForm1.PlaySound(SoundName: string); 
begin 
  try 
    MMWavePlayer1.Wave.FileName:=SOUND_DIR+'\'+SoundName; 
    MMWavePlayer1.Play; 
  except 
    on Exception do 
  end; 
end; 
 
procedure TForm1.RichEdit1Jump(Sender: TObject; id: Integer; s: String); 
var 
  I: Integer; 
begin 
  if FlatCheckBox4.Checked then 
  begin 
    I:=0; 
    while (Is) do 
      Inc(I); 
    if I