MessagesManagerFrm.pas 59 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712
  1. unit MessagesManagerFrm;
  2. interface
  3. uses
  4. TransmitDirection,
  5. FileTransmitterObjective, md5, MyInputBoxFrm,
  6. FileTransmitter, DownloadFileFromWeb,ShellAPI,
  7. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, StrUtils, xFonts,
  8. Dialogs, ExtCtrls, ActnCtrls, ActnMan, ActnMenus, ToolWin, ComCtrls, ImgList, MSHTML,
  9. Menus, ActnList, StdStyleActnCtrls, Buttons, StdCtrls, OleCtrls, SHDocVw, RealICQClient,
  10. RealICQUtils, RealICQSkinFrm, ShareUtils, RealICQContacterTreeView, RealICQModel,
  11. RealICQSpeedButton, RealICQButton, FileCtrl;
  12. type
  13. TMessagesManagerForm = class(TRealICQSkinForm)
  14. pnlClient: TPanel;
  15. Splitter1: TSplitter;
  16. CoolBar1: TCoolBar;
  17. Panel2: TPanel;
  18. Label1: TLabel;
  19. Label2: TLabel;
  20. btSearch: TSpeedButton;
  21. btRefresh: TSpeedButton;
  22. btDel: TSpeedButton;
  23. Bevel1: TBevel;
  24. cbSearchRange: TComboBox;
  25. edKeyword: TEdit;
  26. pnlLeft: TPanel;
  27. tvSenders: TTreeView;
  28. pnlRight: TPanel;
  29. Splitter2: TSplitter;
  30. lvContents: TListView;
  31. pnlContent: TPanel;
  32. pnlHeaders: TPanel;
  33. lblDate: TLabel;
  34. lblTime: TLabel;
  35. lblSender: TLabel;
  36. ScrollBox1: TScrollBox;
  37. WebBrowser: TWebBrowser;
  38. pnlPageSet: TPanel;
  39. btNext: TSpeedButton;
  40. btLast: TSpeedButton;
  41. btFirst: TSpeedButton;
  42. btPrev: TSpeedButton;
  43. lblPages: TLabel;
  44. Label3: TLabel;
  45. cbPageSize: TComboBox;
  46. ImgLstNodeImage: TImageList;
  47. ppTreeNode: TPopupMenu;
  48. miDelMessageHistory: TMenuItem;
  49. ppListView: TPopupMenu;
  50. MenuItem1: TMenuItem;
  51. SpeedButton1: TSpeedButton;
  52. SpeedButton2: TSpeedButton;
  53. btSeeInfo: TRealICQButton;
  54. btExportAllMsg: TSpeedButton;
  55. procedure lvContentsColumnClick(Sender: TObject; Column: TListColumn);
  56. procedure lvContentsClick(Sender: TObject);
  57. procedure btSeeInfoClick(Sender: TObject);
  58. procedure SpeedButton2Click(Sender: TObject);
  59. procedure SpeedButton1Click(Sender: TObject);
  60. procedure lvContentsMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  61. procedure ppListViewPopup(Sender: TObject);
  62. procedure btNextClick(Sender: TObject);
  63. procedure btLastClick(Sender: TObject);
  64. procedure btPrevClick(Sender: TObject);
  65. procedure btFirstClick(Sender: TObject);
  66. procedure btDelClick(Sender: TObject);
  67. procedure btSearchClick(Sender: TObject);
  68. procedure btRefreshClick(Sender: TObject);
  69. procedure lvContentsDblClick(Sender: TObject);
  70. procedure WebBrowserDocumentComplete(ASender: TObject; const pDisp: IDispatch; var URL: OleVariant);
  71. procedure lvContentsChange(Sender: TObject; Item: TListItem;Change: TItemChange);
  72. procedure tvSendersChange(Sender: TObject; Node: TTreeNode);
  73. procedure lvContentsResize(Sender: TObject);
  74. procedure tvSendersGetSelectedIndex(Sender: TObject; Node: TTreeNode);
  75. procedure tvSendersCustomDrawItem(Sender: TCustomTreeView; Node: TTreeNode;State: TCustomDrawState; var DefaultDraw: Boolean);
  76. procedure FormClose(Sender: TObject; var Action: TCloseAction);
  77. procedure FormDestroy(Sender: TObject);
  78. procedure FormCreate(Sender: TObject);
  79. procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  80. procedure ppTreeNodePopup(Sender: TObject);
  81. procedure tvSendersMouseUp(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);
  82. procedure miDelMessageHistoryClick(Sender: TObject);
  83. procedure cbPageSizeChange(Sender: TObject);
  84. procedure WebBrowserBeforeNavigate2(ASender: TObject;const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,Headers: OleVariant; var Cancel: WordBool);
  85. procedure btExportAllMsgClick(Sender: TObject);
  86. private
  87. FBaseURL: string;
  88. FRecordCount: Integer;
  89. FPageCount: Integer;
  90. FPageIndex: Integer;
  91. FTeamID: String;
  92. FSender: String;
  93. FReceiver: String;
  94. FFileTransmitter: TFileTransmitter;
  95. FDownFile: TDownFile;
  96. FDBFile: String;
  97. procedure DownFileProgress(ulProgress, ulProgressMax, ulStatusCode: integer; szStatusText: String);
  98. procedure DownFileComplete(Source_file, Dest_file:String; blStatus:boolean; ErrMessage:String);
  99. procedure LoadTreeViewItems;
  100. procedure ClearContents;
  101. procedure SetDOMStyle(Doc:IHTMLDocument2);
  102. procedure ShowMessages(Messages: TList);
  103. procedure LoadMessages;
  104. procedure SetPageSetsState;
  105. procedure ShowSystemMessages(Messages: TList);
  106. procedure LoadSystemMessages;
  107. procedure LoadSMSMessages;
  108. procedure FileTransmitterCalculatedSpeed(Sender: TObject; ATransmittedSize: Int64);
  109. procedure FileTransmitterCompleted(Sender: TObject);
  110. protected
  111. procedure CreateParams(var Params: TCreateParams); override;
  112. public
  113. procedure ChangeUIColor(AColor: TColor); override;
  114. procedure ShowUsersMessages(ALoginName: String);
  115. procedure ShowTeamsMessages(ATeamID: String);
  116. function IsDigit(S: String): Boolean;
  117. end;
  118. var
  119. MessagesManagerForm: TMessagesManagerForm;
  120. implementation
  121. uses
  122. MainFrm, RealICQDBHistory, TalkingFrm, SystemMessageFrm, ProcessingFrm, TeamsAdapter,
  123. UsersService, FriendsService, FileTransmitAdapter;
  124. const
  125. UserStateIndex: Integer = 1;
  126. TeamStateIndex: Integer = 2;
  127. SystemMessageStateIndex: Integer = 3;
  128. SearchResultStateIndex: Integer = 4;
  129. SMSMessageStateIndex: Integer = 5;
  130. {$R *.dfm}
  131. {为消息添加字体信息}
  132. //------------------------------------------------------------------------------
  133. procedure AddFontStyle(var AMessageContent: String; FontStr: String);
  134. var
  135. HexString,
  136. HTML: String;
  137. TextFont: TFont;
  138. begin
  139. HTML := AMessageContent;
  140. TextFont := TFont.Create;
  141. try
  142. StringToFont(FontStr, TextFont);
  143. //设置字体
  144. HexString := IntToHex(TextFont.Color, 6); //获取颜色的16进制格式
  145. HTML := '<DIV style="font-family:' + TextFont.Name;
  146. HTML := HTML + ';color:#' + Copy(HexString,5,2) + Copy(HexString,3,2) + Copy(HexString,1,2); //将BGR颜色转换为RGB颜色
  147. HTML := HTML + ';font-size:' + IntToStr(TextFont.Size) + 'pt';
  148. if fsBold in TextFont.Style then HTML := HTML + ';font-weight:bold';
  149. if fsItalic in TextFont.Style then HTML := HTML + ';font-style:italic';
  150. HTML := HTML + ';text-decoration:';
  151. if fsUnderline in TextFont.Style then HTML := HTML + ' underline ';
  152. if fsStrikeOut in TextFont.Style then HTML := HTML + ' line-through ';
  153. HTML := HTML + '">' + AMessageContent + ' </DIV>';
  154. finally
  155. TextFont.Free;
  156. end;
  157. AMessageContent := HTML;
  158. end;
  159. //------------------------------------------------------------------------------
  160. procedure TMessagesManagerForm.ChangeUIColor(AColor: TColor);
  161. begin
  162. inherited ChangeUIColor(AColor);
  163. pnlClient.Color := FormColor;
  164. btSeeInfo.ChangeUIColor(AColor);
  165. end;
  166. //------------------------------------------------------------------------------
  167. procedure TMessagesManagerForm.btSearchClick(Sender: TObject);
  168. var
  169. Messages: TList;
  170. MessageSearchResult: TMessageSearchResult;
  171. Node: TTreeNode;
  172. RealICQTeam: TRealICQTeam;
  173. RealICQUser: TRealICQUser;
  174. iLoop: Integer;
  175. AMessageStr,
  176. ReceiverName,
  177. ALoginName: String;
  178. begin if Length(Trim(edKeyword.Text)) = 0 then
  179. begin
  180. MessageBox(Handle, '请输入关键字', '提示', MB_ICONINFORMATION);
  181. Exit;
  182. end;
  183. ClearContents;
  184. Messages := nil;
  185. ProcessingForm := TProcessingForm.Create(Self);
  186. ProcessingForm.Show;
  187. Application.ProcessMessages;
  188. Sleep(400);
  189. try
  190. if cbSearchRange.ItemIndex <= 0 then
  191. begin
  192. Messages := MainForm.DBHistory.SearchMessage('-1', '','', True, Trim(edKeyword.Text));
  193. end
  194. else
  195. begin
  196. Node := tvSenders.Items.GetFirstNode;
  197. while Node <> nil do
  198. begin
  199. if Node.Text = cbSearchRange.Items.Strings[cbSearchRange.ItemIndex] then
  200. begin
  201. if Node.StateIndex = UserStateIndex then
  202. begin
  203. try
  204. RealICQUser := Node.Data;
  205. if Assigned(RealICQUser) then
  206. begin
  207. Messages := MainForm.DBHistory.SearchMessage('-1', RealICQUser.LoginName,
  208. MainForm.RealICQClient.LoginName, False, Trim(edKeyword.Text));
  209. Break;
  210. end;
  211. except
  212. end;
  213. end;
  214. if Node.StateIndex = TeamStateIndex then
  215. begin
  216. try
  217. RealICQTeam := Node.Data;
  218. if Assigned(RealICQTeam) then
  219. begin
  220. Messages := MainForm.DBHistory.SearchMessage(RealICQTeam.TeamID, '', '', False, Trim(edKeyword.Text));
  221. Break;
  222. end;
  223. except
  224. end;
  225. end;
  226. end;
  227. Node := Node.GetNext;
  228. end; //while
  229. end;
  230. if Messages = nil then Exit;
  231. tvSenders.Items.Item[tvSenders.Items.Count - 1].Selected := True;
  232. lvContents.Items.BeginUpdate;
  233. try
  234. for iLoop := 0 to Messages.Count - 1 do
  235. begin
  236. MessageSearchResult := Messages[iLoop];
  237. with lvContents.Items.Add do
  238. begin
  239. try
  240. if StrToInt(MessageSearchResult.TeamID) <= 0 then
  241. StateIndex := UserStateIndex
  242. else
  243. StateIndex := TeamStateIndex;
  244. except
  245. StateIndex := TeamStateIndex;
  246. end;
  247. if StateIndex = UserStateIndex then
  248. begin
  249. if (MessageSearchResult.TeamID <= '-2') and (MessageSearchResult.TeamID <> '-5') then
  250. ImageIndex := 8
  251. else
  252. begin
  253. ImageIndex := 1;
  254. end;
  255. end
  256. else
  257. ImageIndex := 5;
  258. RealICQUser:= TUsersService.GetUsersService.GetOrRequestUser(MessageSearchResult.Sender);
  259. ALoginName := RealICQUser.LoginName;
  260. if Pos('-', ALoginName) > 0 then
  261. ALoginName := Copy(ALoginName, Pos('-', ALoginName) + 1, Length(ALoginName));
  262. if (Length(RealICQUser.DisplayName) = 0) then
  263. Caption := ALoginName
  264. else
  265. Caption := RealICQUser.DisplayName + '<' + ALoginName + '>';
  266. if MessageSearchResult.TeamID <= '-2' then
  267. begin
  268. RealICQUser:= TUsersService.GetUsersService.GetOrRequestUser(MessageSearchResult.Receiver);
  269. ALoginName := RealICQUser.LoginName;
  270. if Pos('-', ALoginName) > 0 then ALoginName := Copy(ALoginName, Pos('-', ALoginName) + 1, Length(ALoginName));
  271. if (Length(RealICQUser.DisplayName) = 0) then
  272. ReceiverName := ALoginName
  273. else
  274. ReceiverName := RealICQUser.DisplayName + '<' + ALoginName + '>';
  275. Caption := Caption + ' -> ' + ReceiverName;
  276. end;
  277. SubItems.Add(DateToStr(MessageSearchResult.SendDateTime));
  278. SubItems.Add(TimeToStr(MessageSearchResult.SendDateTime));
  279. AMessageStr := MessageSearchResult.MessageStr;
  280. GetFaces2(AMessageStr, False);
  281. SubItems.Add(AMessageStr);
  282. Data := MessageSearchResult;
  283. end;
  284. end;
  285. finally
  286. lvContents.Items.EndUpdate;
  287. Messages.Free;
  288. end;
  289. finally
  290. pnlPageSet.Visible := False;
  291. ProcessingForm.Free;
  292. end;
  293. end;
  294. //------------------------------------------------------------------------------
  295. //变量S为要判断的字符串,返回true则正确
  296. function TMessagesManagerForm.IsDigit(S:String):Boolean;
  297. var
  298. i,j:integer;
  299. begin
  300. Result:=True;
  301. j :=0 ;
  302. for i :=1 to length(s) do
  303. begin
  304. if not (s[i] in ['0'..'9','.'])then //判断字符串每个字符即s[i],是否为"0"到'9"数字及".'
  305. Result:=False;
  306. if s[i]='.' Then //统计字符串中"."的个数
  307. j:=j+1;
  308. end;
  309. if j > 1 then //字符串中"."的个数大于1
  310. Result:=False;
  311. if (s[1]='.') or (s[length(s)]='.') then //字符串中"."的在最前面和最后面
  312. Result:=False;
  313. //增加, 字符串中"."的位置之前有两个"0"判断
  314. s:=copy(s,1, pos('.', S)-1); //取字符串中"."的位置之前字符
  315. j:=0;
  316. for i:=1 to length(s) do
  317. begin
  318. if s[i]='0' then
  319. j:=j+1;
  320. end;
  321. if j > 1 then //字符串中"."的位置之前有两个"0"
  322. Result:=False;
  323. end;
  324. //------------------------------------------------------------------------------
  325. procedure TMessagesManagerForm.btExportAllMsgClick(Sender: TObject);
  326. var
  327. iLoop, jLoop: Integer;
  328. RootPath, FileName, StrLogin,StrSender, StrReceiver, StrTmp: string;
  329. GroupList, UserList, TmpList: TStringList;
  330. MessageSearchResult: TMessageSearchResult;
  331. Messages: TList;
  332. RealICQUser: TRealICQUser;
  333. RealICQTeam: TRealICQTeam;
  334. begin
  335. RootPath := '';
  336. if SelectDirectory('请设置历史聊天记录文件的导出路径', '', RootPath) then
  337. begin
  338. if RootPath = '' then Exit;
  339. RootPath := RootPath + '\历史记录\';
  340. if not DirectoryExists(RootPath) then CreateDir(RootPath);
  341. ProcessingForm := TProcessingForm.Create(Self);
  342. ProcessingForm.Show;
  343. Application.ProcessMessages;
  344. Sleep(500);
  345. Messages := MainForm.DBHistory.SearchMessage('-1', '','', True, '');
  346. if Messages = nil then Exit;
  347. TmpList := TStringList.Create;
  348. //群组消息
  349. GroupList := TTeamsAdapter.GetTeams();
  350. if GroupList <> nil then
  351. for iLoop := 0 to GroupList.Count - 1 do
  352. begin
  353. RealICQTeam := GroupList.Objects[iLoop] as TRealICQTeam;
  354. if Length(RealICQTeam.TeamCaption) = 0 then
  355. FileName := RootPath + '群组:' + RealICQTeam.TeamID + '.txt'
  356. else
  357. FileName := RootPath + '群组:' + RealICQTeam.TeamCaption + '.txt';
  358. TmpList.Clear;
  359. for jLoop := 0 to Messages.Count - 1 do
  360. begin
  361. MessageSearchResult := Messages[jLoop];
  362. if MessageSearchResult.TeamID = RealICQTeam.TeamID then
  363. begin
  364. RealICQUser := TUsersService.GetUsersService.GetOrRequestUser(MessageSearchResult.Sender);
  365. StrSender := RealICQUser.LoginName;
  366. if Pos('-', StrSender) > 0 then
  367. StrSender := Copy(StrSender, Pos('-', StrSender) + 1, Length(StrSender));
  368. if (Length(RealICQUser.DisplayName) <> 0) then
  369. StrSender := RealICQUser.DisplayName + '(' + StrSender + ')';
  370. StrTmp := DateToStr(MessageSearchResult.SendDateTime) + ' ';
  371. StrTmp := StrTmp + TimeToStr(MessageSearchResult.SendDateTime) + ' ';
  372. StrTmp := StrTmp + StrSender + #13#10;
  373. StrTmp := StrTmp + #13#10 + MessageSearchResult.MessageStr + #13#10;
  374. TmpList.Add(StrTmp);
  375. end;
  376. end;
  377. if TmpList.Count > 0 then TmpList.SaveToFile(FileName);
  378. end;
  379. //手机短信
  380. StrTmp := '';
  381. TmpList.Clear;
  382. FileName := RootPath + '手机短信.txt';
  383. for iLoop := 0 to Messages.Count - 1 do
  384. begin
  385. MessageSearchResult := Messages[iLoop];
  386. if (MessageSearchResult.TeamID = '-2') or (MessageSearchResult.TeamID = '-3') then
  387. begin
  388. if IsDigit(MessageSearchResult.Sender) then
  389. StrSender := MessageSearchResult.Sender
  390. else
  391. begin
  392. RealICQUser := TUsersService.GetUsersService.GetOrRequestUser(MessageSearchResult.Sender);
  393. StrSender := RealICQUser.LoginName;
  394. if Pos('-', StrSender) > 0 then
  395. StrSender := Copy(StrSender, Pos('-', StrSender) + 1, Length(StrSender));
  396. if (Length(RealICQUser.DisplayName) <> 0) then
  397. StrSender := RealICQUser.DisplayName + '(' + StrSender + ')';
  398. end;
  399. if IsDigit(MessageSearchResult.Receiver) then
  400. StrReceiver := MessageSearchResult.Receiver
  401. else
  402. begin
  403. RealICQUser := TUsersService.GetUsersService.GetOrRequestUser(MessageSearchResult.Receiver);
  404. StrReceiver := RealICQUser.LoginName;
  405. if Pos('-', StrReceiver) > 0 then
  406. StrReceiver := Copy(StrReceiver, Pos('-', StrReceiver) + 1, Length(StrReceiver));
  407. if (Length(RealICQUser.DisplayName) <> 0) then
  408. StrReceiver := RealICQUser.DisplayName + '(' + StrReceiver + ')';
  409. end;
  410. StrTmp := StrTmp + DateToStr(MessageSearchResult.SendDateTime) + ' ';
  411. StrTmp := StrTmp + TimeToStr(MessageSearchResult.SendDateTime) + ' ';
  412. StrTmp := StrTmp + StrSender + ' -> ' + StrReceiver + #13#10;
  413. StrTmp := StrTmp + #13#10 + MessageSearchResult.MessageStr + #13#10;
  414. TmpList.Add(StrTmp);
  415. end;
  416. end;
  417. if TmpList.Count > 0 then TmpList.SaveToFile(FileName);
  418. //联系人
  419. UserList := MainForm.DBHistory.GetContactors;
  420. if UserList <> nil then
  421. for iLoop := 0 to UserList.Count - 1 do
  422. begin
  423. StrLogin := UserList[iLoop];
  424. if (AnsiPos('+', StrLogin) <= 0) and (trim(MainForm.RealICQClient.CenterServerID) <> '') then
  425. StrLogin := MainForm.RealICQClient.CenterServerID + '+' + StrLogin;
  426. if AnsiSameText(StrLogin, MainForm.RealICQClient.LoginName) then continue;
  427. RealICQUser:= TUsersService.GetUsersService.GetOrRequestUser(StrLogin);
  428. StrLogin := RealICQUser.LoginName;
  429. if Pos('-', StrLogin) > 0 then
  430. StrLogin := Copy(StrLogin, Pos('-', StrLogin) + 1, Length(StrLogin));
  431. if (Length(RealICQUser.DisplayName) <> 0) then
  432. StrLogin := RealICQUser.DisplayName + '(' + StrLogin + ')';
  433. FileName := RootPath + '联系人:' + StrLogin + '.txt';
  434. TmpList.Clear;
  435. for jLoop := 0 to Messages.Count - 1 do
  436. begin
  437. MessageSearchResult := Messages[jLoop];
  438. if MessageSearchResult.TeamID <> '-1' then continue;
  439. if (MessageSearchResult.Sender = UserList[iLoop]) or (MessageSearchResult.Receiver = UserList[iLoop]) then
  440. begin
  441. if MessageSearchResult.Sender = UserList[iLoop] then
  442. begin
  443. StrSender := StrLogin;
  444. RealICQUser := TUsersService.GetUsersService.GetOrRequestUser(MessageSearchResult.Receiver);
  445. StrReceiver := RealICQUser.LoginName;
  446. if Pos('-', StrReceiver) > 0 then
  447. StrReceiver := Copy(StrReceiver, Pos('-', StrReceiver) + 1, Length(StrReceiver));
  448. if (Length(RealICQUser.DisplayName) <> 0) then
  449. StrReceiver := RealICQUser.DisplayName + '(' + StrReceiver + ')';
  450. end
  451. else
  452. begin
  453. StrReceiver := StrLogin;
  454. RealICQUser := TUsersService.GetUsersService.GetOrRequestUser(MessageSearchResult.Sender);
  455. StrSender := RealICQUser.LoginName;
  456. if Pos('-', StrSender) > 0 then
  457. StrSender := Copy(StrSender, Pos('-', StrSender) + 1, Length(StrSender));
  458. if (Length(RealICQUser.DisplayName) <> 0) then
  459. StrSender := RealICQUser.DisplayName + '(' + StrSender + ')';
  460. end;
  461. StrTmp := DateToStr(MessageSearchResult.SendDateTime) + ' ';
  462. StrTmp := StrTmp + TimeToStr(MessageSearchResult.SendDateTime) + ' ';
  463. StrTmp := StrTmp + StrSender + #13#10;
  464. StrTmp := StrTmp + #13#10 + MessageSearchResult.MessageStr + #13#10;
  465. TmpList.Add(StrTmp);
  466. end;
  467. end;
  468. if TmpList.Count > 0 then TmpList.SaveToFile(FileName);
  469. end;
  470. Messages.Free;
  471. ProcessingForm.Free;
  472. MessageBox(Handle, '所有历史记录导出完成! ', '提示', MB_OK or MB_ICONINFORMATION);
  473. ShellExecute(handle, 'open', PChar('"' + RootPath + '"'), nil, nil, SW_SHOWNORMAL);
  474. end;
  475. end;
  476. //------------------------------------------------------------------------------
  477. procedure TMessagesManagerForm.btSeeInfoClick(Sender: TObject);
  478. var LoginName,Url:String;
  479. begin
  480. Url:=btSeeInfo.Hint;
  481. LoginName := MainForm.RealICQClient.LoginName;
  482. if AnsiPos('-',LoginName)>0 then
  483. begin
  484. LoginName:=Copy(LoginName,AnsiPos('-',LoginName)+1,Length(LoginName)-AnsiPos('-',LoginName));
  485. end;
  486. Url := AnsiReplaceText(Url, '[%LoginName%]',LoginName );
  487. Url := AnsiReplaceText(Url, '[%Password%]', MainForm.RealICQClient.Password);
  488. Url := AnsiReplaceText(Url, '[%MD5_LoginName%]', MD5En(LoginName));
  489. Url := AnsiReplaceText(Url, '[%MD5_Password%]', MD5En(MainForm.RealICQClient.Password));
  490. Url := AnsiReplaceText(Url, '[%BranchID%]', MainForm.RealICQClient.Me.BranchID);
  491. if AnsiSameText(Copy(Url, 1, 5), 'http:') or AnsiSameText(Copy(Url, 1, 6), 'https:') then
  492. begin
  493. ShellExecute(handle, 'open',PChar(MainForm.GetDefaultBrowser), PChar('"' + String(Url) + '"'),'', SW_SHOWNORMAL)
  494. end
  495. else
  496. 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);
  497. end;
  498. //------------------------------------------------------------------------------
  499. procedure TMessagesManagerForm.cbPageSizeChange(Sender: TObject);
  500. begin
  501. if tvSenders.Selected.StateIndex = SystemMessageStateIndex then
  502. LoadSystemMessages
  503. else if tvSenders.Selected.StateIndex = SMSMessageStateIndex then
  504. LoadSMSMessages
  505. else
  506. LoadMessages;
  507. end;
  508. //------------------------------------------------------------------------------
  509. procedure TMessagesManagerForm.ShowUsersMessages(ALoginName: String);
  510. var
  511. Node,
  512. NodeUser,
  513. NodeGroup: TTreeNode;
  514. RealICQUser: TRealICQUser;
  515. ACaption: String;
  516. begin
  517. Node := tvSenders.Items.GetFirstNode;
  518. while Node <> nil do
  519. begin
  520. if AnsiSameStr(ALoginName, '<SMS>') then
  521. begin
  522. if Node.StateIndex = SMSMessageStateIndex then
  523. begin
  524. Node.Selected := True;
  525. Exit;
  526. end;
  527. end
  528. else
  529. begin
  530. if Node.StateIndex = UserStateIndex then
  531. begin
  532. try
  533. RealICQUser := Node.Data;
  534. if Assigned(RealICQUser) then
  535. begin
  536. if RealICQUser.LoginName = ALoginName then
  537. begin
  538. Node.Selected := True;
  539. Exit;
  540. end;
  541. end;
  542. except
  543. end;
  544. end;
  545. end;
  546. Node := Node.GetNext;
  547. end;
  548. RealICQUser:= TUsersService.GetUsersService.GetOrRequestUser(ALoginName);
  549. if RealICQUser = nil then Exit;
  550. ALoginName := RealICQUser.LoginName;
  551. if Pos('-', ALoginName) > 0 then ALoginName := Copy(ALoginName, Pos('-', ALoginName) + 1, Length(ALoginName));
  552. if (Length(RealICQUser.DisplayName) = 0) then
  553. ACaption := ALoginName
  554. else
  555. ACaption := RealICQUser.DisplayName + '<' + ALoginName + '>';
  556. NodeGroup := tvSenders.Items.GetFirstNode.getNextSibling.getNextSibling;
  557. //NodeGroup := tvSenders.Items.GetFirstNode;
  558. NodeUser := tvSenders.Items.AddChild(NodeGroup, ACaption);
  559. NodeUser.Data := RealICQUser;
  560. NodeUser.StateIndex := UserStateIndex;
  561. NodeUser.ImageIndex := 1;
  562. NodeUser.Selected := True;
  563. end;
  564. //------------------------------------------------------------------------------
  565. procedure TMessagesManagerForm.ShowTeamsMessages(ATeamID: String);
  566. var
  567. Node: TTreeNode;
  568. RealICQTeam: TRealICQTeam;
  569. begin
  570. Node := tvSenders.Items.GetFirstNode;
  571. while Node <> nil do
  572. begin
  573. if Node.StateIndex = TeamStateIndex then
  574. begin
  575. try
  576. RealICQTeam := Node.Data;
  577. if Assigned(RealICQTeam) then
  578. begin
  579. if RealICQTeam.TeamID = ATeamID then
  580. begin
  581. Node.Selected := True;
  582. Exit;
  583. end;
  584. end;
  585. except
  586. end;
  587. end;
  588. Node := Node.GetNext;
  589. end;
  590. end;
  591. //------------------------------------------------------------------------------
  592. procedure TMessagesManagerForm.LoadTreeViewItems;
  593. var
  594. iLoop, jLoop, iIndex: Integer;
  595. LoginName, ALoginName, ACaption, GroupName: String;
  596. ATeams, AUsers, GroupMembers, AlreadyAddedUsers, OtherContactors: TStringList;
  597. BranchNodes: TList;
  598. RealICQUser: TRealICQUser;
  599. RealICQTeam: TRealICQTeam;
  600. NodeGroup, NodeUser: TTreeNode;
  601. Branch, TmpBranch: TRealICQBranch;
  602. BranchInfo: TRealICQBranchInfo;
  603. Employee: TRealICQEmployee;
  604. ATreeView: TRealICQContacterTreeView;
  605. procedure AddGroupUsers(AGroupName: String; GroupList: TStringList);
  606. var
  607. kLoop: Integer;
  608. begin
  609. try
  610. NodeGroup := tvSenders.Items.AddChild(nil, AGroupName);
  611. NodeGroup.StateIndex := 0;
  612. NodeGroup.ImageIndex := 4;
  613. if (GroupList = nil) then
  614. Exit;
  615. for kLoop := 0 to GroupList.Count - 1 do
  616. begin
  617. LoginName := GroupList[kLoop];
  618. if AGroupName='其他联系人' then
  619. begin
  620. if (AnsiPos('+',LoginName)<=0) and (trim(MainForm.RealICQClient.CenterServerID)<>'') then
  621. LoginName := MainForm.RealICQClient.CenterServerID + '+' + LoginName;
  622. end;
  623. if AnsiSameText(LoginName, MainForm.RealICQClient.LoginName) then continue;
  624. if AlreadyAddedUsers.IndexOf(LoginName) >= 0 then continue;
  625. //RealICQUser := GroupList.Objects[kLoop] as TRealICQUser;
  626. RealICQUser:= TUsersService.GetUsersService.GetOrRequestUser(LoginName);
  627. ALoginName := RealICQUser.LoginName;
  628. if Pos('-', ALoginName) > 0 then ALoginName := Copy(ALoginName, Pos('-', ALoginName) + 1, Length(ALoginName));
  629. if (Length(RealICQUser.DisplayName) = 0) then
  630. ACaption := ALoginName
  631. else
  632. ACaption := RealICQUser.DisplayName + '<' + ALoginName + '>';
  633. NodeUser := tvSenders.Items.AddChild(NodeGroup, ACaption);
  634. NodeUser.Data := RealICQUser;
  635. NodeUser.StateIndex := UserStateIndex;
  636. NodeUser.ImageIndex := 1;
  637. AlreadyAddedUsers.Add(LoginName);
  638. cbSearchRange.Items.Add(ACaption);
  639. end;
  640. finally
  641. FreeAndNil(GroupList);
  642. end;
  643. end;
  644. begin
  645. AlreadyAddedUsers := TStringList.Create;
  646. tvSenders.Items.Clear;
  647. cbSearchRange.Items.Clear;
  648. cbSearchRange.Items.Add('全部记录');
  649. if MainForm.ShowGroup and (MainForm.RealICQClient.WorkingMode = wmPublic) then
  650. begin
  651. for iLoop := MainForm.Groups.Count - 1 downto 0 do
  652. begin
  653. GroupName := MainForm.Groups[iLoop];
  654. NodeGroup := tvSenders.Items.AddChildFirst(nil, GroupName);
  655. NodeGroup.StateIndex := 0;
  656. NodeGroup.ImageIndex := 4;
  657. GroupMembers := MainForm.Groups.Objects[iLoop] as TStringList;
  658. for jLoop := 0 to GroupMembers.Count - 1 do
  659. begin
  660. LoginName := GroupMembers[jLoop];
  661. RealICQUser:= TUsersService.GetUsersService.GetUser(LoginName);
  662. if RealICQUser <> nil then
  663. begin
  664. ALoginName := RealICQUser.LoginName;
  665. if Pos('-', ALoginName) > 0 then
  666. ALoginName := Copy(ALoginName, Pos('-', ALoginName) + 1, Length(ALoginName));
  667. if (Length(RealICQUser.DisplayName) = 0) then
  668. ACaption := ALoginName
  669. else
  670. ACaption := RealICQUser.DisplayName + '<' + ALoginName + '>';
  671. NodeUser := tvSenders.Items.AddChild(NodeGroup, ACaption);
  672. NodeUser.Data := RealICQUser;
  673. NodeUser.StateIndex := UserStateIndex;
  674. NodeUser.ImageIndex := 1;
  675. AlreadyAddedUsers.Add(LoginName);
  676. cbSearchRange.Items.Add(ACaption);
  677. end;
  678. end;
  679. end;
  680. end;
  681. //if MainForm.RealICQClient.WorkingMode = wmPublic then
  682. //begin
  683. //好友/联系人列表
  684. //GroupName := LVFriends;
  685. //AddGroupUsers(GroupName, MainForm.RealICQClient.Friends);
  686. //NodeGroup.MoveTo(NodeGroup.Parent, naAddChildFirst);
  687. //陌生人列表
  688. //AddGroupUsers(LVStrangers, MainForm.RealICQClient.Strangers);
  689. //黑名单列表
  690. //AddGroupUsers(LVBlacklists, MainForm.RealICQClient.Blacklists);
  691. //end
  692. //else
  693. //begin
  694. try
  695. BranchNodes := TList.Create;
  696. {$region '添加部门'}
  697. for iLoop := 0 to MainForm.RealICQClient.Branchs.Count - 1 do
  698. begin
  699. BranchInfo := MainForm.RealICQClient.Branchs.Objects[iLoop] as TRealICQBranchInfo;
  700. Branch := TRealICQBranch.Create(BranchInfo.BranchName);
  701. Branch.BranchID := BranchInfo.ID;
  702. Branch.ParentID := BranchInfo.ParentID;
  703. Branch.Node := tvSenders.Items.AddChildObject(nil, Branch.BranchName, Branch);
  704. Branch.Node.StateIndex := 0;
  705. Branch.Node.ImageIndex := 4;
  706. for jLoop := 0 to BranchNodes.Count - 1 do
  707. begin
  708. NodeGroup := BranchNodes[jLoop];
  709. TmpBranch := TRealICQBranch(NodeGroup.Data);
  710. if AnsiSameText(Branch.ParentID, TmpBranch.BranchID) then
  711. begin
  712. Branch.Node.MoveTo(TmpBranch.Node, naAddChild);
  713. TmpBranch.Node.Expanded := False;
  714. Break;
  715. end;
  716. end;
  717. BranchNodes.Add(Branch.Node);
  718. end;
  719. for iLoop := 0 to tvSenders.Items.Count - 1 do
  720. begin
  721. Branch := TRealICQBranch(tvSenders.Items.Item[iLoop].Data);
  722. for jLoop := 0 to tvSenders.Items.Count - 1 do {添加至父部门}
  723. begin
  724. if iLoop = jLoop then continue;
  725. TmpBranch := TRealICQBranch(tvSenders.Items.Item[jLoop].Data);
  726. if AnsiSameText(Branch.ParentID, TmpBranch.BranchID) then
  727. begin
  728. if Branch.Node.Parent = TmpBranch.Node then continue;
  729. Branch.Node.MoveTo(TmpBranch.Node, naAddChild);
  730. TmpBranch.Node.Expanded := False;
  731. Break;
  732. end;
  733. end;
  734. end;
  735. {$endregion}
  736. {$region '添加用户'}
  737. AUsers := TUsersService.GetUsersService.GetWorkmatesAndFriends;
  738. for iLoop := AUsers.Count - 1 downto 0 do
  739. begin
  740. RealICQUser := AUsers.Objects[iLoop] as TRealICQUser;
  741. ALoginName := RealICQUser.LoginName;
  742. if Pos('-', ALoginName) > 0 then ALoginName := Copy(ALoginName, Pos('-', ALoginName) + 1, Length(ALoginName));
  743. if (Length(RealICQUser.DisplayName) = 0) then
  744. ACaption := ALoginName
  745. else
  746. ACaption := RealICQUser.DisplayName + '<' + ALoginName + '>';
  747. cbSearchRange.Items.Add(ACaption);
  748. Employee := TRealICQEmployee.Create(RealICQUser.LoginName);
  749. Employee.BranchID := RealICQUser.BranchID;
  750. for jLoop := 0 to BranchNodes.Count - 1 do
  751. begin
  752. NodeGroup := BranchNodes[jLoop];
  753. if NodeGroup.StateIndex <> 0 then continue;
  754. TmpBranch := TRealICQBranch(NodeGroup.Data);
  755. if AnsiSameText(Employee.BranchID, TmpBranch.BranchID) then
  756. begin
  757. Employee.Node := tvSenders.Items.AddChildObjectFirst(TmpBranch.Node, ACaption, Employee);
  758. Employee.Node.StateIndex := UserStateIndex;
  759. Employee.Node.ImageIndex := 1;
  760. Employee.Node.Data:=RealICQUser;
  761. TmpBranch.Node.Expanded := False;
  762. AlreadyAddedUsers.Add(Employee.LoginName);
  763. Break;
  764. end;
  765. end;
  766. end;
  767. {$endregion}
  768. finally
  769. FreeAndNil(BranchNodes);
  770. if AUsers <> nil then
  771. FreeAndNil(AUsers);
  772. end;
  773. //end;
  774. GroupName := LVFriends;
  775. AddGroupUsers(GroupName, TFriendsService.GetService.GetFriends);
  776. NodeGroup.MoveTo(NodeGroup.Parent, naAddChildFirst);
  777. GroupName := '其他联系人';
  778. OtherContactors := MainForm.DBHistory.GetContactors;
  779. AddGroupUsers(GroupName, OtherContactors);
  780. //添加群组列表
  781. NodeGroup := tvSenders.Items.AddChild(nil, LVTeams);
  782. NodeGroup.StateIndex := 0;
  783. NodeGroup.ImageIndex := 4;
  784. ATeams := TTeamsAdapter.GetTeams();
  785. if ATeams <> nil then
  786. for iLoop := 0 to ATeams.Count - 1 do
  787. begin
  788. RealICQTeam := ATeams.Objects[iLoop] as TRealICQTeam;
  789. if Length(RealICQTeam.TeamCaption) = 0 then
  790. ACaption := RealICQTeam.TeamID
  791. else
  792. ACaption := RealICQTeam.TeamCaption + '<群号码:' + RealICQTeam.TeamID + '>';
  793. NodeUser := tvSenders.Items.AddChild(NodeGroup, ACaption);
  794. NodeUser.Data := RealICQTeam;
  795. NodeUser.StateIndex := TeamStateIndex;
  796. NodeUser.ImageIndex := 5;
  797. cbSearchRange.Items.Add(ACaption);
  798. end;
  799. //添加手机短消息结节
  800. NodeGroup := tvSenders.Items.AddChild(nil, '手机短信');
  801. NodeGroup.StateIndex := SMSMessageStateIndex;
  802. NodeGroup.ImageIndex := 8;
  803. //添加系统消息结节
  804. NodeGroup := tvSenders.Items.AddChild(nil, LVSystemMessage);
  805. NodeGroup.StateIndex := SystemMessageStateIndex;
  806. NodeGroup.ImageIndex := 6;
  807. //添加查找结果结节
  808. NodeGroup := tvSenders.Items.AddChild(nil, '查找结果');
  809. NodeGroup.StateIndex := SearchResultStateIndex;
  810. NodeGroup.ImageIndex := 7;
  811. AlreadyAddedUsers.Free;
  812. cbSearchRange.ItemIndex := 0;
  813. end;
  814. //------------------------------------------------------------------------------
  815. procedure TMessagesManagerForm.SpeedButton1Click(Sender: TObject);
  816. var
  817. DBFile: String;
  818. begin
  819. if Length(Trim(MainForm.RealICQClient.DBHistoryFileName)) > 0 then
  820. begin
  821. if MessageBox(Handle, PChar(Format('确定要替换服务器上%s的消息记录吗?', [DateTimeToStr(MainForm.RealICQClient.DBHistoryFileUploadDateTime)])), '提示', MB_OKCANCEL or MB_ICONQUESTION) <> ID_OK then Exit;
  822. end;
  823. DBFile := MainForm.DBHistory.DBFileName;
  824. try
  825. try
  826. MainForm.DBHistory.CloseDBConntion;
  827. FFileTransmitter := TFileTransmitter.Create(MainForm.RealICQClient.TCPClient, tdSender, DBFile, 2, MainForm.RealICQClient.LoginName, 0, 0);
  828. FFileTransmitter.OnTransmitting := FileTransmitterCalculatedSpeed;
  829. FFileTransmitter.OnTransmitOK := FileTransmitterCompleted;
  830. FFileTransmitter.SendFileRequest;
  831. SpeedButton1.Enabled := False;
  832. except
  833. On E: Exception do MessageBox(Handle, PChar('备份消息记录时出错:' + E.Message), '提示', MB_OK);
  834. end;
  835. finally
  836. // MainForm.DBHistory.DBFileName := DBFile;
  837. end;
  838. end;
  839. //------------------------------------------------------------------------------
  840. procedure TMessagesManagerForm.SpeedButton2Click(Sender: TObject);
  841. begin
  842. if Length(Trim(MainForm.RealICQClient.DBHistoryFileName)) = 0 then
  843. begin
  844. MessageBox(Handle, '没有备份记录!', '提示', MB_OK);
  845. Exit;
  846. end;
  847. if MessageBox(Handle, PChar(Format('确定要将 %s 的消息记录恢复至本地吗?', [DateTimeToStr(MainForm.RealICQClient.DBHistoryFileUploadDateTime)])), '提示', MB_OKCANCEL or MB_ICONQUESTION) <> ID_OK then Exit;
  848. FDownFile := TDownFile.Create;
  849. FDownFile.OnComplete := DownFileComplete;
  850. FDownFile.OnProgress := DownFileProgress;
  851. FDBFile := MainForm.DBHistory.DBFileName + '.TEMP';
  852. FDownFile.ThreadDownFile(MainForm.RealICQClient.DBHistoryFileName, FDBFile);
  853. SpeedButton2.Enabled := False;
  854. end;
  855. //------------------------------------------------------------------------------
  856. procedure TMessagesManagerForm.FileTransmitterCalculatedSpeed(Sender: TObject; ATransmittedSize: Int64);
  857. var
  858. Completed: Integer;
  859. begin
  860. Completed := ATransmittedSize*100 div FFileTransmitter.StreamLength;
  861. SpeedButton1.Caption := IntToStr(Completed)+'%';
  862. end;
  863. //------------------------------------------------------------------------------
  864. procedure TMessagesManagerForm.FileTransmitterCompleted(Sender: TObject);
  865. begin
  866. SpeedButton1.Enabled := True;
  867. SpeedButton1.Caption := '备份';
  868. MessageBox(Handle, PChar('消息记录已成功备份至服务器'), '提示', MB_OK or MB_ICONINFORMATION);
  869. MainForm.DBHistory.OpenDBConntion;
  870. end;
  871. //------------------------------------------------------------------------------
  872. procedure TMessagesManagerForm.DownFileProgress(ulProgress, ulProgressMax, ulStatusCode: integer; szStatusText: String);
  873. var
  874. Completed: Integer;
  875. begin
  876. if ulProgressMax = 0 then Exit;
  877. Completed := ulProgress*100 div ulProgressMax;
  878. SpeedButton2.Caption := IntToStr(Completed)+'%';
  879. end;
  880. //------------------------------------------------------------------------------
  881. procedure TMessagesManagerForm.DownFileComplete(Source_file, Dest_file:String; blStatus:boolean; ErrMessage:String);
  882. begin
  883. SpeedButton2.Caption := '恢复';
  884. SpeedButton2.Enabled := True;
  885. if blStatus then
  886. begin
  887. try
  888. ProcessingForm := TProcessingForm.Create(Self);
  889. ProcessingForm.pnlClient.Caption := '正在恢复记录,请稍候...';
  890. ProcessingForm.Show;
  891. Application.ProcessMessages;
  892. Sleep(400);
  893. try
  894. MainForm.DBHistory.RestoreMessageHistory(FDBFile);
  895. finally
  896. ProcessingForm.Free;
  897. end;
  898. MessageBox(Handle, '恢复消息记录成功!', '提示', MB_ICONINFORMATION);
  899. except
  900. MessageBox(Handle, PChar('恢复消息记录失败: ' + ErrMessage), '错误', MB_ICONERROR);
  901. end;
  902. end
  903. else
  904. begin
  905. MessageBox(Handle, PChar('恢复消息记录失败: ' + ErrMessage), '错误', MB_ICONERROR);
  906. end;
  907. btRefresh.Click;
  908. //tvSendersChange(tvSenders, tvSenders.Selected);
  909. end;
  910. //------------------------------------------------------------------------------
  911. procedure TMessagesManagerForm.lvContentsResize(Sender: TObject);
  912. begin
  913. lvContents.Columns.Items[3].Width := lvContents.Width - 308;
  914. end;
  915. //------------------------------------------------------------------------------
  916. procedure TMessagesManagerForm.miDelMessageHistoryClick(Sender: TObject);
  917. var
  918. Node: TTreeNode;
  919. RealICQUser: TRealICQUser;
  920. RealICQTeam: TRealICQTeam;
  921. begin
  922. Node := tvSenders.Selected;
  923. if Node = nil then Exit;
  924. if MessageBox(Handle, '确定要删除这些消息记录吗?', '确认删除', MB_ICONQUESTION or MB_OKCANCEL) <> ID_OK then
  925. begin
  926. Exit;
  927. end;
  928. if Node.StateIndex = UserStateIndex then
  929. begin
  930. RealICQUser := Node.Data;
  931. MainForm.DBHistory.DelMessageByLoginName(RealICQUser.LoginName);
  932. end
  933. else if Node.StateIndex = TeamStateIndex then
  934. begin
  935. RealICQTeam := Node.Data;
  936. MainForm.DBHistory.DelMessageByTeamID(RealICQTeam.TeamID);
  937. end
  938. else if Node.StateIndex = SystemMessageStateIndex then
  939. begin
  940. MainForm.DBHistory.DelAllSystemMessage;
  941. end;
  942. if Node.Parent = tvSenders.Items.GetFirstNode.getNextSibling.getNextSibling then
  943. begin
  944. FreeAndNil(Node);
  945. end;
  946. tvSendersChange(tvSenders, Node);
  947. end;
  948. //------------------------------------------------------------------------------
  949. procedure TMessagesManagerForm.ppListViewPopup(Sender: TObject);
  950. begin
  951. MenuItem1.Enabled := btDel.Enabled;
  952. end;
  953. procedure TMessagesManagerForm.ppTreeNodePopup(Sender: TObject);
  954. begin
  955. miDelMessageHistory.Visible := tvSenders.Selected <> nil;
  956. end;
  957. //------------------------------------------------------------------------------
  958. procedure TMessagesManagerForm.lvContentsChange(Sender: TObject;
  959. Item: TListItem; Change: TItemChange);
  960. var
  961. MessageSearchResult: TMessageSearchResult;
  962. SystemMessageSearchResult: TSystemMessageSearchResult;
  963. AMessageStr,Content: String;
  964. Password,AReceiver:String;
  965. TempMessage:TMessageSearchResult;
  966. hwnd:THandle;
  967. UserName:String;
  968. begin
  969. if lvContents.SelCount > 0 then
  970. begin
  971. if not btDel.Enabled then
  972. begin
  973. btDel.Enabled := True;
  974. end;
  975. end
  976. else
  977. begin
  978. if btDel.Enabled then
  979. begin
  980. btDel.Enabled := False;
  981. end;
  982. end;
  983. if Item = nil then Exit;
  984. AMessageStr := '';
  985. lblDate.Caption := '日期: ' + Item.SubItems[0];
  986. lblTime.Caption := '时间: ' + Item.SubItems[1];
  987. lblSender.Caption := '发信人: ' + Item.Caption;
  988. btSeeInfo.Visible:=False;
  989. ClearHTML(WebBrowser);
  990. if (Item.StateIndex = UserStateIndex) or (Item.StateIndex = TeamStateIndex) or (Item.StateIndex = SMSMessageStateIndex) then
  991. begin
  992. MessageSearchResult := Item.Data;
  993. if MessageSearchResult.IsEncryMessage then
  994. begin
  995. hWnd:=FindWindow(nil,pchar(trim('输入密码')));
  996. if hWnd>0 then Exit;
  997. Password:=(ShowMyInputBox('输入密码','密码','', 50));
  998. if Password<>MainForm.RealICQClient.Password then
  999. begin
  1000. if Password<>'' then
  1001. Dialogs.ShowMessage('密码错误');
  1002. Exit;
  1003. end;
  1004. TempMessage:=MainForm.DBHistory.GetMessageByMessageID(IntToStr(MessageSearchResult.ID));
  1005. if (MainForm.RealICQClient.CenterServerID<>'') and (AnsiPos('+',TempMessage.Sender)<=0) then
  1006. AReceiver:=MainForm.RealICQClient.CenterServerID+'+' + TempMessage.Sender;
  1007. if (not TempMessage.IsRead) and (MainForm.RealICQClient.LoginName<>AReceiver) then //发送已经查看私密消息确认信息给发送者
  1008. begin
  1009. UserName:=MainForm.RealICQClient.Me.DisplayName;
  1010. if Trim(UserName)='' then UserName:=MainForm.RealICQClient.Me.LoginName;
  1011. Content:='LXC01'+#13+#10+'LXUMC'+#13+#10+'0'+ #13+#10+'您于['+DateTimeToStr(TempMessage.SendDateTime)
  1012. +']发送给'+UserName+'的签收消息对方已经阅读!';
  1013. MainForm.RealICQClient.SendCustomMessage(MainForm.RealICQClient.LoginName,AReceiver,Content);
  1014. end;
  1015. end;
  1016. AMessageStr := FilterHTMLCode(MessageSearchResult.MessageStr, MainForm.AllowURL);
  1017. if MessageSearchResult.TeamID <> '-5' then
  1018. GetFaces2(AMessageStr, True);
  1019. AddFontStyle(AMessageStr, MessageSearchResult.Font);
  1020. end;
  1021. if (Item.StateIndex = SystemMessageStateIndex) then
  1022. begin
  1023. SystemMessageSearchResult := Item.Data;
  1024. if SystemMessageSearchResult.MessageType = mtBroadcast then
  1025. AMessageStr := SystemMessageSearchResult.Content
  1026. else
  1027. AMessageStr := SystemMessageSearchResult.Title;
  1028. if trim(SystemMessageSearchResult.Url)<>'' then
  1029. begin
  1030. btSeeInfo.Hint:=SystemMessageSearchResult.Url;
  1031. btSeeInfo.Visible:=True;
  1032. end;
  1033. end;
  1034. InsertHTML(WebBrowser, AMessageStr);
  1035. end;
  1036. procedure TMessagesManagerForm.lvContentsClick(Sender: TObject);
  1037. begin
  1038. if lvContents.Selected<>nil then
  1039. self.lvContentsChange(Sender,lvContents.Selected,ctText);
  1040. end;
  1041. procedure TMessagesManagerForm.lvContentsColumnClick(Sender: TObject;
  1042. Column: TListColumn);
  1043. begin
  1044. //
  1045. end;
  1046. //------------------------------------------------------------------------------
  1047. procedure TMessagesManagerForm.lvContentsDblClick(Sender: TObject);
  1048. var
  1049. Item: TListItem;
  1050. SystemMessageSearchResult: TSystemMessageSearchResult;
  1051. begin
  1052. Item := lvContents.Selected;
  1053. if Item = nil then Exit;
  1054. if (Item.StateIndex = SystemMessageStateIndex) then
  1055. begin
  1056. SystemMessageSearchResult := Item.Data;
  1057. OpenSystemMessageForm(IntToStr(SystemMessageSearchResult.MessageID),
  1058. SystemMessageSearchResult.MessageType,
  1059. SystemMessageSearchResult.PositionType,
  1060. SystemMessageSearchResult.Left,
  1061. SystemMessageSearchResult.Top,
  1062. SystemMessageSearchResult.Width,
  1063. SystemMessageSearchResult.Height,
  1064. SystemMessageSearchResult.Title,
  1065. SystemMessageSearchResult.Content,
  1066. SystemMessageSearchResult.URL,
  1067. SystemMessageSearchResult.AutoCloseTime);
  1068. end;
  1069. end;
  1070. procedure TMessagesManagerForm.lvContentsMouseUp(Sender: TObject;
  1071. Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  1072. begin
  1073. end;
  1074. //------------------------------------------------------------------------------
  1075. procedure TMessagesManagerForm.btDelClick(Sender: TObject);
  1076. var
  1077. iLoop: Integer;
  1078. ListItem: TListItem;
  1079. MessageSearchResult: TMessageSearchResult;
  1080. SystemMessageSearchResult: TSystemMessageSearchResult;
  1081. begin
  1082. {if tvSenders.Focused then
  1083. begin
  1084. miDelMessageHistory.Click;
  1085. Exit;
  1086. end;}
  1087. if MessageBox(Handle, '确定要删除选中的消息记录吗?', '确认删除', MB_ICONQUESTION or MB_OKCANCEL) <> ID_OK then
  1088. begin
  1089. Exit;
  1090. end;
  1091. for iLoop := lvContents.Items.Count - 1 downto 0 do
  1092. begin
  1093. ListItem := lvContents.Items.Item[iLoop];
  1094. if ListItem.Selected then
  1095. begin
  1096. if ListItem.StateIndex = SystemMessageStateIndex then
  1097. begin
  1098. SystemMessageSearchResult := ListItem.Data;
  1099. MainForm.DBHistory.DelSystemMessage(SystemMessageSearchResult.ID);
  1100. FreeAndNil(SystemMessageSearchResult);
  1101. end
  1102. else
  1103. begin
  1104. MessageSearchResult := ListItem.Data;
  1105. MainForm.DBHistory.DelMessage(MessageSearchResult.ID);
  1106. FreeAndNil(MessageSearchResult);
  1107. end;
  1108. lvContents.Items.Delete(iLoop);
  1109. //ClearContents;
  1110. end;
  1111. end;
  1112. end;
  1113. //------------------------------------------------------------------------------
  1114. procedure TMessagesManagerForm.btLastClick(Sender: TObject);
  1115. begin
  1116. FPageIndex := 1000000;
  1117. if tvSenders.Selected.StateIndex = SystemMessageStateIndex then
  1118. LoadSystemMessages
  1119. else if tvSenders.Selected.StateIndex = SMSMessageStateIndex then
  1120. LoadSMSMessages
  1121. else
  1122. LoadMessages;
  1123. end;
  1124. //------------------------------------------------------------------------------
  1125. procedure TMessagesManagerForm.btNextClick(Sender: TObject);
  1126. begin
  1127. Inc(FPageIndex);
  1128. if tvSenders.Selected.StateIndex = SystemMessageStateIndex then
  1129. LoadSystemMessages
  1130. else if tvSenders.Selected.StateIndex = SMSMessageStateIndex then
  1131. LoadSMSMessages
  1132. else
  1133. LoadMessages;
  1134. end;
  1135. //------------------------------------------------------------------------------
  1136. procedure TMessagesManagerForm.btFirstClick(Sender: TObject);
  1137. begin
  1138. FPageIndex := 1;
  1139. if tvSenders.Selected.StateIndex = SystemMessageStateIndex then
  1140. LoadSystemMessages
  1141. else if tvSenders.Selected.StateIndex = SMSMessageStateIndex then
  1142. LoadSMSMessages
  1143. else
  1144. LoadMessages;
  1145. end;
  1146. //------------------------------------------------------------------------------
  1147. procedure TMessagesManagerForm.btPrevClick(Sender: TObject);
  1148. begin
  1149. Dec(FPageIndex);
  1150. if tvSenders.Selected.StateIndex = SystemMessageStateIndex then
  1151. LoadSystemMessages
  1152. else if tvSenders.Selected.StateIndex = SMSMessageStateIndex then
  1153. LoadSMSMessages
  1154. else
  1155. LoadMessages;
  1156. end;
  1157. procedure TMessagesManagerForm.btRefreshClick(Sender: TObject);
  1158. begin
  1159. Self.ClearContents;
  1160. ClearHTML(WebBrowser);
  1161. LoadTreeViewItems;
  1162. end;
  1163. //------------------------------------------------------------------------------
  1164. procedure TMessagesManagerForm.ClearContents;
  1165. var
  1166. iLoop: Integer;
  1167. DataObj: TObject;
  1168. begin
  1169. for iLoop := 0 to lvContents.Items.Count - 1 do
  1170. begin
  1171. DataObj := lvContents.Items.Item[iLoop].Data;
  1172. FreeAndNil(DataObj);
  1173. end;
  1174. lvContents.Items.Clear;
  1175. lblDate.Caption := '日期:';
  1176. lblTime.Caption := '时间:';
  1177. lblSender.Caption := '发信人:';
  1178. ClearHTML(WebBrowser);
  1179. end;
  1180. //------------------------------------------------------------------------------
  1181. procedure TMessagesManagerForm.ShowSystemMessages(Messages: TList);
  1182. var
  1183. iLoop: Integer;
  1184. SystemMessageSearchResult: TSystemMessageSearchResult;
  1185. AMessageStr: String;
  1186. begin
  1187. SetPageSetsState;
  1188. lvContents.Items.BeginUpdate;
  1189. try
  1190. ClearContents;
  1191. for iLoop := 0 to Messages.Count - 1 do
  1192. begin
  1193. SystemMessageSearchResult := Messages[iLoop];
  1194. with lvContents.Items.Add do
  1195. begin
  1196. StateIndex := tvSenders.Selected.StateIndex;
  1197. ImageIndex := 6;
  1198. Caption := '系统管理员';
  1199. SubItems.Add(DateToStr(SystemMessageSearchResult.SendDateTime));
  1200. SubItems.Add(TimeToStr(SystemMessageSearchResult.SendDateTime));
  1201. if SystemMessageSearchResult.MessageType = mtBroadcast then
  1202. AMessageStr := '系统广播:'
  1203. else
  1204. AMessageStr := '系统广告:';
  1205. AMessageStr := AMessageStr + SystemMessageSearchResult.Title;
  1206. SubItems.Add(AMessageStr);
  1207. Data := SystemMessageSearchResult;
  1208. end;
  1209. end;
  1210. finally
  1211. lvContents.Items.EndUpdate;
  1212. SendMessage(lvContents.Handle, WM_VSCROLL, SB_BOTTOM, 0); //发送到底消息
  1213. Messages.Free;
  1214. end;
  1215. end;
  1216. //------------------------------------------------------------------------------
  1217. procedure TMessagesManagerForm.SetPageSetsState;
  1218. begin
  1219. lblPages.Caption := Format('%d 条记录,第 %d 页、共 %d 页', [FRecordCount, FPageIndex, FPageCount]);
  1220. if FPageIndex < FPageCount then
  1221. btNext.Enabled := True
  1222. else
  1223. btNext.Enabled := False;
  1224. if FPageIndex > 1 then
  1225. btPrev.Enabled := True
  1226. else
  1227. btPrev.Enabled := False;
  1228. btFirst.Enabled := btPrev.Enabled;
  1229. btLast.Enabled := btNext.Enabled;
  1230. pnlPageSet.Visible := True;
  1231. end;
  1232. //------------------------------------------------------------------------------
  1233. procedure TMessagesManagerForm.ShowMessages(Messages: TList);
  1234. var
  1235. iLoop: Integer;
  1236. RealICQUser: TRealICQUser;
  1237. MessageSearchResult: TMessageSearchResult;
  1238. AMessageStr,
  1239. ReceiverName: String;
  1240. ALoginName: String;
  1241. begin
  1242. SetPageSetsState;
  1243. lvContents.OnChange := nil;
  1244. lvContents.Items.BeginUpdate;
  1245. try
  1246. ClearContents;
  1247. for iLoop := 0 to Messages.Count - 1 do
  1248. begin
  1249. MessageSearchResult := Messages[iLoop];
  1250. with lvContents.Items.Add do
  1251. begin
  1252. StateIndex := tvSenders.Selected.StateIndex;
  1253. if (StateIndex = UserStateIndex) or (StateIndex = SMSMessageStateIndex) then
  1254. begin
  1255. //Dialogs.ShowMessage(MessageSearchResult.TeamID);
  1256. if ((MessageSearchResult.TeamID = '-2') or (MessageSearchResult.TeamID = '-3')) then
  1257. begin
  1258. ImageIndex := 8;
  1259. end
  1260. else
  1261. begin
  1262. ImageIndex := 1;
  1263. end;
  1264. end
  1265. else
  1266. ImageIndex := 5;
  1267. RealICQUser:= TUsersService.GetUsersService.GetOrRequestUser(MessageSearchResult.Sender);
  1268. ALoginName := RealICQUser.LoginName;
  1269. if Pos('-', ALoginName) > 0 then ALoginName := Copy(ALoginName, Pos('-', ALoginName) + 1, Length(ALoginName));
  1270. if (Length(RealICQUser.DisplayName) = 0) then
  1271. Caption := ALoginName
  1272. else
  1273. Caption := RealICQUser.DisplayName + '<' + ALoginName + '>';
  1274. if MessageSearchResult.TeamID <= '-2' then
  1275. begin
  1276. RealICQUser:= TUsersService.GetUsersService.GetOrRequestUser(MessageSearchResult.Receiver);
  1277. ALoginName := RealICQUser.LoginName;
  1278. if Pos('-', ALoginName) > 0 then
  1279. ALoginName := Copy(ALoginName, Pos('-', ALoginName) + 1, Length(ALoginName));
  1280. if (Length(RealICQUser.DisplayName) = 0) then
  1281. ReceiverName := RealICQUser.LoginName
  1282. else
  1283. ReceiverName := RealICQUser.DisplayName + '<' + RealICQUser.LoginName + '>';
  1284. Caption := Caption + ' -> ' + ReceiverName;
  1285. end;
  1286. SubItems.Add(DateToStr(MessageSearchResult.SendDateTime));
  1287. SubItems.Add(TimeToStr(MessageSearchResult.SendDateTime));
  1288. AMessageStr := MessageSearchResult.MessageStr;
  1289. if MessageSearchResult.IsEncryMessage then
  1290. begin
  1291. if MessageSearchResult.Sender=MainForm.RealICQClient.LoginName then
  1292. AMessageStr:='您发送了一条签收消息'
  1293. else
  1294. AMessageStr:='您收到了一条签收消息';
  1295. end
  1296. else
  1297. AMessageStr := MessageSearchResult.MessageStr;
  1298. GetFaces2(AMessageStr, False);
  1299. SubItems.Add(AMessageStr);
  1300. Data := MessageSearchResult;
  1301. end;
  1302. end;
  1303. finally
  1304. lvContents.Items.EndUpdate;
  1305. // lvContents.OnChange := lvContentsChange;
  1306. SendMessage(lvContents.Handle, WM_VSCROLL, SB_BOTTOM, 0); //发送到底消息
  1307. Messages.Free;
  1308. end;
  1309. end;
  1310. //------------------------------------------------------------------------------
  1311. procedure TMessagesManagerForm.LoadMessages;
  1312. var
  1313. DBHistorySearchResult: TDBHistorySearchResult;
  1314. begin
  1315. try
  1316. DBHistorySearchResult := MainForm.DBHistory.GetMessage(FTeamID, FSender,
  1317. FReceiver, StrToDate('1900-01-01'), 0, FPageIndex, StrToInt(cbPageSize.Text));
  1318. except
  1319. DBHistorySearchResult := MainForm.DBHistory.GetMessage(FTeamID, FSender,
  1320. FReceiver, StrToDate('1900/01/01'), 0, FPageIndex, StrToInt(cbPageSize.Text));
  1321. end;
  1322. try
  1323. FRecordCount := DBHistorySearchResult.RecordCount;
  1324. FPageCount := DBHistorySearchResult.PageCount;
  1325. FPageIndex := DBHistorySearchResult.PageIndex;
  1326. ShowMessages(DBHistorySearchResult.Messages);
  1327. finally
  1328. DBHistorySearchResult.Free;
  1329. end;
  1330. end;
  1331. //------------------------------------------------------------------------------
  1332. procedure TMessagesManagerForm.LoadSystemMessages;
  1333. var
  1334. DBHistorySearchResult: TDBHistorySearchResult;
  1335. begin
  1336. try
  1337. DBHistorySearchResult := MainForm.DBHistory.GetSystemMessage(StrToDate('1900-01-01'), FPageIndex, StrToInt(cbPageSize.Text));
  1338. except
  1339. DBHistorySearchResult := MainForm.DBHistory.GetSystemMessage(StrToDate('1900/01/01'), FPageIndex, StrToInt(cbPageSize.Text));
  1340. end;
  1341. try
  1342. FRecordCount := DBHistorySearchResult.RecordCount;
  1343. FPageCount := DBHistorySearchResult.PageCount;
  1344. FPageIndex := DBHistorySearchResult.PageIndex;
  1345. ShowSystemMessages(DBHistorySearchResult.Messages);
  1346. finally
  1347. DBHistorySearchResult.Free;
  1348. end;
  1349. end;
  1350. //------------------------------------------------------------------------------
  1351. procedure TMessagesManagerForm.LoadSMSMessages;
  1352. var
  1353. DBHistorySearchResult: TDBHistorySearchResult;
  1354. begin
  1355. try
  1356. DBHistorySearchResult := MainForm.DBHistory.GetMessage('-3', '',
  1357. '', StrToDate('1900-01-01'), 0, FPageIndex, StrToInt(cbPageSize.Text));
  1358. except
  1359. DBHistorySearchResult := MainForm.DBHistory.GetMessage('-3', '',
  1360. '', StrToDate('1900/01/01'), 0, FPageIndex, StrToInt(cbPageSize.Text));
  1361. end;
  1362. try
  1363. FRecordCount := DBHistorySearchResult.RecordCount;
  1364. FPageCount := DBHistorySearchResult.PageCount;
  1365. FPageIndex := DBHistorySearchResult.PageIndex;
  1366. ShowMessages(DBHistorySearchResult.Messages);
  1367. finally
  1368. DBHistorySearchResult.Free;
  1369. end;
  1370. end;
  1371. //------------------------------------------------------------------------------
  1372. procedure TMessagesManagerForm.tvSendersChange(Sender: TObject; Node: TTreeNode);
  1373. var
  1374. RealICQUser: TRealICQUser;
  1375. RealICQTeam: TRealICQTeam;
  1376. begin
  1377. btSeeInfo.Visible:=False;
  1378. lvContents.Items.BeginUpdate;
  1379. try
  1380. ClearContents;
  1381. if Node = nil then Exit;
  1382. if Node.StateIndex = UserStateIndex then
  1383. begin
  1384. {$region '选择了某个用户'}
  1385. RealICQUser := Node.Data;
  1386. FTeamID := '-2';
  1387. FSender := RealICQUser.LoginName;
  1388. FReceiver := MainForm.RealICQClient.LoginName;
  1389. FPageCount := 0;
  1390. FPageIndex := 1000000;
  1391. LoadMessages;
  1392. {$endregion}
  1393. cbSearchRange.ItemIndex := cbSearchRange.Items.IndexOf(Node.Text);
  1394. Exit;
  1395. end;
  1396. if Node.StateIndex = TeamStateIndex then
  1397. begin
  1398. {$region '选择了某个群组'}
  1399. RealICQTeam := Node.Data;
  1400. FTeamID := RealICQTeam.TeamID;
  1401. FSender := '';
  1402. FReceiver := '';
  1403. FPageCount := 0;
  1404. FPageIndex := 1000000;
  1405. LoadMessages;
  1406. {$endregion}
  1407. cbSearchRange.ItemIndex := cbSearchRange.Items.IndexOf(Node.Text);
  1408. Exit;
  1409. end;
  1410. if Node.StateIndex = SystemMessageStateIndex then
  1411. begin
  1412. {$region '选择了系统消息节点'}
  1413. FPageCount := 0;
  1414. FPageIndex := 1000000;
  1415. LoadSystemMessages;
  1416. Exit;
  1417. {$endregion}
  1418. end;
  1419. if Node.StateIndex = SMSMessageStateIndex then
  1420. begin
  1421. {$region '选择了手机短消息节点'}
  1422. FPageCount := 0;
  1423. FPageIndex := 1000000;
  1424. LoadSMSMessages;
  1425. Exit;
  1426. {$endregion}
  1427. end;
  1428. cbSearchRange.ItemIndex := 0;
  1429. pnlPageSet.Visible := False;
  1430. finally
  1431. lvContents.Items.EndUpdate;
  1432. end;
  1433. end;
  1434. //------------------------------------------------------------------------------
  1435. procedure TMessagesManagerForm.tvSendersCustomDrawItem(Sender: TCustomTreeView;
  1436. Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
  1437. begin
  1438. DefaultDraw := True;
  1439. if Node.StateIndex = 0 then
  1440. begin
  1441. if Node.Expanded then
  1442. Node.ImageIndex := 3
  1443. else
  1444. Node.ImageIndex := 4;
  1445. end;
  1446. end;
  1447. //------------------------------------------------------------------------------
  1448. procedure TMessagesManagerForm.tvSendersGetSelectedIndex(Sender: TObject; Node: TTreeNode);
  1449. begin
  1450. Node.SelectedIndex := Node.ImageIndex;
  1451. end;
  1452. procedure TMessagesManagerForm.tvSendersMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  1453. var
  1454. Node: TTreeNode;
  1455. P: TPoint;
  1456. begin
  1457. Node := tvSenders.GetNodeAt(X, Y);
  1458. if Node = nil then Exit;
  1459. Node.Selected := True;
  1460. if Button <> mbRight then Exit;
  1461. if (Node.StateIndex = UserStateIndex) or
  1462. (Node.StateIndex = TeamStateIndex) or
  1463. (Node.StateIndex = SystemMessageStateIndex) then
  1464. begin
  1465. P.X := X;
  1466. P.Y := Y;
  1467. P := tvSenders.ClientToScreen(P);
  1468. ppTreeNode.Popup(P.X, P.Y);
  1469. end;
  1470. end;
  1471. {设置WebBrowser的样式}
  1472. //------------------------------------------------------------------------------
  1473. procedure TMessagesManagerForm.SetDOMStyle(Doc:IHTMLDocument2);
  1474. begin
  1475. Doc.body.style.cssText := 'word-break: break-all;';
  1476. Doc.body.style.border := '0px solid';
  1477. Doc.body.style.fontFamily := '宋体';
  1478. Doc.body.style.fontSize := '9pt';
  1479. Doc.body.style.margin := '2pt';
  1480. end;
  1481. //------------------------------------------------------------------------------
  1482. procedure TMessagesManagerForm.WebBrowserBeforeNavigate2(ASender: TObject;
  1483. const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,
  1484. Headers: OleVariant; var Cancel: WordBool);
  1485. const
  1486. BaseURL = 'about:blank';
  1487. BaseURL1 = 'about:';
  1488. var
  1489. NewUrl, BaseID: string;
  1490. function GetBaseIDFromUrl(SrcUrl:String):String;
  1491. begin
  1492. result := Copy(SrcUrl, AnsiPos('_',SrcUrl) + 1, Length(SrcUrl));
  1493. end;
  1494. begin
  1495. if (Pos(FBaseURL, String(URL)) < 1) and (Pos('about:blank', String(URL)) < 1) then
  1496. Exit;
  1497. URL := Trim(AnsiReplaceText(String(URL), FBaseURL, ''));
  1498. if TFileTransmitAdapter.HandleMessage(Self, URL, Cancel) then
  1499. Exit;
  1500. NewUrl := Trim(AnsiReplaceText(String(URL), BaseURL, ''));
  1501. NewUrl := Trim(AnsiReplaceText(String(NewUrl), BaseURL1, ''));
  1502. {$region '打开文件'}
  1503. if AnsiSameText(Copy(NewUrl, 1, 7) , 'File://') then
  1504. begin
  1505. Cancel := True;
  1506. BaseID := AnsiReplaceStr(GetBaseIDFromUrl(NewUrl),'%20',' ');
  1507. if AnsiSameText(ExtractFileExt(BaseID), '.EXE') or
  1508. AnsiSameText(ExtractFileExt(BaseID), '.COM') then
  1509. begin
  1510. if MessageBox(Handle,
  1511. '直接打开可执行文件可能会有感染病毒的风险,确实要打开此文件吗?',
  1512. '警告',
  1513. MB_ICONWARNING or MB_OKCANCEL) <> ID_OK then Exit;
  1514. end;
  1515. if FileExists(BaseID) then
  1516. ShellExecute(handle, 'open', PChar('"' + BaseID + '"'), nil, nil, SW_SHOWNORMAL)
  1517. else
  1518. Dialogs.ShowMessage('本地电脑已经不存在此文件。');
  1519. Exit;
  1520. end;
  1521. {$endregion}
  1522. {$region '打开所在文件夹'}
  1523. if AnsiSameText(Copy(NewUrl, 1, 7) , 'Path://') then
  1524. begin
  1525. Cancel := True;
  1526. BaseID := AnsiReplaceStr(GetBaseIDFromUrl(NewUrl),'%20',' ');
  1527. WinExec(PChar('explorer /select,"' + BaseID + '"'), SW_SHOWNORMAL);
  1528. Exit;
  1529. end;
  1530. {$endregion}
  1531. end;
  1532. procedure TMessagesManagerForm.WebBrowserDocumentComplete(ASender: TObject;
  1533. const pDisp: IDispatch; var URL: OleVariant);
  1534. begin
  1535. try
  1536. SetDomStyle(WebBrowser.Document as IHtmlDocument2);
  1537. except
  1538. end;
  1539. end;
  1540. //------------------------------------------------------------------------------
  1541. procedure TMessagesManagerForm.FormClose(Sender: TObject;
  1542. var Action: TCloseAction);
  1543. begin
  1544. Action := caFree;
  1545. end;
  1546. //------------------------------------------------------------------------------
  1547. procedure TMessagesManagerForm.FormCloseQuery(Sender: TObject;
  1548. var CanClose: Boolean);
  1549. begin
  1550. lvContents.OnChange := nil;
  1551. CanClose := True;
  1552. end;
  1553. //------------------------------------------------------------------------------
  1554. procedure TMessagesManagerForm.FormCreate(Sender: TObject);
  1555. begin
  1556. SkinName := AnsiReplaceText(MainForm.SkinName, 'MainForm', '');
  1557. ChangeUIColor(MainForm.UIMainColor);
  1558. FFileTransmitter := nil;
  1559. lvContents.DoubleBuffered := True;
  1560. WebBrowser.Navigate(ExtractFilePath(paramstr(0)) + 'html\chat.html');
  1561. FBaseURL := ExtractFilePath(paramstr(0)) + 'html\';
  1562. AddUserStatePictureToImageList(ImgLstNodeImage);
  1563. LoadTreeViewItems;
  1564. end;
  1565. //------------------------------------------------------------------------------
  1566. procedure TMessagesManagerForm.FormDestroy(Sender: TObject);
  1567. begin
  1568. MessagesManagerForm := nil;
  1569. end;
  1570. //------------------------------------------------------------------------------
  1571. procedure TMessagesManagerForm.CreateParams(var Params: TCreateParams);
  1572. begin
  1573. inherited;
  1574. with Params do
  1575. begin
  1576. Params.WndParent := 0;
  1577. end;
  1578. end;
  1579. end.