Browse Source

新增导出所有聊天历史记录到本地功能。

Signed-off-by: cmg <ceo@wswin.cn>
cmg 8 years ago
parent
commit
93be045a1e

+ 1 - 1
Client/Lxtalk.dpr

@@ -13,7 +13,7 @@ uses
   IdSMTP,
   IdMessage,
   LoggerImport,
-  AddFaceFrm in 'AddFaceFrm.pas' {AddFaceForm},
+  AddFaceFrm in 'AddFaceFrm.pas' {AddFaceFrm},
   AddFriendFrm in 'AddFriendFrm.pas' {AddFriendForm},
   AddFriendRequestFrm in 'AddFriendRequestFrm.pas' {AddFriendRequestForm},
   AddGroupFrm in 'AddGroupFrm.pas' {AddGroupForm},

File diff suppressed because it is too large
+ 7 - 18
Client/Lxtalk.dproj


BIN
Client/Lxtalk.res


+ 64 - 25
Client/MessagesManagerFrm.dfm

@@ -3,7 +3,7 @@ object MessagesManagerForm: TMessagesManagerForm
   Top = 0
   Caption = #28040#24687#31649#29702
   ClientHeight = 373
-  ClientWidth = 692
+  ClientWidth = 773
   Color = clBtnFace
   Constraints.MinHeight = 400
   Constraints.MinWidth = 700
@@ -23,7 +23,7 @@ object MessagesManagerForm: TMessagesManagerForm
   object pnlClient: TPanel
     Left = 0
     Top = 0
-    Width = 692
+    Width = 773
     Height = 373
     Align = alClient
     BevelOuter = bvNone
@@ -42,7 +42,7 @@ object MessagesManagerForm: TMessagesManagerForm
     object CoolBar1: TCoolBar
       Left = 0
       Top = 0
-      Width = 692
+      Width = 773
       Height = 31
       AutoSize = True
       Bands = <
@@ -50,16 +50,16 @@ object MessagesManagerForm: TMessagesManagerForm
           Control = Panel2
           ImageIndex = -1
           MinHeight = 29
-          Width = 692
+          Width = 773
         end>
       EdgeBorders = [ebBottom]
       object Panel2: TPanel
         Left = 9
         Top = 0
-        Width = 683
+        Width = 764
         Height = 29
         BevelOuter = bvNone
-        Constraints.MinWidth = 400
+        Constraints.MinWidth = 500
         ParentColor = True
         TabOrder = 0
         object Label1: TLabel
@@ -295,6 +295,45 @@ object MessagesManagerForm: TMessagesManagerForm
           ShowHint = True
           OnClick = SpeedButton2Click
         end
+        object btExportAllMsg: TSpeedButton
+          AlignWithMargins = True
+          Left = 682
+          Top = 3
+          Width = 79
+          Height = 23
+          Align = alRight
+          Anchors = [akTop, akRight]
+          Caption = #23548#20986#20840#37096
+          Flat = True
+          Glyph.Data = {
+            36030000424D3603000000000000360000002800000010000000100000000100
+            18000000000000030000C40E0000C40E00000000000000000000FFFFFFFFFFFF
+            B2B2B2A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0D8D8D8FFFFFFFFFFFFD8D8
+            D8B2B2B2FFFFFFFFFFFFFFFFFFFFFFFFA0A0A0D6D6D6C9C9C9C9C9C9C9C9C9BA
+            BABABABABAFFFFFF4DCA5D01B318FFFFFFD8D8D8FFFFFFFFFFFFFFFFFFFFFFFF
+            A0A0A0DBDBDBAFBAC0AFBAC0AFBAC0DADEE1FFFFFFFFFFFF01B31800D42301B3
+            18FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0A0A0E0E0E0BFCACFB3BEC3B3BEC3FF
+            FFFF01B31801B31801B31800DA4200DA4201B318FFFFFFFFFFFFFFFFFFFFFFFF
+            A0A0A0E6E6E6C4CFD4B8C3C9B8C3C9FFFFFF01B31800DF6100DD5E00D95900D6
+            5301D04A01B318FFFFFFFFFFFFFFFFFFA0A0A0EBEBEBC8D3D9BFCACFBFCACFFF
+            FFFF01B31800E47900E17300DD6C00D96301D35801B318FFFFFFFFFFFFFFFFFF
+            A0A0A0F0F0F0CCD7DDCCD7DDC6D1D7FFFFFF01B31801B31801B31800EE9C00EE
+            9C01B318FFFFFFFFFFFFFFFFFFFFFFFFA0A0A0F5F5F5F5F5F5F5F5F5F0F0F0F7
+            F7F7FFFFFFFFFFFF01B31800F4BA01B318FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+            A0A0A0F8F8F8C6D5DDC6D5DDC5D4DBC3D2DAC3D2DAFFFFFF4DCA5D01B318FFFF
+            FFD8D8D8FFFFFFFFFFFFFFFFFFFFFFFFBDBDBDFAFAFAD7E2E7D7E2E7D7E2E7D7
+            E1E7D7E1E7EEF3F5FFFFFFFFFFFFFDFDFDBDBDBDFFFFFFFFFFFFFFFFFFFFFFFF
+            BDBDBDFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAF9F9F9F7F7F7F4F4F4F2F2F2F4F4
+            F4BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFBDBDBDFAFAFAFAFAFAFAFAFAFAFAFAFA
+            FAFAF7F7F7F0F0F0E8E8E8E6E6E6EAEAEAB8B8B8FFFFFFFFFFFFFFFFFFFFFFFF
+            BDBDBDFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAF4F4F4E8E8E8FFFFFFFFFFFFFFFF
+            FFB5B5B5FFFFFFFFFFFFFFFFFFFFFFFFBDBDBDFAFAFAFAFAFAFAFAFAFAFAFAFA
+            FAFAF2F2F2E6E6E6FFFFFFFFFFFFB6B6B6CECECEFFFFFFFFFFFFFFFFFFFFFFFF
+            BDBDBDFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAF4F4F4EAEAEAFFFFFFB6B6B6C9C9
+            C9F9F9F9FFFFFFFFFFFFFFFFFFFFFFFFB2B2B2BDBDBDBDBDBDBDBDBDBDBDBDBD
+            BDBDBBBBBBB8B8B8B5B5B5CECECEF9F9F9FDFDFDFFFFFFFFFFFF}
+          OnClick = btExportAllMsgClick
+        end
         object cbSearchRange: TComboBox
           Left = 290
           Top = 4
@@ -341,7 +380,6 @@ object MessagesManagerForm: TMessagesManagerForm
         RowSelect = True
         TabOrder = 0
         OnChange = tvSendersChange
-        OnClick = tvSendersClick
         OnCustomDrawItem = tvSendersCustomDrawItem
         OnGetSelectedIndex = tvSendersGetSelectedIndex
         OnMouseUp = tvSendersMouseUp
@@ -350,7 +388,7 @@ object MessagesManagerForm: TMessagesManagerForm
     object pnlRight: TPanel
       Left = 215
       Top = 31
-      Width = 477
+      Width = 558
       Height = 342
       Align = alClient
       BevelOuter = bvNone
@@ -362,7 +400,7 @@ object MessagesManagerForm: TMessagesManagerForm
       object Splitter2: TSplitter
         Left = 0
         Top = 165
-        Width = 474
+        Width = 555
         Height = 6
         Cursor = crVSplit
         Align = alBottom
@@ -373,7 +411,7 @@ object MessagesManagerForm: TMessagesManagerForm
       object lvContents: TListView
         Left = 0
         Top = 5
-        Width = 474
+        Width = 555
         Height = 133
         Align = alClient
         Color = clWhite
@@ -412,7 +450,7 @@ object MessagesManagerForm: TMessagesManagerForm
       object pnlContent: TPanel
         Left = 0
         Top = 171
-        Width = 474
+        Width = 555
         Height = 168
         Align = alBottom
         BevelOuter = bvNone
@@ -421,14 +459,14 @@ object MessagesManagerForm: TMessagesManagerForm
         object pnlHeaders: TPanel
           Left = 0
           Top = 0
-          Width = 474
+          Width = 555
           Height = 24
           Align = alTop
           BevelOuter = bvNone
           ParentColor = True
           TabOrder = 0
           DesignSize = (
-            474
+            555
             24)
           object lblDate: TLabel
             Left = 5
