亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? chatfrm.pas

?? 工廠採購管理系統
?? PAS
?? 第 1 頁 / 共 2 頁
字號:
{=======================================================}
{                                                       }
{          ZhaoSoft Messenger                           }
{                                                       }
{          版權所有 (c) 2005 趙建穩                     }
{                                                       }
{=======================================================}

unit ChatFrm;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  OleCtrls, ExtCtrls, StdCtrls, ComCtrls, ScktComp, xBASE, Buttons, ImgList, mmSystem,
  IdBaseComponent, IdComponent, IdUDPBase, IdUDPClient,
  IdUDPServer, IdSocketHandle, ToolWin,WinSock,IniFiles, DB, ADODB;

type
  TChatClientForm = class(TForm)
    ChatPanel: TPanel;
    MemoChat: TMemo;
    ListBoxChat: TListBox;
    UDPClient: TIdUDPClient;
    UDPServer: TIdUDPServer;
    ImageListPortraitS: TImageList;
    ImageListExpression: TImageList;
    pnlNameList: TPanel;
    ClientListBox: TListBox;
    StaticText1: TStaticText;
    Splitter1: TSplitter;
    Panel3: TPanel;
    btnSendMsg: TSpeedButton;
    Splitter2: TSplitter;
    btnMsgModal: TSpeedButton;
    Panel2: TPanel;
    LabelExpression: TLabel;
    Expresstion: TComboBoxEx;
    BroadCast: TCheckBox;
    btnHideNameList: TSpeedButton;
    chbShowTime: TCheckBox;
    btnClose: TSpeedButton;
    chbCloseAferSend: TCheckBox;
    chbAutoShow: TCheckBox;
    ADOQuery1: TADOQuery;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure MemoChatKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure ListBoxChatMeasureItem(Control: TWinControl; Index: Integer;
      var Height: Integer);
    procedure ListBoxChatDrawItem(Control: TWinControl; Index: Integer;
      Rect: TRect; State: TOwnerDrawState);
    procedure MemoChatKeyUp(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure ListBoxChatDblClick(Sender: TObject);
    procedure btnSendMsgClick(Sender: TObject);
    procedure ClientListBoxMeasureItem(Control: TWinControl;
      Index: Integer; var Height: Integer);
    procedure ClientListBoxDrawItem(Control: TWinControl; Index: Integer;
      Rect: TRect; State: TOwnerDrawState);
    procedure UDPServerUDPRead(Sender: TObject; AData: TStream;
      ABinding: TIdSocketHandle);
    procedure ToolButtonExpressionClick(Sender: TObject);
    procedure ExpresstionChange(Sender: TObject);
    procedure btnMsgModalClick(Sender: TObject);
    procedure btnHideNameListClick(Sender: TObject);
    procedure ClientListBoxClick(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure btnCloseClick(Sender: TObject);
    procedure FormDeactivate(Sender: TObject);
    procedure BroadCastClick(Sender: TObject);
  private
    FClearText: Boolean;
    FClientDataList: TList;
    FChatPropertyList: TList;
    FPerChatPropertyList: TList;
    FFriendClient: Integer;                     // 標記當前聊友
    FSendStream: TMemoryStream;                 // 用于發送消息
    FReceiveStream: TMemoryStream;              // 用于接收消息
    FControlFlag: Boolean;                      // 消息控制標記
    FConnecting: Boolean;                       // 已經連接服務器標記
    FExiting: Boolean;

    procedure ReceiveClientData(Data: TMemoryStream);
    procedure ReceiveNClientData(Data: TMemoryStream);
    procedure ReceiveMessage(Data: TMemoryStream);
    procedure ReceiveBMessage(Data: TMemoryStream);
    procedure ReceiveLogout(Data: TMemoryStream);
    // procedure SetChatEnable(Value: Boolean);
    function RequestTimeout: Boolean;
    function RequestLogin: Boolean;
    function RequestClientData: Boolean;
    procedure SendConnectRequest(Socket: TIdUDPClient);
    procedure SendClientData(Socket: TIdUDPClient);

  public
    procedure InitChatRoom;

    //服務器IP、昵稱、頭像
    procedure ChatRoomLogin(AServerIP,ANickName :string;APortrait :Integer);
  end;

const
  CRECIEVETIMEOUT = 1000;
  CUDPClientServerPort = 8848;
  CUDPServerPort = 8849;

var
  ChatClientForm: TChatClientForm;

implementation
uses uconst,ufunction,umessage;
{$R *.DFM}

{$R XSOUND.RES}

procedure TChatClientForm.InitChatRoom;
begin
  if FConnecting then Exit; 

  if RequestLogin then
  begin
    Delay(200);
    if RequestClientData then
    begin
      Expresstion.ItemIndex := 0;
      FConnecting := True;
    end; 
  end;
end;
{=======================================================}
  //聊天室登錄信息
procedure TChatClientForm.ChatRoomLogin(AServerIP,ANickName :string;APortrait :Integer);
  function GetLocalIp(InternetIP:boolean):string;
    type
      TaPInAddr = array[0..10] of PInAddr;
      PaPInAddr = ^TaPInAddr;
    var
      phe: PHostEnt;
      pptr: PaPInAddr;
      Buffer: array[0..63] of Char;
      I: Integer;
      GInitData: TWSAData;
      IP: string;
  begin
      Screen.Cursor := crHourGlass;
      try
        WSAStartup($101, GInitData);
        IP:='0.0.0.0';
        GetHostName(Buffer, SizeOf(Buffer));
        phe := GetHostByName(buffer);
        if phe = nil then
        begin
          ShowMessage(IP);
          Result:=IP;
          Exit;
        end;
        pPtr := PaPInAddr(phe^.h_addr_list);
        if InternetIP then
          begin
            I := 0;
            while pPtr^[I] <> nil do
              begin
                IP := inet_ntoa(pptr^[I]^);
                Inc(I);
              end;
          end
        else
          IP := inet_ntoa(pptr^[0]^);
        WSACleanup;
        Result:=IP;
      finally
        Screen.Cursor := crDefault;
      end;
  end;
begin
  StrCopy(xClientData.NickName, PChar(ANickName));
  xClientData.FontColor := clBlack;
  xClientData.BKColor := clWhite;
  xClientData.Portrait := APortrait;
  xClientData.Expression := 0;
  StrPCopy(xClientData.IPAddress,GetLocalIp(True));
  xBASE.ServerAddress := AServerIP;
end;

procedure TChatClientForm.FormCreate(Sender: TObject);
var
  MyFile :TIniFile;
  ServerIp,User_Name :string;
  Portrait :Integer;
begin
  try
    MyFile := TIniFile.Create(extractFilePath(Application.ExeName)+ '.\CONFIG.INI') ;
    ServerIp := MyFile.ReadString('Server','IP','127.0.0.1');
    User_Name := username;
    Portrait :=  MyFile.ReadInteger('Users','Portrait',0);
    ChatRoomLogin(ServerIp,User_Name,Portrait);
  finally
    if Assigned(MyFile) then MyFile.Free ;
  end;
  try
    UDPClientServerPort := CUDPClientServerPort;
    UDPServerPort := CUDPServerPort;
    UDPClient.ReceiveTimeout := CRECIEVETIMEOUT;
  except
    ChatClientForm.Free;
  end;
  FClientDataList := TList.Create;
  FChatPropertyList := TList.Create;
  FPerChatPropertyList := TList.Create;
  FReceiveStream := TMemoryStream.Create;
  FSendStream := TMemoryStream.Create;
  FConnecting := False;
  FExiting := False;
  FFriendClient := 0;//當前聊友
  ChatClientForm.InitChatRoom;
end;

{=======================================================}

procedure TChatClientForm.FormDestroy(Sender: TObject);

  procedure SendxMIDClientLogout;
  begin
    MessageID := xMIDClientLogout;
    FSendStream.Clear;
    FSendStream.Write(MessageID, SizeOf(MessageID));
    FSendStream.Write(xClientData, SizeOf(xClientData));
    UDPClient.SendBuffer(ServerAddress, UDPServerPort, FSendStream.Memory^, FSendStream.Size);
  end;

  procedure ObjectFree;
  begin
    while FPerChatPropertyList.Count > 0 do
      FPerChatPropertyList.Remove(FPerChatPropertyList.Last);
    while FChatPropertyList.Count > 0 do
      FChatPropertyList.Remove(FChatPropertyList.Last);
    while FClientDataList.Count > 0 do
      FClientDataList.Remove(FClientDataList.Last);
  end;
begin
  FExiting := True;
  if FConnecting then
    SendxMIDClientLogout;
  ObjectFree;

  FReceiveStream.Free;
  FSendStream.Free;
  FPerChatPropertyList.Free;
  FChatPropertyList.Free;
  FClientDataList.Free;
end;

{=======================================================}

procedure TChatClientForm.MemoChatKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
  VCount: Integer;
  AText: PChar;
  VChatPropertyList: PxChatProperty;

  Vi,Vj: Integer;

  procedure SendxMIDClientLogout;
  begin
    MessageID := xMIDClientLogout;
    FSendStream.Clear;
    FSendStream.Write(MessageID, SizeOf(MessageID));
    FSendStream.Write((FClientDataList.Items[Vi])^, SizeOf(xClientData));
    UDPClient.SendBuffer(ServerAddress, UDPServerPort, FSendStream.Memory^, FSendStream.Size);
  end;

  procedure SendxMIDClientCheck;
  begin
    MessageID := xMIDClientCheck;
    FSendStream.Clear;
    FSendStream.Write(MessageID, SizeOf(MessageID));
    UDPClient.SendBuffer(PxClientData(FClientDataList.Items[Vi])^.IPAddress, UDPClientServerPort, FSendStream.Memory^, FSendStream.Size);
  end;

begin
  if ((ssCtrl in Shift) and (Chr(Key)='S')) or
    ((Key = VK_RETURN) and (ssCtrl in Shift) and BroadCast.Checked) then
  begin
    if Length(Trim(MemoChat.Text)) <= 0 then
      Exit;
    VCount := Length(MemoChat.Text);
    AText := StrAlloc(VCount + 1);
    Move(PChar(MemoChat.Text)^, AText^, VCount);
    AText[VCount] := #0;

    FSendStream.Clear;
    
    MessageID := xMIDChat;
    FSendStream.Write(MessageID, SizeOf(MessageID));
    FSendStream.Write(xClientData, SizeOf(xClientData));
    FSendStream.Write((FClientDataList.Items[FFriendClient])^, SizeOf(xClientData));
    FSendStream.Write(AText^, VCount + 1);
    Vj := FClientDataList.Count - 1;
    for Vi := 0 to Vj do
      UDPClient.SendBuffer(PxClientData(FClientDataList.Items[Vi])^.IPAddress, UDPClientServerPort, FSendStream.Memory^, FSendStream.Size);

    StrDispose(AText);
    FClearText := True;
    
    Vi := FFriendClient;

    if chbCloseAferSend.Checked then
    begin
      MemoChat.Clear;
      Self.Close;
    end;
    Exit;
  end;

  //根據CheckBox判斷是私聊還是廣播
  case Key of
    VK_RETURN: begin
      if (ssCtrl in Shift) then
      begin
        if Length(Trim(MemoChat.Text)) <= 0 then
          Exit;
          
        VCount := Length(MemoChat.Text);
        AText := StrAlloc(VCount + 1);
        Move(PChar(MemoChat.Text)^, AText^, VCount);
        AText[VCount] := #0;

        FSendStream.Clear;

        MessageID := xMIDChat;
        FSendStream.Write(MessageID, SizeOf(MessageID));
        FSendStream.Write(xClientData, SizeOf(xClientData));
        FSendStream.Write((FClientDataList.Items[FFriendClient])^, SizeOf(xClientData));
        FSendStream.Write(AText^, VCount + 1);
        UDPClient.SendBuffer(PxClientData(FClientDataList.Items[FFriendClient])^.IPAddress, UDPClientServerPort, FSendStream.Memory^, FSendStream.Size);

        if not BroadCast.Checked then
        begin
          if ListBoxChat.Items.Count > MAX_CHAT_RECORD then
          begin
            ListBoxChat.Clear;
            while FChatPropertyList.Count > 0 do
              FChatPropertyList.Remove(FChatPropertyList.Last);
          end;
          ListBoxChat.Items.Add('(發給' + PxClientData(FClientDataList.Items[FFriendClient])^.NickName + ')' + AText);
        end;

        FClearText := True;

        if not BroadCast.Checked then
        begin
          New(VChatPropertyList);
          VChatPropertyList^.FontColor := xClientData.FontColor;
          VChatPropertyList^.Expression := xClientData.Expression;
          VChatPropertyList^.BKColor := xClientData.BKColor;
          VChatPropertyList^.NickName := xClientData.NickName + ': ';
          VChatPropertyList^.Portrait := xClientData.Portrait;
          FChatPropertyList.Add(VChatPropertyList);
          SendMessage(ListBoxChat.Handle, WM_VSCROLL, SB_BOTTOM, 0);
        end;

        StrDispose(AText);

        Vi := FFriendClient;
        if PxClientData(FClientDataList.Items[Vi])^.ClientID <> xClientData.ClientID then
        begin
          SendxMIDClientCheck;
          if not RequestTimeout then
            SendxMIDClientLogout;
        end;

        //發送后關閉
        if chbCloseAferSend.Checked then
        begin
          MemoChat.Clear;
          Self.Close;
        end;

      end;
    end;

    VK_UP : begin  //選上一個人做聊天對象
      if (ssCtrl in Shift) then
      begin
        ClientListBox.ItemIndex := ClientListBox.ItemIndex -1;
        if ClientListBox.ItemIndex < 0 then ClientListBox.ItemIndex := ClientListBox.Count-1;
        ClientListBox.Repaint;
        FFriendClient := ClientListBox.ItemIndex;
      end;
    end;
    VK_DOWN : begin //選下一個人做聊天對象
      if (ssCtrl in Shift) then
      begin
        if ClientListBox.ItemIndex = ClientListBox.Count-1 then
          ClientListBox.ItemIndex := 0
        else
          ClientListBox.ItemIndex := ClientListBox.ItemIndex + 1;
        ClientListBox.Repaint;
        FFriendClient := ClientListBox.ItemIndex;
      end;
    end;
    VK_LEFT : begin  //選上一個表情
      if (ssCtrl in Shift) then
      begin
        Expresstion.ItemIndex := Expresstion.ItemIndex - 1;
        if Expresstion.ItemIndex < 0 then Expresstion.ItemIndex := Expresstion.Items.Count -1;
        xClientData.Expression := Expresstion.ItemIndex;
      end;
    end;
    VK_RIGHT : begin  //選下一個表情
      if (ssCtrl in Shift) then
      begin
        if Expresstion.ItemIndex = Expresstion.Items.Count -1 then
          Expresstion.ItemIndex := 0
        else
          Expresstion.ItemIndex := Expresstion.ItemIndex + 1;
        xClientData.Expression := Expresstion.ItemIndex;
      end;
    end;
  end;
end;

procedure TChatClientForm.ReceiveMessage(Data: TMemoryStream);
var
  AClientData: TxClientData;
  VChatProperty: PxChatProperty;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美精品一区二区三区一线天视频| 男人的天堂久久精品| 久久综合给合久久狠狠狠97色69| 2021中文字幕一区亚洲| 欧美国产精品劲爆| 亚洲va韩国va欧美va精品| 国产成人在线观看免费网站| 一区av在线播放| 成人中文字幕合集| 成人av在线影院| 亚洲精品视频在线观看网站| 亚洲成人午夜电影| 日本一区二区视频在线观看| 日本网站在线观看一区二区三区| 奇米亚洲午夜久久精品| 国产亚洲欧美在线| 综合av第一页| 国产精品美女久久久久久| 欧美性欧美巨大黑白大战| www久久精品| 国产一区二区不卡在线| 国产欧美日韩久久| 日本韩国一区二区| 奇米色一区二区| 国产日韩欧美a| 欧美午夜在线一二页| 免费观看在线综合色| 中文字幕欧美激情一区| 欧美日韩国产一二三| 国产一区美女在线| 7777精品伊人久久久大香线蕉最新版 | 日韩中文字幕麻豆| 精品国产麻豆免费人成网站| 成人教育av在线| 天堂久久久久va久久久久| 亚洲精品在线电影| 色婷婷国产精品综合在线观看| 丝袜亚洲另类欧美综合| 中文字幕精品一区二区三区精品| 欧美色综合天天久久综合精品| 久久99精品国产.久久久久| 中文字幕精品一区二区精品绿巨人 | 日韩精品1区2区3区| 久久综合九色综合欧美98| 91蝌蚪porny成人天涯| 精品写真视频在线观看| 日韩理论片中文av| 久久这里只有精品6| 精品视频一区二区不卡| 成人免费黄色在线| 蜜桃av一区二区三区电影| 亚洲精品菠萝久久久久久久| 国产亚洲精品aa| 91麻豆精品国产91久久久更新时间| 成人免费看片app下载| 蜜臀99久久精品久久久久久软件| 亚洲你懂的在线视频| 欧美国产一区二区在线观看| 欧美一区日韩一区| 欧美视频日韩视频在线观看| 国产成人精品亚洲午夜麻豆| 久久精品免费看| 三级亚洲高清视频| 亚洲国产精品久久艾草纯爱| 亚洲欧美影音先锋| 中文字幕精品—区二区四季| 精品剧情在线观看| 日韩一区二区电影网| 欧美另类久久久品| 欧美吻胸吃奶大尺度电影| 91捆绑美女网站| kk眼镜猥琐国模调教系列一区二区 | 日韩一区二区三区四区五区六区 | 欧美中文一区二区三区| 不卡av电影在线播放| 国产寡妇亲子伦一区二区| 韩国精品免费视频| 韩国在线一区二区| 国产剧情在线观看一区二区| 精品一区二区成人精品| 麻豆一区二区在线| 久久爱www久久做| 久久精品国产亚洲a| 另类综合日韩欧美亚洲| 韩国v欧美v日本v亚洲v| 国产一区二区成人久久免费影院| 国产在线播精品第三| 国产成人一区二区精品非洲| 成人伦理片在线| 99精品国产视频| 色激情天天射综合网| 欧美色图一区二区三区| 欧美日韩视频不卡| 欧美一级黄色片| 久久天天做天天爱综合色| 久久久久97国产精华液好用吗| 国产农村妇女毛片精品久久麻豆 | 亚洲精品国产品国语在线app| 亚洲综合色丁香婷婷六月图片| 亚洲在线视频一区| 日产国产欧美视频一区精品| 精品一区二区三区久久| 大桥未久av一区二区三区中文| a4yy欧美一区二区三区| 欧美少妇bbb| 精品国产一区二区三区不卡 | 色欧美日韩亚洲| 欧美亚洲动漫精品| 日韩一区二区视频在线观看| 久久久久久久久久久久久女国产乱| 亚洲国产精品传媒在线观看| 日韩伦理av电影| 日韩成人免费电影| 国产精品66部| 欧美影院精品一区| 欧美不卡在线视频| 亚洲日本在线天堂| 肉色丝袜一区二区| 国产成人av一区二区三区在线 | 一区二区三区在线视频观看| 婷婷国产在线综合| 国产成人a级片| 欧美日韩国产在线播放网站| 国产亚洲成av人在线观看导航| 亚洲人123区| 国产真实乱对白精彩久久| 99久久精品免费看国产| 欧美一级日韩免费不卡| 国产精品久久久久久福利一牛影视| 亚洲午夜日本在线观看| 国产成人aaa| 欧美一区二区视频在线观看| 国产精品白丝在线| 久久成人免费日本黄色| 欧美影院一区二区| 日本一区二区电影| 免费成人在线观看视频| 日本精品一区二区三区高清| 国产三区在线成人av| 日本一区中文字幕| 色综合婷婷久久| 久久亚洲一区二区三区明星换脸| 亚洲电影一级片| 91老师片黄在线观看| 国产欧美一区在线| 美女任你摸久久| 欧美三级电影网| 亚洲视频精选在线| 成人在线视频一区二区| 精品国产91洋老外米糕| 婷婷六月综合网| 91免费看视频| 中文字幕在线观看不卡| 国产乱码精品一区二区三区av| 日韩欧美中文一区| 天天操天天色综合| 欧美亚洲自拍偷拍| 一区二区在线免费观看| 成人av中文字幕| 国产精品嫩草99a| 国产不卡一区视频| 久久免费电影网| 国产精品亚洲午夜一区二区三区| 精品国产一区二区三区久久影院| 青青国产91久久久久久| 欧美福利电影网| 视频在线观看一区二区三区| 精品视频在线免费| 亚洲成av人**亚洲成av**| 欧美日韩小视频| 五月婷婷激情综合| 欧美精品tushy高清| 日本中文字幕一区| 日韩午夜av电影| 国内外成人在线视频| 久久久精品免费网站| 国产98色在线|日韩| 中文在线资源观看网站视频免费不卡 | 26uuu国产在线精品一区二区| 久草热8精品视频在线观看| 精品久久久网站| 国产精品一区二区三区四区 | 不卡的电影网站| 亚洲美女电影在线| 欧美在线不卡一区| 午夜亚洲福利老司机| 日韩欧美一级精品久久| 国产精品影视在线观看| 国产精品全国免费观看高清| 91在线云播放| 午夜私人影院久久久久| 日韩女同互慰一区二区| 国产风韵犹存在线视精品| 亚洲欧美一区二区在线观看| 色天使久久综合网天天| 日本亚洲一区二区| 亚洲国产精品国自产拍av| 在线免费观看成人短视频| 天天影视涩香欲综合网| 久久久三级国产网站|