@@ -452,7 +490,7 @@ object MessagesManagerForm: TMessagesManagerForm
             Caption = #21457#20449#20154':'
           end
           object btSeeInfo: TRealICQButton
-            Left = 395
+            Left = 476
             Top = 2
             Width = 78
             Height = 21
@@ -786,14 +824,14 @@ object MessagesManagerForm: TMessagesManagerForm
         object ScrollBox1: TScrollBox
           Left = 0
           Top = 24
-          Width = 474
+          Width = 555
           Height = 144
           Align = alClient
           TabOrder = 1
           object WebBrowser: TWebBrowser
             Left = 0
             Top = 0
-            Width = 470
+            Width = 551
             Height = 140
             Align = alClient
             TabOrder = 0
@@ -802,7 +840,7 @@ object MessagesManagerForm: TMessagesManagerForm
             ExplicitWidth = 461
             ExplicitHeight = 115
             ControlData = {
-              4C00000093300000780E00000000000000000000000000000000000000000000
+              4C000000F3380000780E00000000000000000000000000000000000000000000
               000000004C000000000000000000000001000000E0D057007335CF11AE690800
               2B2E126208000000000000004C0000000114020000000000C000000000000046
               8000000000000000000000000000000000000000000000000000000000000000
@@ -813,17 +851,17 @@ object MessagesManagerForm: TMessagesManagerForm
       object pnlPageSet: TPanel
         Left = 0
         Top = 138
-        Width = 474
+        Width = 555
         Height = 27
         Align = alBottom
         BevelOuter = bvNone
         ParentColor = True
         TabOrder = 2
         DesignSize = (
-          474
+          555
           27)
         object btNext: TSpeedButton
-          Left = 363
+          Left = 444
           Top = 2
           Width = 55
           Height = 23
@@ -887,7 +925,7 @@ object MessagesManagerForm: TMessagesManagerForm
           ExplicitLeft = 335
         end
         object btLast: TSpeedButton
-          Left = 418
+          Left = 499
           Top = 2
           Width = 54
           Height = 23
@@ -951,7 +989,7 @@ object MessagesManagerForm: TMessagesManagerForm
           ExplicitLeft = 390
         end
         object btFirst: TSpeedButton
-          Left = 254
+          Left = 335
           Top = 2
           Width = 55
           Height = 23
@@ -1015,7 +1053,7 @@ object MessagesManagerForm: TMessagesManagerForm
           ExplicitLeft = 226
         end
         object btPrev: TSpeedButton
-          Left = 309
+          Left = 390
           Top = 2
           Width = 54
           Height = 23
@@ -1086,15 +1124,16 @@ object MessagesManagerForm: TMessagesManagerForm
           Caption = '0 '#26465#35760#24405#65292#31532' 0 '#39029#12289#20849' 0 '#39029
         end
         object Label3: TLabel
-          Left = 220
+          Left = 301
           Top = 7
           Width = 30
           Height = 12
           Anchors = [akTop, akRight]
           Caption = #26465'/'#39029
+          ExplicitLeft = 220
         end
         object cbPageSize: TComboBox
-          Left = 172
+          Left = 253
           Top = 3
           Width = 42
           Height = 20

+ 331 - 210
Client/MessagesManagerFrm.pas

@@ -4,14 +4,13 @@ interface
 
 uses
   TransmitDirection,
-  FileTransmitterObjective,  md5,MyInputBoxFrm,
-  FileTransmitter,
-  DownloadFileFromWeb,ShellAPI,
+  FileTransmitterObjective, md5, MyInputBoxFrm,
+  FileTransmitter, DownloadFileFromWeb,ShellAPI,
   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, StrUtils, xFonts,
   Dialogs, ExtCtrls, ActnCtrls, ActnMan, ActnMenus, ToolWin, ComCtrls, ImgList, MSHTML,
   Menus, ActnList, StdStyleActnCtrls, Buttons, StdCtrls, OleCtrls, SHDocVw, RealICQClient,
   RealICQUtils, RealICQSkinFrm, ShareUtils, RealICQContacterTreeView, RealICQModel,
-  RealICQSpeedButton, RealICQButton;
+  RealICQSpeedButton, RealICQButton, FileCtrl;
 
 type
   TMessagesManagerForm = class(TRealICQSkinForm)
@@ -55,14 +54,13 @@ type
     SpeedButton1: TSpeedButton;
     SpeedButton2: TSpeedButton;
     btSeeInfo: TRealICQButton;
-    procedure tvSendersClick(Sender: TObject);
+    btExportAllMsg: TSpeedButton;
     procedure lvContentsColumnClick(Sender: TObject; Column: TListColumn);
     procedure lvContentsClick(Sender: TObject);
     procedure btSeeInfoClick(Sender: TObject);
     procedure SpeedButton2Click(Sender: TObject);
     procedure SpeedButton1Click(Sender: TObject);
-    procedure lvContentsMouseUp(Sender: TObject; Button: TMouseButton;
-      Shift: TShiftState; X, Y: Integer);
+    procedure lvContentsMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
     procedure ppListViewPopup(Sender: TObject);
     procedure btNextClick(Sender: TObject);
     procedure btLastClick(Sender: TObject);
@@ -72,27 +70,22 @@ type
     procedure btSearchClick(Sender: TObject);
     procedure btRefreshClick(Sender: TObject);
     procedure lvContentsDblClick(Sender: TObject);
-    procedure WebBrowserDocumentComplete(ASender: TObject;
-      const pDisp: IDispatch; var URL: OleVariant);
-    procedure lvContentsChange(Sender: TObject; Item: TListItem;
-      Change: TItemChange);
+    procedure WebBrowserDocumentComplete(ASender: TObject; const pDisp: IDispatch; var URL: OleVariant);
+    procedure lvContentsChange(Sender: TObject; Item: TListItem;Change: TItemChange);
     procedure tvSendersChange(Sender: TObject; Node: TTreeNode);
     procedure lvContentsResize(Sender: TObject);
     procedure tvSendersGetSelectedIndex(Sender: TObject; Node: TTreeNode);
-    procedure tvSendersCustomDrawItem(Sender: TCustomTreeView; Node: TTreeNode;
-      State: TCustomDrawState; var DefaultDraw: Boolean);
+    procedure tvSendersCustomDrawItem(Sender: TCustomTreeView; Node: TTreeNode;State: TCustomDrawState; var DefaultDraw: Boolean);
     procedure FormClose(Sender: TObject; var Action: TCloseAction);
     procedure FormDestroy(Sender: TObject);
     procedure FormCreate(Sender: TObject);
     procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
     procedure ppTreeNodePopup(Sender: TObject);
-    procedure tvSendersMouseUp(Sender: TObject; Button: TMouseButton;
-      Shift: TShiftState; X, Y: Integer);
+    procedure tvSendersMouseUp(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);
     procedure miDelMessageHistoryClick(Sender: TObject);
     procedure cbPageSizeChange(Sender: TObject);
-    procedure WebBrowserBeforeNavigate2(ASender: TObject;
-      const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,
-      Headers: OleVariant; var Cancel: WordBool);
+    procedure WebBrowserBeforeNavigate2(ASender: TObject;const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,Headers: OleVariant; var Cancel: WordBool);
+    procedure btExportAllMsgClick(Sender: TObject);
   private
     FBaseURL: string;
     FRecordCount: Integer;
@@ -104,7 +97,7 @@ type
     FFileTransmitter: TFileTransmitter;
     FDownFile: TDownFile;
     FDBFile: String;
-    
+
     procedure DownFileProgress(ulProgress, ulProgressMax, ulStatusCode: integer; szStatusText: String);
     procedure DownFileComplete(Source_file, Dest_file:String; blStatus:boolean; ErrMessage:String);
     procedure LoadTreeViewItems;
@@ -124,6 +117,7 @@ type
     procedure ChangeUIColor(AColor: TColor); override;
     procedure ShowUsersMessages(ALoginName: String);
     procedure ShowTeamsMessages(ATeamID: String);
+    function IsDigit(S: String): Boolean;
   end;
 
 var
@@ -170,7 +164,6 @@ begin
   end;
   AMessageContent := HTML; 
 end;
-
 //------------------------------------------------------------------------------
 procedure TMessagesManagerForm.ChangeUIColor(AColor: TColor);
 begin
@@ -178,7 +171,6 @@ begin
   pnlClient.Color := FormColor;
   btSeeInfo.ChangeUIColor(AColor);
 end;
-
 //------------------------------------------------------------------------------
 procedure TMessagesManagerForm.btSearchClick(Sender: TObject);
 var
@@ -247,7 +239,7 @@ begin  if Length(Trim(edKeyword.Text)) = 0 then
       end; //while
     end;
 
-    if  Messages = nil then Exit;
+    if Messages = nil then Exit;
     tvSenders.Items.Item[tvSenders.Items.Count - 1].Selected := True;
     lvContents.Items.BeginUpdate;
     try
@@ -276,10 +268,13 @@ begin  if Length(Trim(edKeyword.Text)) = 0 then
           end
           else
             ImageIndex := 5;
+
+
           RealICQUser:= TUsersService.GetUsersService.GetOrRequestUser(MessageSearchResult.Sender);
 
           ALoginName := RealICQUser.LoginName;
-          if Pos('-', ALoginName) > 0 then ALoginName := Copy(ALoginName, Pos('-', ALoginName) + 1, Length(ALoginName));
+          if Pos('-', ALoginName) > 0 then
+             ALoginName := Copy(ALoginName, Pos('-', ALoginName) + 1, Length(ALoginName));
 
           if (Length(RealICQUser.DisplayName) = 0) then
             Caption := ALoginName
@@ -299,7 +294,7 @@ begin  if Length(Trim(edKeyword.Text)) = 0 then
               ReceiverName := RealICQUser.DisplayName + '<' + ALoginName + '>';
             Caption := Caption + ' -> ' + ReceiverName;
           end;
-          
+
           SubItems.Add(DateToStr(MessageSearchResult.SendDateTime));
           SubItems.Add(TimeToStr(MessageSearchResult.SendDateTime));
 
@@ -318,13 +313,197 @@ begin  if Length(Trim(edKeyword.Text)) = 0 then
     ProcessingForm.Free;
   end;
 end;
-
+//------------------------------------------------------------------------------
+//变量S为要判断的字符串,返回true则正确
+function TMessagesManagerForm.IsDigit(S:String):Boolean;
+var
+i,j:integer;
+begin
+    Result:=True;
+    j :=0 ;
+    for i :=1 to length(s) do
+    begin
+       if not (s[i] in ['0'..'9','.'])then   //判断字符串每个字符即s[i],是否为"0"到'9"数字及".'
+         Result:=False;
+       if s[i]='.' Then //统计字符串中"."的个数
+         j:=j+1;
+    end;
+    if j > 1 then   //字符串中"."的个数大于1
+       Result:=False;
+    if (s[1]='.') or (s[length(s)]='.') then //字符串中"."的在最前面和最后面
+       Result:=False;
+    //增加, 字符串中"."的位置之前有两个"0"判断
+    s:=copy(s,1, pos('.', S)-1); //取字符串中"."的位置之前字符
+    j:=0;
+    for i:=1 to length(s) do
+    begin
+       if s[i]='0' then
+          j:=j+1;
+    end;
+    if j > 1 then    //字符串中"."的位置之前有两个"0"
+       Result:=False;
+end;
+//------------------------------------------------------------------------------
+procedure TMessagesManagerForm.btExportAllMsgClick(Sender: TObject);
+var
+  iLoop, jLoop: Integer;
+  RootPath, FileName, StrLogin,StrSender, StrReceiver, StrTmp: string;
+  GroupList, UserList, TmpList: TStringList;
+  MessageSearchResult: TMessageSearchResult;
+  Messages: TList;
+  RealICQUser: TRealICQUser;
+  RealICQTeam: TRealICQTeam;
+begin
+  RootPath := '';
+  if SelectDirectory('请设置历史聊天记录文件的导出路径', '', RootPath) then
+  begin
+     if RootPath = '' then Exit;
+     RootPath := RootPath + '\历史记录\';
+     if not DirectoryExists(RootPath) then CreateDir(RootPath);
+     ProcessingForm := TProcessingForm.Create(Self);
+     ProcessingForm.Show;
+     Application.ProcessMessages;
+     Sleep(500);
+     Messages := MainForm.DBHistory.SearchMessage('-1', '','', True, '');
+     if Messages = nil then Exit;
+     TmpList := TStringList.Create;
+     //群组消息
+     GroupList := TTeamsAdapter.GetTeams();
+     if GroupList <> nil then
+       for iLoop := 0 to GroupList.Count - 1 do
+       begin
+         RealICQTeam := GroupList.Objects[iLoop] as TRealICQTeam;
+         if Length(RealICQTeam.TeamCaption) = 0 then
+            FileName := RootPath + '群组:' + RealICQTeam.TeamID + '.txt'
+         else
+            FileName := RootPath + '群组:' + RealICQTeam.TeamCaption + '.txt';
+         TmpList.Clear;
+         for jLoop := 0 to Messages.Count - 1 do
+         begin
+            MessageSearchResult := Messages[jLoop];
+            if MessageSearchResult.TeamID = RealICQTeam.TeamID then
+            begin
+              RealICQUser := TUsersService.GetUsersService.GetOrRequestUser(MessageSearchResult.Sender);
+              StrSender := RealICQUser.LoginName;
+              if Pos('-', StrSender) > 0 then
+                 StrSender := Copy(StrSender, Pos('-', StrSender) + 1, Length(StrSender));
+              if (Length(RealICQUser.DisplayName) <> 0) then
+                 StrSender := RealICQUser.DisplayName + '(' + StrSender + ')';
+              StrTmp := DateToStr(MessageSearchResult.SendDateTime) + ' ';
+              StrTmp := StrTmp + TimeToStr(MessageSearchResult.SendDateTime) + ' ';
+              StrTmp := StrTmp + StrSender + #13#10;
+              StrTmp := StrTmp + #13#10 + MessageSearchResult.MessageStr + #13#10;
+              TmpList.Add(StrTmp);
+            end;
+         end;
+         if TmpList.Count > 0 then TmpList.SaveToFile(FileName);
+       end;
+     //手机短信
+     StrTmp := '';
+     TmpList.Clear;
+     FileName := RootPath + '手机短信.txt';
+     for iLoop := 0 to Messages.Count - 1 do
+     begin
+       MessageSearchResult := Messages[iLoop];
+       if (MessageSearchResult.TeamID = '-2') or (MessageSearchResult.TeamID = '-3') then
+       begin
+          if IsDigit(MessageSearchResult.Sender) then
+             StrSender := MessageSearchResult.Sender
+          else
+             begin
+                RealICQUser := TUsersService.GetUsersService.GetOrRequestUser(MessageSearchResult.Sender);
+                StrSender := RealICQUser.LoginName;
+                if Pos('-', StrSender) > 0 then
+                   StrSender := Copy(StrSender, Pos('-', StrSender) + 1, Length(StrSender));
+                if (Length(RealICQUser.DisplayName) <> 0) then
+                   StrSender := RealICQUser.DisplayName + '(' + StrSender + ')';
+             end;
+          if IsDigit(MessageSearchResult.Receiver) then
+             StrReceiver := MessageSearchResult.Receiver
+          else
+             begin
+                RealICQUser := TUsersService.GetUsersService.GetOrRequestUser(MessageSearchResult.Receiver);
+                StrReceiver := RealICQUser.LoginName;
+                if Pos('-', StrReceiver) > 0 then
+                   StrReceiver := Copy(StrReceiver, Pos('-', StrReceiver) + 1, Length(StrReceiver));
+                if (Length(RealICQUser.DisplayName) <> 0) then
+                   StrReceiver := RealICQUser.DisplayName + '(' + StrReceiver + ')';
+             end;
+          StrTmp := StrTmp + DateToStr(MessageSearchResult.SendDateTime) + ' ';
+          StrTmp := StrTmp + TimeToStr(MessageSearchResult.SendDateTime) + ' ';
+          StrTmp := StrTmp + StrSender + ' -> ' + StrReceiver + #13#10;
+          StrTmp := StrTmp + #13#10 + MessageSearchResult.MessageStr + #13#10;
+          TmpList.Add(StrTmp);
+       end;
+     end;
+     if TmpList.Count > 0 then TmpList.SaveToFile(FileName);
+     //联系人
+     UserList := MainForm.DBHistory.GetContactors;
+     if UserList <> nil then
+       for iLoop := 0 to UserList.Count - 1 do
+       begin
+         StrLogin := UserList[iLoop];
+         if (AnsiPos('+', StrLogin) <= 0) and (trim(MainForm.RealICQClient.CenterServerID) <> '') then
+             StrLogin := MainForm.RealICQClient.CenterServerID + '+' + StrLogin;
+         if AnsiSameText(StrLogin, MainForm.RealICQClient.LoginName) then continue;
+         RealICQUser:= TUsersService.GetUsersService.GetOrRequestUser(StrLogin);
+         StrLogin := RealICQUser.LoginName;
+         if Pos('-', StrLogin) > 0 then
+            StrLogin := Copy(StrLogin, Pos('-', StrLogin) + 1, Length(StrLogin));
+         if (Length(RealICQUser.DisplayName) <> 0) then
+            StrLogin := RealICQUser.DisplayName + '(' + StrLogin + ')';
+         FileName := RootPath + '联系人:' + StrLogin + '.txt';
+
+         TmpList.Clear;
+         for jLoop := 0 to Messages.Count - 1 do
+         begin
+            MessageSearchResult := Messages[jLoop];
+            if MessageSearchResult.TeamID <> '-1' then continue;
+            if (MessageSearchResult.Sender = UserList[iLoop]) or (MessageSearchResult.Receiver = UserList[iLoop]) then
+            begin
+              if MessageSearchResult.Sender = UserList[iLoop] then
+                 begin
+                   StrSender := StrLogin;
+                   RealICQUser := TUsersService.GetUsersService.GetOrRequestUser(MessageSearchResult.Receiver);
+                   StrReceiver := RealICQUser.LoginName;
+                   if Pos('-', StrReceiver) > 0 then
+                      StrReceiver := Copy(StrReceiver, Pos('-', StrReceiver) + 1, Length(StrReceiver));
+                   if (Length(RealICQUser.DisplayName) <> 0) then
+                      StrReceiver := RealICQUser.DisplayName + '(' + StrReceiver + ')';
+                 end
+              else
+                 begin
+                   StrReceiver := StrLogin;
+                   RealICQUser := TUsersService.GetUsersService.GetOrRequestUser(MessageSearchResult.Sender);
+                   StrSender := RealICQUser.LoginName;
+                   if Pos('-', StrSender) > 0 then
+                      StrSender := Copy(StrSender, Pos('-', StrSender) + 1, Length(StrSender));
+                   if (Length(RealICQUser.DisplayName) <> 0) then
+                      StrSender := RealICQUser.DisplayName + '(' + StrSender + ')';
+                 end;
+
+              StrTmp := DateToStr(MessageSearchResult.SendDateTime) + ' ';
+              StrTmp := StrTmp + TimeToStr(MessageSearchResult.SendDateTime) + ' ';
+              StrTmp := StrTmp + StrSender + #13#10;
+              StrTmp := StrTmp + #13#10 + MessageSearchResult.MessageStr + #13#10;
+              TmpList.Add(StrTmp);
+            end;
+         end;
+         if TmpList.Count > 0 then TmpList.SaveToFile(FileName);
+       end;
+     Messages.Free;
+     ProcessingForm.Free;
+     MessageBox(Handle, '所有历史记录导出完成! ', '提示', MB_OK or MB_ICONINFORMATION);
+     ShellExecute(handle, 'open', PChar('"' + RootPath + '"'), nil, nil, SW_SHOWNORMAL);
+  end;
+end;
+//------------------------------------------------------------------------------
 procedure TMessagesManagerForm.btSeeInfoClick(Sender: TObject);
 var LoginName,Url:String;
 
 begin
   Url:=btSeeInfo.Hint;
-  LoginName:=MainForm.RealICQClient.LoginName;
+  LoginName := MainForm.RealICQClient.LoginName;
   if AnsiPos('-',LoginName)>0 then
   begin
      LoginName:=Copy(LoginName,AnsiPos('-',LoginName)+1,Length(LoginName)-AnsiPos('-',LoginName));
@@ -346,8 +525,6 @@ begin
     ShellExecute(handle, 'open', PChar(MainForm.GetDefaultBrowser),PChar(Format(MainForm.RealICQClient.WebAppBaseURL + LoginURL, [StrToBase64(MainForm.RealICQClient.LoginName), StrToBase64(MD5En(MainForm.RealICQClient.Password)), StrToBase64(ReadMessageURL +Url)])),'',SW_SHOWDEFAULT);
 
 end;
-
-
 //------------------------------------------------------------------------------
 procedure TMessagesManagerForm.cbPageSizeChange(Sender: TObject);
 begin
@@ -358,7 +535,6 @@ begin
   else
     LoadMessages;
 end;
-
 //------------------------------------------------------------------------------
 procedure TMessagesManagerForm.ShowUsersMessages(ALoginName: String);
 var
@@ -389,8 +565,8 @@ begin
           begin
             if RealICQUser.LoginName = ALoginName then
             begin
-              Node.Selected := True;
-              Exit;
+               Node.Selected := True;
+               Exit;
             end;
           end;
         except
@@ -421,111 +597,6 @@ begin
   NodeUser.ImageIndex := 1;
   NodeUser.Selected := True;
 end;
-
-procedure TMessagesManagerForm.FileTransmitterCalculatedSpeed(Sender: TObject; ATransmittedSize: Int64);
-var
-  Completed: Integer;
-begin
-  Completed := ATransmittedSize*100 div FFileTransmitter.StreamLength;
-  SpeedButton1.Caption := IntToStr(Completed)+'%';
-end;
-
-procedure TMessagesManagerForm.FileTransmitterCompleted(Sender: TObject);
-begin
-  SpeedButton1.Enabled := True;
-  SpeedButton1.Caption := '备份';
-  MessageBox(Handle, PChar('消息记录已成功备份至服务器'), '提示', MB_OK or MB_ICONINFORMATION);
-  MainForm.DBHistory.OpenDBConntion;
-end;
-
-procedure TMessagesManagerForm.SpeedButton1Click(Sender: TObject);
-var
-  DBFile: String;
-begin
-  if Length(Trim(MainForm.RealICQClient.DBHistoryFileName)) > 0 then
-  begin
-    if MessageBox(Handle, PChar(Format('确定要替换服务器上%s的消息记录吗?', [DateTimeToStr(MainForm.RealICQClient.DBHistoryFileUploadDateTime)])), '提示', MB_OKCANCEL or MB_ICONQUESTION) <> ID_OK then Exit;
-  end;
-  
-  DBFile := MainForm.DBHistory.DBFileName;
-  try
-    try
-      MainForm.DBHistory.CloseDBConntion;
-      FFileTransmitter := TFileTransmitter.Create(MainForm.RealICQClient.TCPClient, tdSender, DBFile, 2, MainForm.RealICQClient.LoginName, 0, 0);
-      FFileTransmitter.OnTransmitting := FileTransmitterCalculatedSpeed;
-      FFileTransmitter.OnTransmitOK := FileTransmitterCompleted;
-      FFileTransmitter.SendFileRequest;
-      SpeedButton1.Enabled := False;
-    except
-      On E: Exception do MessageBox(Handle, PChar('备份消息记录时出错:' + E.Message), '提示', MB_OK);
-    end;
-  finally
-    //  MainForm.DBHistory.DBFileName := DBFile;
-  end;
-end;
-
-procedure TMessagesManagerForm.SpeedButton2Click(Sender: TObject);
-begin
-  if Length(Trim(MainForm.RealICQClient.DBHistoryFileName)) = 0 then
-  begin
-    MessageBox(Handle, '没有备份记录!', '提示', MB_OK);
-    Exit;
-  end;
-  
-  if MessageBox(Handle, PChar(Format('确定要将 %s 的消息记录恢复至本地吗?', [DateTimeToStr(MainForm.RealICQClient.DBHistoryFileUploadDateTime)])), '提示', MB_OKCANCEL or MB_ICONQUESTION) <> ID_OK then Exit;
-  
-  FDownFile := TDownFile.Create;
-  FDownFile.OnComplete := DownFileComplete;
-  FDownFile.OnProgress := DownFileProgress;
-  
-  FDBFile := MainForm.DBHistory.DBFileName + '.TEMP';
-  FDownFile.ThreadDownFile(MainForm.RealICQClient.DBHistoryFileName, FDBFile);
-  SpeedButton2.Enabled := False;
-end;
-
-//------------------------------------------------------------------------------
-procedure TMessagesManagerForm.DownFileProgress(ulProgress, ulProgressMax, ulStatusCode: integer; szStatusText: String);
-var
-  Completed: Integer;
-begin
-  if ulProgressMax = 0 then Exit;
-  
-  Completed := ulProgress*100 div ulProgressMax;
-  SpeedButton2.Caption := IntToStr(Completed)+'%';
-end;
-
-//------------------------------------------------------------------------------
-procedure TMessagesManagerForm.DownFileComplete(Source_file, Dest_file:String; blStatus:boolean; ErrMessage:String);
-begin
-  SpeedButton2.Caption := '恢复';
-  SpeedButton2.Enabled := True;
-  if blStatus then
-  begin
-    try
-      ProcessingForm := TProcessingForm.Create(Self);
-      ProcessingForm.pnlClient.Caption := '正在恢复记录,请稍候...';
-      ProcessingForm.Show;
-      Application.ProcessMessages;
-      Sleep(400);
-      try
-        MainForm.DBHistory.RestoreMessageHistory(FDBFile);
-      finally
-        ProcessingForm.Free;
-      end;
-      MessageBox(Handle, '恢复消息记录成功!', '提示', MB_ICONINFORMATION);
-    except
-      MessageBox(Handle, PChar('恢复消息记录失败: ' + ErrMessage), '错误', MB_ICONERROR);
-    end;
-  end
-  else
-  begin
-    MessageBox(Handle, PChar('恢复消息记录失败: ' + ErrMessage), '错误', MB_ICONERROR);
-  end;
-
-  btRefresh.Click;
-  //tvSendersChange(tvSenders, tvSenders.Selected);
-end;
-
 //------------------------------------------------------------------------------
 procedure TMessagesManagerForm.ShowTeamsMessages(ATeamID: String);
 var
@@ -554,31 +625,20 @@ begin
     Node := Node.GetNext;
   end;
 end;
-
 //------------------------------------------------------------------------------
 procedure TMessagesManagerForm.LoadTreeViewItems;
 var
   iLoop, jLoop, iIndex: Integer;
-  LoginName,
-  GroupName,
-  ACaption: String;
-  ALoginName: String;
-  GroupMembers: TStringList;
-  AlreadyAddedUsers: TStringList;
+  LoginName, ALoginName, ACaption, GroupName: String;
+  ATeams, AUsers, GroupMembers, AlreadyAddedUsers, OtherContactors: TStringList;
+  BranchNodes: TList;
   RealICQUser: TRealICQUser;
   RealICQTeam: TRealICQTeam;
-  ATeams: TStringList;
-  NodeGroup,
-  NodeUser: TTreeNode;
-  
+  NodeGroup, NodeUser: TTreeNode;
+  Branch, TmpBranch: TRealICQBranch;
   BranchInfo: TRealICQBranchInfo;
-  Branch,
-  TmpBranch: TRealICQBranch;
   Employee: TRealICQEmployee;
-  BranchNodes: TList;
-  OtherContactors: TStringList;
   ATreeView: TRealICQContacterTreeView;
-  AUsers: TStringList;
 
   procedure AddGroupUsers(AGroupName: String; GroupList: TStringList);
   var
@@ -596,9 +656,9 @@ var
         if AGroupName='其他联系人' then
         begin
            if (AnsiPos('+',LoginName)<=0) and (trim(MainForm.RealICQClient.CenterServerID)<>'') then
-              LoginName:=MainForm.RealICQClient.CenterServerID+'+'+LoginName;
+              LoginName := MainForm.RealICQClient.CenterServerID + '+' + LoginName;
         end;
-     
+
         if AnsiSameText(LoginName, MainForm.RealICQClient.LoginName) then continue;
         if AlreadyAddedUsers.IndexOf(LoginName) >= 0  then continue;
 
@@ -629,7 +689,7 @@ begin
   tvSenders.Items.Clear;
   cbSearchRange.Items.Clear;
   cbSearchRange.Items.Add('全部记录');
-  
+
   if MainForm.ShowGroup and (MainForm.RealICQClient.WorkingMode = wmPublic) then
   begin
     for iLoop := MainForm.Groups.Count - 1 downto 0 do
@@ -647,12 +707,13 @@ begin
         if RealICQUser <> nil then
         begin
           ALoginName := RealICQUser.LoginName;
-          if Pos('-', ALoginName) > 0 then ALoginName := Copy(ALoginName, Pos('-', ALoginName) + 1, Length(ALoginName));
+          if Pos('-', ALoginName) > 0 then
+             ALoginName := Copy(ALoginName, Pos('-', ALoginName) + 1, Length(ALoginName));
 
           if (Length(RealICQUser.DisplayName) = 0) then
-            ACaption := ALoginName
+              ACaption := ALoginName
           else
-            ACaption := RealICQUser.DisplayName + '<' + ALoginName + '>';
+              ACaption := RealICQUser.DisplayName + '<' + ALoginName + '>';
             
           NodeUser := tvSenders.Items.AddChild(NodeGroup, ACaption);
           NodeUser.Data := RealICQUser;
@@ -767,7 +828,7 @@ begin
     finally
       FreeAndNil(BranchNodes);
       if AUsers <> nil then
-        FreeAndNil(AUsers);
+         FreeAndNil(AUsers);
     end;
   //end;
 
@@ -776,7 +837,7 @@ begin
   AddGroupUsers(GroupName, TFriendsService.GetService.GetFriends);
   NodeGroup.MoveTo(NodeGroup.Parent, naAddChildFirst);
 
-  GroupName := '其他联系人';           
+  GroupName := '其他联系人';
   OtherContactors := MainForm.DBHistory.GetContactors;
   AddGroupUsers(GroupName, OtherContactors);
 
@@ -790,11 +851,10 @@ begin
     for iLoop := 0 to ATeams.Count - 1 do
     begin
       RealICQTeam := ATeams.Objects[iLoop] as TRealICQTeam;
-      if (Length(RealICQTeam.TeamCaption) = 0) then
-        ACaption := RealICQTeam.TeamID
+      if Length(RealICQTeam.TeamCaption) = 0 then
+         ACaption := RealICQTeam.TeamID
       else
-        ACaption := RealICQTeam.TeamCaption + '<群号码:' + RealICQTeam.TeamID + '>';
-
+         ACaption := RealICQTeam.TeamCaption + '<群号码:' + RealICQTeam.TeamID + '>';
       NodeUser := tvSenders.Items.AddChild(NodeGroup, ACaption);
       NodeUser.Data := RealICQTeam;
       NodeUser.StateIndex := TeamStateIndex;
@@ -811,7 +871,7 @@ begin
   NodeGroup := tvSenders.Items.AddChild(nil, LVSystemMessage);
   NodeGroup.StateIndex := SystemMessageStateIndex;
   NodeGroup.ImageIndex := 6;
-                                 
+
   //添加查找结果结节
   NodeGroup := tvSenders.Items.AddChild(nil, '查找结果');
   NodeGroup.StateIndex := SearchResultStateIndex;
@@ -820,13 +880,113 @@ begin
   AlreadyAddedUsers.Free;
   cbSearchRange.ItemIndex := 0;
 end;
+//------------------------------------------------------------------------------
+procedure TMessagesManagerForm.SpeedButton1Click(Sender: TObject);
+var
+  DBFile: String;
+begin
+  if Length(Trim(MainForm.RealICQClient.DBHistoryFileName)) > 0 then
+  begin
+    if MessageBox(Handle, PChar(Format('确定要替换服务器上%s的消息记录吗?', [DateTimeToStr(MainForm.RealICQClient.DBHistoryFileUploadDateTime)])), '提示', MB_OKCANCEL or MB_ICONQUESTION) <> ID_OK then Exit;
+  end;
+  
+  DBFile := MainForm.DBHistory.DBFileName;
+  try
+    try
+      MainForm.DBHistory.CloseDBConntion;
+      FFileTransmitter := TFileTransmitter.Create(MainForm.RealICQClient.TCPClient, tdSender, DBFile, 2, MainForm.RealICQClient.LoginName, 0, 0);
+      FFileTransmitter.OnTransmitting := FileTransmitterCalculatedSpeed;
+      FFileTransmitter.OnTransmitOK := FileTransmitterCompleted;
+      FFileTransmitter.SendFileRequest;
+      SpeedButton1.Enabled := False;
+    except
+      On E: Exception do MessageBox(Handle, PChar('备份消息记录时出错:' + E.Message), '提示', MB_OK);
+    end;
+  finally
+    //  MainForm.DBHistory.DBFileName := DBFile;
+  end;
+end;
+//------------------------------------------------------------------------------
+procedure TMessagesManagerForm.SpeedButton2Click(Sender: TObject);
+begin
+  if Length(Trim(MainForm.RealICQClient.DBHistoryFileName)) = 0 then
+  begin
+    MessageBox(Handle, '没有备份记录!', '提示', MB_OK);
+    Exit;
+  end;
+  
+  if MessageBox(Handle, PChar(Format('确定要将 %s 的消息记录恢复至本地吗?', [DateTimeToStr(MainForm.RealICQClient.DBHistoryFileUploadDateTime)])), '提示', MB_OKCANCEL or MB_ICONQUESTION) <> ID_OK then Exit;
+  
+  FDownFile := TDownFile.Create;
+  FDownFile.OnComplete := DownFileComplete;
+  FDownFile.OnProgress := DownFileProgress;
+  
+  FDBFile := MainForm.DBHistory.DBFileName + '.TEMP';
+  FDownFile.ThreadDownFile(MainForm.RealICQClient.DBHistoryFileName, FDBFile);
+  SpeedButton2.Enabled := False;
+end;
+//------------------------------------------------------------------------------
+procedure TMessagesManagerForm.FileTransmitterCalculatedSpeed(Sender: TObject; ATransmittedSize: Int64);
+var
+  Completed: Integer;
+begin
+  Completed := ATransmittedSize*100 div FFileTransmitter.StreamLength;
+  SpeedButton1.Caption := IntToStr(Completed)+'%';
+end;
+//------------------------------------------------------------------------------
+procedure TMessagesManagerForm.FileTransmitterCompleted(Sender: TObject);
+begin
+  SpeedButton1.Enabled := True;
+  SpeedButton1.Caption := '备份';
+  MessageBox(Handle, PChar('消息记录已成功备份至服务器'), '提示', MB_OK or MB_ICONINFORMATION);
+  MainForm.DBHistory.OpenDBConntion;
+end;
+//------------------------------------------------------------------------------
+procedure TMessagesManagerForm.DownFileProgress(ulProgress, ulProgressMax, ulStatusCode: integer; szStatusText: String);
+var
+  Completed: Integer;
+begin
+  if ulProgressMax = 0 then Exit;
+  
+  Completed := ulProgress*100 div ulProgressMax;
+  SpeedButton2.Caption := IntToStr(Completed)+'%';
+end;
+//------------------------------------------------------------------------------
+procedure TMessagesManagerForm.DownFileComplete(Source_file, Dest_file:String; blStatus:boolean; ErrMessage:String);
+begin
+  SpeedButton2.Caption := '恢复';
+  SpeedButton2.Enabled := True;
+  if blStatus then
+  begin
+    try
+      ProcessingForm := TProcessingForm.Create(Self);
+      ProcessingForm.pnlClient.Caption := '正在恢复记录,请稍候...';
+      ProcessingForm.Show;
+      Application.ProcessMessages;
+      Sleep(400);
+      try
+        MainForm.DBHistory.RestoreMessageHistory(FDBFile);
+      finally
+        ProcessingForm.Free;
+      end;
+      MessageBox(Handle, '恢复消息记录成功!', '提示', MB_ICONINFORMATION);
+    except
+      MessageBox(Handle, PChar('恢复消息记录失败: ' + ErrMessage), '错误', MB_ICONERROR);
+    end;
+  end
+  else
+  begin
+    MessageBox(Handle, PChar('恢复消息记录失败: ' + ErrMessage), '错误', MB_ICONERROR);
+  end;
 
+  btRefresh.Click;
+  //tvSendersChange(tvSenders, tvSenders.Selected);
+end;
 //------------------------------------------------------------------------------
 procedure TMessagesManagerForm.lvContentsResize(Sender: TObject);
 begin
   lvContents.Columns.Items[3].Width := lvContents.Width - 308;
 end;
-
 //------------------------------------------------------------------------------
 procedure TMessagesManagerForm.miDelMessageHistoryClick(Sender: TObject);
 var
@@ -862,18 +1022,15 @@ begin
   end;
   tvSendersChange(tvSenders, Node);
 end;
-
 //------------------------------------------------------------------------------
 procedure TMessagesManagerForm.ppListViewPopup(Sender: TObject);
 begin
   MenuItem1.Enabled := btDel.Enabled;
 end;
-
 procedure TMessagesManagerForm.ppTreeNodePopup(Sender: TObject);
 begin
   miDelMessageHistory.Visible := tvSenders.Selected <> nil;
 end;
-
 //------------------------------------------------------------------------------
 procedure TMessagesManagerForm.lvContentsChange(Sender: TObject;
   Item: TListItem; Change: TItemChange);
@@ -971,7 +1128,6 @@ begin
 
   InsertHTML(WebBrowser, AMessageStr);
 end;
-
 procedure TMessagesManagerForm.lvContentsClick(Sender: TObject);
 begin
 
@@ -979,13 +1135,11 @@ begin
      self.lvContentsChange(Sender,lvContents.Selected,ctText);
   
 end;
-
 procedure TMessagesManagerForm.lvContentsColumnClick(Sender: TObject;
   Column: TListColumn);
 begin
    //
 end;
-
 //------------------------------------------------------------------------------
 procedure TMessagesManagerForm.lvContentsDblClick(Sender: TObject);
 var
@@ -1010,12 +1164,10 @@ begin
             SystemMessageSearchResult.AutoCloseTime);
   end;
 end;
-
 procedure TMessagesManagerForm.lvContentsMouseUp(Sender: TObject;
   Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
 begin
 end;
-
 //------------------------------------------------------------------------------
 procedure TMessagesManagerForm.btDelClick(Sender: TObject);
 var
@@ -1058,7 +1210,6 @@ begin
       end;
   end;
 end;
-
 //------------------------------------------------------------------------------
 procedure TMessagesManagerForm.btLastClick(Sender: TObject);
 begin
@@ -1071,7 +1222,6 @@ begin
   else
     LoadMessages;
 end;
-
 //------------------------------------------------------------------------------
 procedure TMessagesManagerForm.btNextClick(Sender: TObject);
 begin
@@ -1084,7 +1234,6 @@ begin
   else
     LoadMessages;
 end;
-
 //------------------------------------------------------------------------------
 procedure TMessagesManagerForm.btFirstClick(Sender: TObject);
 begin
@@ -1097,7 +1246,6 @@ begin
   else
     LoadMessages;
 end;
-
 //------------------------------------------------------------------------------
 procedure TMessagesManagerForm.btPrevClick(Sender: TObject);
 begin
@@ -1110,14 +1258,12 @@ begin
   else
     LoadMessages;
 end;
-
 procedure TMessagesManagerForm.btRefreshClick(Sender: TObject);
 begin
   Self.ClearContents;
   ClearHTML(WebBrowser);
   LoadTreeViewItems;
 end;
-
 //------------------------------------------------------------------------------
 procedure TMessagesManagerForm.ClearContents;
 var
@@ -1136,7 +1282,6 @@ begin
   lblSender.Caption := '发信人:';
   ClearHTML(WebBrowser);
 end;
-
 //------------------------------------------------------------------------------
 procedure TMessagesManagerForm.ShowSystemMessages(Messages: TList);
 var
@@ -1175,7 +1320,6 @@ begin
       Messages.Free;
     end;
 end;
-
 //------------------------------------------------------------------------------
 procedure TMessagesManagerForm.SetPageSetsState;
 begin
@@ -1192,7 +1336,6 @@ begin
     btLast.Enabled := btNext.Enabled;
     pnlPageSet.Visible := True;
 end;
-
 //------------------------------------------------------------------------------
 procedure TMessagesManagerForm.ShowMessages(Messages: TList);
 var
@@ -1241,7 +1384,8 @@ begin
           begin
             RealICQUser:= TUsersService.GetUsersService.GetOrRequestUser(MessageSearchResult.Receiver);
             ALoginName := RealICQUser.LoginName;
-            if Pos('-', ALoginName) > 0 then ALoginName := Copy(ALoginName, Pos('-', ALoginName) + 1, Length(ALoginName));
+            if Pos('-', ALoginName) > 0 then
+               ALoginName := Copy(ALoginName, Pos('-', ALoginName) + 1, Length(ALoginName));
             if (Length(RealICQUser.DisplayName) = 0) then
               ReceiverName := RealICQUser.LoginName
             else
@@ -1276,7 +1420,6 @@ begin
       Messages.Free;
     end;
 end;
-
 //------------------------------------------------------------------------------
 procedure TMessagesManagerForm.LoadMessages;
 var
@@ -1300,7 +1443,6 @@ begin
       DBHistorySearchResult.Free;
     end;
 end;
-
 //------------------------------------------------------------------------------
 procedure TMessagesManagerForm.LoadSystemMessages;
 var
@@ -1320,7 +1462,6 @@ begin
       DBHistorySearchResult.Free;
     end;
 end;
-
 //------------------------------------------------------------------------------
 procedure TMessagesManagerForm.LoadSMSMessages;
 var
@@ -1343,10 +1484,8 @@ begin
       DBHistorySearchResult.Free;
     end;
 end;
-
 //------------------------------------------------------------------------------
-procedure TMessagesManagerForm.tvSendersChange(Sender: TObject;
-  Node: TTreeNode);
+procedure TMessagesManagerForm.tvSendersChange(Sender: TObject; Node: TTreeNode);
 var
   RealICQUser: TRealICQUser;
   RealICQTeam: TRealICQTeam;
@@ -1412,12 +1551,6 @@ begin
     lvContents.Items.EndUpdate;
   end;
 end;
-
-procedure TMessagesManagerForm.tvSendersClick(Sender: TObject);
-begin
-
-end;
-
 //------------------------------------------------------------------------------
 procedure TMessagesManagerForm.tvSendersCustomDrawItem(Sender: TCustomTreeView;
   Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
@@ -1431,16 +1564,12 @@ begin
       Node.ImageIndex := 4;
   end;
 end;
-
 //------------------------------------------------------------------------------
-procedure TMessagesManagerForm.tvSendersGetSelectedIndex(Sender: TObject;
-  Node: TTreeNode);
+procedure TMessagesManagerForm.tvSendersGetSelectedIndex(Sender: TObject; Node: TTreeNode);
 begin
   Node.SelectedIndex := Node.ImageIndex;
 end;
-
-procedure TMessagesManagerForm.tvSendersMouseUp(Sender: TObject;
-  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
+procedure TMessagesManagerForm.tvSendersMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
 var
   Node: TTreeNode;
   P: TPoint;
@@ -1463,7 +1592,6 @@ begin
   end;
 
 end;
-
 {设置WebBrowser的样式}
 //------------------------------------------------------------------------------
 procedure TMessagesManagerForm.SetDOMStyle(Doc:IHTMLDocument2);
@@ -1474,7 +1602,6 @@ begin
   Doc.body.style.fontSize := '9pt';
   Doc.body.style.margin := '2pt';
 end;
-
 //------------------------------------------------------------------------------
 procedure TMessagesManagerForm.WebBrowserBeforeNavigate2(ASender: TObject;
   const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,
@@ -1531,7 +1658,6 @@ begin
   end;
   {$endregion}
 end;
-
 procedure TMessagesManagerForm.WebBrowserDocumentComplete(ASender: TObject;
   const pDisp: IDispatch; var URL: OleVariant);
 begin
@@ -1540,14 +1666,12 @@ begin
   except
   end;
 end;
-
 //------------------------------------------------------------------------------
 procedure TMessagesManagerForm.FormClose(Sender: TObject;
   var Action: TCloseAction);
 begin
   Action := caFree;
 end;
-
 //------------------------------------------------------------------------------
 procedure TMessagesManagerForm.FormCloseQuery(Sender: TObject;
   var CanClose: Boolean);
@@ -1555,7 +1679,6 @@ begin
   lvContents.OnChange := nil;
   CanClose := True;
 end;
-
 //------------------------------------------------------------------------------
 procedure TMessagesManagerForm.FormCreate(Sender: TObject);
 begin
@@ -1570,13 +1693,11 @@ begin
   AddUserStatePictureToImageList(ImgLstNodeImage);
   LoadTreeViewItems;
 end;
-
 //------------------------------------------------------------------------------
 procedure TMessagesManagerForm.FormDestroy(Sender: TObject);
 begin
   MessagesManagerForm := nil;
 end;
-
 //------------------------------------------------------------------------------
 procedure TMessagesManagerForm.CreateParams(var Params: TCreateParams);
 begin

+ 11 - 21
Controls/RealICQClient/RealICQDBHistory.pas

@@ -5,15 +5,7 @@
 历  史:
 2006.5.10:创建文件(尹进)
 }
-
-
-
-
-
-
-
-
-unit RealICQDBHistory;
+
unit RealICQDBHistory;
 
 interface
 
@@ -137,7 +129,7 @@ type
     procedure UpdateMsgDB;
     procedure SetReadFlag(ATeamID, Sender: string);
 
-      //获取最近联系人列表
+    //获取最近联系人列表
     function GetLatests(AReceiver: string): TStringList;
     function GetContactors: TStringList;
     procedure RestoreMessageHistory(ADBFileName: string);
@@ -490,7 +482,7 @@ begin
   ADODataSet := TADODataSet.Create(nil);
   try
     ADODataSet.Connection := FADOConnection;
-    ADODataSet.CommandText := 'SELECT * FROM Messages';
+    ADODataSet.CommandText := 'SELECT * FROM Messages order by SendDateTime asc';
     if not SearchAllMessage then
     begin
       try
@@ -694,16 +686,14 @@ begin
   try
     ADODataSet.Connection := FADOConnection;
     ADODataSet.CommandText := 'SELECT DISTINCT Sender FROM Messages WHERE TeamID = ''-1''';
-
     ADODataSet.Open;
     while not ADODataSet.Eof do
     begin
-      if Result.IndexOf(ADODataSet.FieldByName('Sender').AsString) = -1 then
-        Result.Add(ADODataSet.FieldByName('Sender').AsString);
-
-      if Result.Count >= 100 then
-        Break;
-      ADODataSet.Next;
+        if Result.IndexOf(ADODataSet.FieldByName('Sender').AsString) = -1 then
+           Result.Add(ADODataSet.FieldByName('Sender').AsString);
+        if Result.Count >= 100 then
+           Break;
+        ADODataSet.Next;
     end;
 
     ADODataSet.Close;
@@ -719,16 +709,16 @@ begin
         Break;
       ADODataSet.Next;
     end;
+
   except
     on Ex: Exception do
     begin
-      Error(Ex.Message, 'TRealICQDBHistory.GetContactors');
+      Error(Ex.Message,'TRealICQDBHistory.GetContactors');
       FreeAndNil(ADODataSet);
     end;
   end;
   FreeAndNil(ADODataSet);
-end;
-
+end;
 
 //获取最近联系人列表
 function TRealICQDBHistory.GetLatests(AReceiver: string): TStringList;

+ 23 - 23
Controls/RealICQComponents.dproj

@@ -35,18 +35,29 @@
     <DelphiCompile Include="RealICQComponents.dpk">
       <MainSource>MainSource</MainSource>
     </DelphiCompile>
-    <DCCReference Include="adortl.dcp" />
-    <DCCReference Include="dbrtl.dcp" />
-    <DCCReference Include="DCEF_D7.dcp" />
-    <DCCReference Include="dclOffice2k.dcp" />
-    <DCCReference Include="designide.dcp" />
-    <DCCReference Include="DirectX9_D2005.dcp" />
-    <DCCReference Include="dsnap.dcp" />
-    <DCCReference Include="DSPack_D2005.dcp" />
-    <DCCReference Include="IndyCore90.dcp" />
-    <DCCReference Include="IndyProtocols90.dcp" />
-    <DCCReference Include="IndySystem90.dcp" />
-    <DCCReference Include="inet.dcp" />
+    <DCCReference Include="..\adortl.dcp" />
+    <DCCReference Include="..\dbrtl.dcp" />
+    <DCCReference Include="..\DCEF_D7.dcp" />
+    <DCCReference Include="..\dclOffice2k.dcp" />
+    <DCCReference Include="..\designide.dcp" />
+    <DCCReference Include="..\DirectX9_D2005.dcp" />
+    <DCCReference Include="..\dsnap.dcp" />
+    <DCCReference Include="..\DSPack_D2005.dcp" />
+    <DCCReference Include="..\IndyCore90.dcp" />
+    <DCCReference Include="..\IndyProtocols90.dcp" />
+    <DCCReference Include="..\IndySystem90.dcp" />
+    <DCCReference Include="..\inet.dcp" />
+    <DCCReference Include="..\rtl.dcp" />
+    <DCCReference Include="..\soaprtl.dcp" />
+    <DCCReference Include="..\vcl.dcp" />
+    <DCCReference Include="..\vclactnband.dcp" />
+    <DCCReference Include="..\vcldb.dcp" />
+    <DCCReference Include="..\vclie.dcp" />
+    <DCCReference Include="..\vclimg.dcp" />
+    <DCCReference Include="..\vcljpg.dcp" />
+    <DCCReference Include="..\VclSmp.dcp" />
+    <DCCReference Include="..\vclx.dcp" />
+    <DCCReference Include="..\xmlrtl.dcp" />
     <DCCReference Include="RealICQClient\AESLib.pas" />
     <DCCReference Include="RealICQClient\AudioTransmitter.pas" />
     <DCCReference Include="RealICQClient\BlowFish.pas" />
@@ -125,17 +136,6 @@
     <DCCReference Include="RealICQUI\SingleBorderHintWindow.pas" />
     <DCCReference Include="RealICQUI\WebBrowserWithUI.pas" />
     <DCCReference Include="RealICQUI\xFonts.pas" />
-    <DCCReference Include="rtl.dcp" />
-    <DCCReference Include="soaprtl.dcp" />
-    <DCCReference Include="vcl.dcp" />
-    <DCCReference Include="vclactnband.dcp" />
-    <DCCReference Include="vcldb.dcp" />
-    <DCCReference Include="vclie.dcp" />
-    <DCCReference Include="vclimg.dcp" />
-    <DCCReference Include="vcljpg.dcp" />
-    <DCCReference Include="VclSmp.dcp" />
-    <DCCReference Include="vclx.dcp" />
-    <DCCReference Include="xmlrtl.dcp" />
     <None Include="ModelSupport_RealICQComponents\default.txaPackage" />
     <None Include="ModelSupport_RealICQComponents\default.txvpck" />
     <None Include="ModelSupport_RealICQComponents\Encrypt\default.txaPackage" />

+ 12 - 21
RealICQ Projects For Win32.groupproj

@@ -10,6 +10,15 @@
     <BorlandProject>
 <BorlandProject xmlns=""><Default.Personality></Default.Personality></BorlandProject></BorlandProject>
   </ProjectExtensions>
+  <Target Name="Lxtalk">
+    <MSBuild Projects="Client\Lxtalk.dproj" Targets="" />
+  </Target>
+  <Target Name="Lxtalk:Clean">
+    <MSBuild Projects="Client\Lxtalk.dproj" Targets="Clean" />
+  </Target>
+  <Target Name="Lxtalk:Make">
+    <MSBuild Projects="Client\Lxtalk.dproj" Targets="Make" />
+  </Target>
   <Target Name="DCEF_D7">
     <MSBuild Projects="Includes\DelphiChromiumembedded\packages\DCEF_D7.dproj" Targets="" />
   </Target>
@@ -181,24 +190,6 @@
   <Target Name="AppCentrelib:Make">
     <MSBuild Projects="AppCom\AppCentrelib.dproj" Targets="Make" />
   </Target>
-  <Target Name="AppCentre">
-    <MSBuild Projects="AppCentre\AppCentre.dproj" Targets="" />
-  </Target>
-  <Target Name="AppCentre:Clean">
-    <MSBuild Projects="AppCentre\AppCentre.dproj" Targets="Clean" />
-  </Target>
-  <Target Name="AppCentre:Make">
-    <MSBuild Projects="AppCentre\AppCentre.dproj" Targets="Make" />
-  </Target>
-  <Target Name="Lxtalk">
-    <MSBuild Projects="Client\Lxtalk.dproj" Targets="" />
-  </Target>
-  <Target Name="Lxtalk:Clean">
-    <MSBuild Projects="Client\Lxtalk.dproj" Targets="Clean" />
-  </Target>
-  <Target Name="Lxtalk:Make">
-    <MSBuild Projects="Client\Lxtalk.dproj" Targets="Make" />
-  </Target>
   <Target Name="FlatStyle">
     <MSBuild Projects="Includes\FlatStyle\FlatStyle.dproj" Targets="" />
   </Target>
@@ -218,12 +209,12 @@
     <MSBuild Projects="Controls\RealICQComponents.dproj" Targets="Make" />
   </Target>
   <Target Name="Build">
-    <CallTarget Targets="DCEF_D7;CnPack_D2007;dclCnPack_D2007;DSPack_D2005;DirectX9_D2005;DSPackDesign_D2005;dclIndyCore90;IndyCore90;dclIndyProtocols90;IndyProtocols90;IndySystem90;Logger;RealICQCOMInterfaces;LoggerTest;CA;AppCentreCom;CSAuthDemo;GroupClientCase;AppCentrelib;AppCentre;Lxtalk;FlatStyle;RealICQComponents" />
+    <CallTarget Targets="Lxtalk;DCEF_D7;CnPack_D2007;dclCnPack_D2007;DSPack_D2005;DirectX9_D2005;DSPackDesign_D2005;dclIndyCore90;IndyCore90;dclIndyProtocols90;IndyProtocols90;IndySystem90;Logger;RealICQCOMInterfaces;LoggerTest;CA;AppCentreCom;CSAuthDemo;GroupClientCase;AppCentrelib;FlatStyle;RealICQComponents" />
   </Target>
   <Target Name="Clean">
-    <CallTarget Targets="DCEF_D7:Clean;CnPack_D2007:Clean;dclCnPack_D2007:Clean;DSPack_D2005:Clean;DirectX9_D2005:Clean;DSPackDesign_D2005:Clean;dclIndyCore90:Clean;IndyCore90:Clean;dclIndyProtocols90:Clean;IndyProtocols90:Clean;IndySystem90:Clean;Logger:Clean;RealICQCOMInterfaces:Clean;LoggerTest:Clean;CA:Clean;AppCentreCom:Clean;CSAuthDemo:Clean;GroupClientCase:Clean;AppCentrelib:Clean;AppCentre:Clean;Lxtalk:Clean;FlatStyle:Clean;RealICQComponents:Clean" />
+    <CallTarget Targets="Lxtalk:Clean;DCEF_D7:Clean;CnPack_D2007:Clean;dclCnPack_D2007:Clean;DSPack_D2005:Clean;DirectX9_D2005:Clean;DSPackDesign_D2005:Clean;dclIndyCore90:Clean;IndyCore90:Clean;dclIndyProtocols90:Clean;IndyProtocols90:Clean;IndySystem90:Clean;Logger:Clean;RealICQCOMInterfaces:Clean;LoggerTest:Clean;CA:Clean;AppCentreCom:Clean;CSAuthDemo:Clean;GroupClientCase:Clean;AppCentrelib:Clean;FlatStyle:Clean;RealICQComponents:Clean" />
   </Target>
   <Target Name="Make">
-    <CallTarget Targets="DCEF_D7:Make;CnPack_D2007:Make;dclCnPack_D2007:Make;DSPack_D2005:Make;DirectX9_D2005:Make;DSPackDesign_D2005:Make;dclIndyCore90:Make;IndyCore90:Make;dclIndyProtocols90:Make;IndyProtocols90:Make;IndySystem90:Make;Logger:Make;RealICQCOMInterfaces:Make;LoggerTest:Make;CA:Make;AppCentreCom:Make;CSAuthDemo:Make;GroupClientCase:Make;AppCentrelib:Make;AppCentre:Make;Lxtalk:Make;FlatStyle:Make;RealICQComponents:Make" />
+    <CallTarget Targets="Lxtalk:Make;DCEF_D7:Make;CnPack_D2007:Make;dclCnPack_D2007:Make;DSPack_D2005:Make;DirectX9_D2005:Make;DSPackDesign_D2005:Make;dclIndyCore90:Make;IndyCore90:Make;dclIndyProtocols90:Make;IndyProtocols90:Make;IndySystem90:Make;Logger:Make;RealICQCOMInterfaces:Make;LoggerTest:Make;CA:Make;AppCentreCom:Make;CSAuthDemo:Make;GroupClientCase:Make;AppCentrelib:Make;FlatStyle:Make;RealICQComponents:Make" />
   </Target>
 </Project>