SMSFrm.pas 68 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175
  1. unit SMSFrm;
  2. interface
  3. uses
  4. Windows, Messages, md5,SysUtils, Variants, Classes, Graphics, Controls, Forms,
  5. Dialogs, DSPack, Menus, ExtDlgs, AppEvnts, ActnPopup, ExtCtrls, ImgList, ActiveX,
  6. StdActns, ActnList, XPStyleActnCtrls, ActnMan, ToolWin, ActnCtrls, ActnMenus,
  7. OleCtrls, SHDocVw, StdCtrls, Buttons, RealICQButton, RxRichEd, XMLDoc, XMLIntf, MSHTML,
  8. RealICQRichEdit, RealICQSpeedButton, RealICQSkinFrm, StrUtils, RealICQColors,
  9. RealICQRoundBorderPanel, MyUtils, RealICQClient, UserCardDetailView, AddUserFrm,
  10. MultiSendSMSFrm,SelUserFrm, RealICQContacterListView, TalkingFrm, RealICQUtils, DateUtils, Types,
  11. ComCtrls,ShellAPI, RealICQModel, pngimage;
  12. const
  13. MaxSMSLength: Integer =900;
  14. type
  15. TSMSForm = class(TRealICQSkinForm)
  16. pnlClient: TPanel;
  17. pnlTalkingArea: TPanel;
  18. Splitter1: TSplitter;
  19. pnlInputer: TPanel;
  20. ImgInputerBottomMiddle: TImage;
  21. ImgInputerTopLeft: TImage;
  22. ImgInputerTopRight: TImage;
  23. ImgInputerTopMiddle: TImage;
  24. ShpInputerClient: TShape;
  25. ImgInputerBottomLeft: TImage;
  26. ImgInputerBottomRight: TImage;
  27. lblState: TLabel;
  28. pnlInputeBack: TPanel;
  29. pnlSendButtonBack: TPanel;
  30. btSend: TRealICQButton;
  31. pnlDisplayer: TPanel;
  32. ShpDisplayerTopMiddle: TShape;
  33. ShpDisplayerClient: TShape;
  34. ImgDisplayerTopLeft: TImage;
  35. ImgDisplayerTopRight: TImage;
  36. lblDest: TLabel;
  37. pnlForWebBrowser: TPanel;
  38. WebBrowser: TWebBrowser;
  39. pnlHint: TPanel;
  40. ShpHint: TShape;
  41. Image1: TImage;
  42. LblHint: TLabel;
  43. pnlForHideWebBrowser: TPanel;
  44. pnlToolBar: TPanel;
  45. Shape1: TShape;
  46. pnlForActionToolBar: TPanel;
  47. imgToolbarBack: TImage;
  48. spbMultiSend: TRealICQSpeedButton;
  49. pnlUsers: TPanel;
  50. pnlMenu: TPanel;
  51. shpMenuBottomLine: TShape;
  52. Panel3: TPanel;
  53. pnlForActionMainMenuBar: TPanel;
  54. ActionMainMenuBar: TActionMainMenuBar;
  55. ActionManager1: TActionManager;
  56. actShowHistory: TAction;
  57. actSaveAsHTMLFile: TAction;
  58. actSaveAsTextFile: TAction;
  59. EditCut: TEditCut;
  60. EditCopy: TEditCopy;
  61. EditPaste: TEditPaste;
  62. EditSelectAll: TEditSelectAll;
  63. EditUndo: TEditUndo;
  64. EditDelete: TEditDelete;
  65. actAlwayOnTop: TAction;
  66. actPageSet: TAction;
  67. actPrint: TAction;
  68. actPreview: TAction;
  69. actClose: TAction;
  70. actEnter: TAction;
  71. actCtrlEnter: TAction;
  72. actStopVideo: TAction;
  73. TimerForGetUserInformation: TTimer;
  74. ppForWebBrowser: TPopupActionBar;
  75. miCopyFromIE: TMenuItem;
  76. miSelAllFromIE: TMenuItem;
  77. ppForInputer: TPopupActionBar;
  78. U1: TMenuItem;
  79. N14: TMenuItem;
  80. C1: TMenuItem;
  81. C2: TMenuItem;
  82. P1: TMenuItem;
  83. T1: TMenuItem;
  84. N15: TMenuItem;
  85. A1: TMenuItem;
  86. N16: TMenuItem;
  87. EnterE1: TMenuItem;
  88. CtrlEnterT1: TMenuItem;
  89. ApplicationEvents: TApplicationEvents;
  90. MainMenu1: TMainMenu;
  91. pnlTeamMembers: TPanel;
  92. rndTeamMembers: TRealICQRoundBorderPanel;
  93. lblTeamMemberCount: TLabel;
  94. rndTeamMemberContainer: TRealICQRoundBorderPanel;
  95. pnlTeamMemberContainer: TPanel;
  96. pnlMobile: TPanel;
  97. Label1: TLabel;
  98. edMobiles: TEdit;
  99. spMobileBorder: TShape;
  100. lblSMSState: TLabel;
  101. SaveDialog: TSaveDialog;
  102. ppUserItemRightMenu: TPopupActionBar;
  103. miSendMessage: TMenuItem;
  104. miSeeUserInformation: TMenuItem;
  105. RichEdInputer: TRealICQRichEdit;
  106. cbCustomSendDateTime: TCheckBox;
  107. DatePickerStart: TDateTimePicker;
  108. TimePickerStart: TDateTimePicker;
  109. spbSMSManage: TRealICQSpeedButton;
  110. N1: TMenuItem;
  111. lblSmsLimitInfo: TLabel;
  112. TimerForGetHasSendSmsCount: TTimer;
  113. procedure N1Click(Sender: TObject);
  114. procedure spbSMSManageClick(Sender: TObject);
  115. procedure edMobilesChange(Sender: TObject);
  116. procedure cbCustomSendDateTimeClick(Sender: TObject);
  117. procedure ppForInputerGetControlClass(Sender: TCustomActionBar;
  118. AnItem: TActionClient; var ControlClass: TCustomActionControlClass);
  119. procedure ppForWebBrowserGetControlClass(Sender: TCustomActionBar;
  120. AnItem: TActionClient; var ControlClass: TCustomActionControlClass);
  121. procedure edMobilesKeyPress(Sender: TObject; var Key: Char);
  122. procedure FormCreate(Sender: TObject);
  123. procedure FormClose(Sender: TObject; var Action: TCloseAction);
  124. procedure FormDestroy(Sender: TObject);
  125. procedure pnlDisplayerResize(Sender: TObject);
  126. procedure lblDestClick(Sender: TObject);
  127. procedure lblDestMouseDown(Sender: TObject; Button: TMouseButton;
  128. Shift: TShiftState; X, Y: Integer);
  129. procedure lblDestMouseEnter(Sender: TObject);
  130. procedure lblDestMouseLeave(Sender: TObject);
  131. procedure lblDestMouseUp(Sender: TObject; Button: TMouseButton;
  132. Shift: TShiftState; X, Y: Integer);
  133. procedure TimerForGetUserInformationTimer(Sender: TObject);
  134. procedure WebBrowserDocumentComplete(ASender: TObject;
  135. const pDisp: IDispatch; var URL: OleVariant);
  136. procedure WebBrowserBeforeNavigate2(ASender: TObject;
  137. const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,
  138. Headers: OleVariant; var Cancel: WordBool);
  139. procedure ApplicationEventsMessage(var Msg: tagMSG; var Handled: Boolean);
  140. procedure btSendClick(Sender: TObject);
  141. procedure RichEdInputerChange(Sender: TObject);
  142. procedure RichEdInputerMouseDown(Sender: TObject; Button: TMouseButton;
  143. Shift: TShiftState; X, Y: Integer);
  144. procedure actEnterExecute(Sender: TObject);
  145. procedure actCtrlEnterExecute(Sender: TObject);
  146. procedure actShowHistoryExecute(Sender: TObject);
  147. procedure actSaveAsHTMLFileExecute(Sender: TObject);
  148. procedure actSaveAsTextFileExecute(Sender: TObject);
  149. procedure actPageSetExecute(Sender: TObject);
  150. procedure actPrintExecute(Sender: TObject);
  151. procedure actPreviewExecute(Sender: TObject);
  152. procedure actCloseExecute(Sender: TObject);
  153. procedure spbMultiSendClick(Sender: TObject);
  154. procedure ppUserItemRightMenuGetControlClass(Sender: TCustomActionBar;
  155. AnItem: TActionClient; var ControlClass: TCustomActionControlClass);
  156. procedure ppUserItemRightMenuPopup(Sender: TObject);
  157. procedure miSendMessageClick(Sender: TObject);
  158. procedure miSeeUserInformationClick(Sender: TObject);
  159. procedure FormShow(Sender: TObject);
  160. procedure miCopyFromIEClick(Sender: TObject);
  161. procedure miSelAllFromIEClick(Sender: TObject);
  162. procedure TimerForGetHasSendSmsCountTimer(Sender: TObject);
  163. private
  164. FSMSReveivers: TStringList;
  165. FLastSendMsgTicket: Cardinal;
  166. FLVTeamMembers: TRealICQContacterListView;
  167. FReceiver: String;
  168. FTeamID:String;
  169. FIsMultiSend: Boolean;
  170. procedure CalculateSMSCount;
  171. procedure UpdateListItemSendState(ALoginName: String);
  172. procedure AddLVTeamMembers;
  173. procedure AddUserToListView(RealICQUser: TRealICQUser);
  174. procedure SetReceiver(Value: String);
  175. procedure SetTeamID(Value: String);
  176. procedure SetDOMStyle(Doc:IHTMLDocument2);
  177. procedure UpdateSMSMember(ARealICQUser: TRealICQUser);
  178. function GetWaitSendSMSCount(SMSContent:String;RecevierCount:Integer):Integer;
  179. procedure AddMessageToWebBrowser(SenderID: String;
  180. SenderName, ReceiverName, MessageStr: String;
  181. SendDateTime: TDateTime;
  182. SMSMessageID: Cardinal;
  183. IsReceivedSMS: Boolean = False;
  184. IsHistory: Boolean = False);
  185. function GetCanWriteMessage: Boolean;
  186. procedure InvokeCMD(InvokeIE: Boolean; Value1, Value2: Integer; var vaIn, vaOut: OleVariant);
  187. function CheckCount(ACount: Integer; AContent: string): Boolean;
  188. protected
  189. procedure CreateParams(var Params: TCreateParams); override;
  190. procedure CMWininichange(var Message: TWMWinIniChange); message CM_WININICHANGE;
  191. public
  192. procedure ChangeUIColor(AColor: TColor); override;
  193. procedure ShowSMSMessageResult(AMessageID: Cardinal; AResult: Integer);
  194. procedure LoadNotReadSMSMessages;
  195. property Receiver: String read FReceiver write SetReceiver;
  196. property TeamID:String read FTeamID write SetTeamID;
  197. property CanWriteMessage: Boolean read GetCanWriteMessage;
  198. end;
  199. TSMSMessage = class
  200. private
  201. FSenderID,
  202. FReceiverID,
  203. FSenderName,
  204. FReceiverName,
  205. FMessageStr: String;
  206. FSendDateTime: TDateTime;
  207. FSMSMessageID: Cardinal;
  208. FSMSForm: TSMSForm;
  209. FSended: Boolean;
  210. FMuiltySend: Boolean;
  211. public
  212. constructor Create(ASMSForm: TSMSForm);
  213. property SenderID: String read FSenderID;
  214. property ReceiverID: String read FReceiverID;
  215. property SenderName: String read FSenderName;
  216. property ReceiverName: String read FReceiverName;
  217. property MessageStr: String read FMessageStr;
  218. property SendDateTime: TDateTime read FSendDateTime;
  219. property SMSMessageID: Cardinal read FSMSMessageID;
  220. property SMSForm: TSMSForm read FSMSForm;
  221. property Sended: Boolean read FSended write FSended;
  222. end;
  223. function OpenSMSForm(AReceiver: String; AShowActive: Boolean = True): TSMSForm;
  224. function OpenTeamSMSForm(ATeamID: String): TSMSForm;
  225. function GetSMSForm(AReceiver: String): TSMSForm;
  226. procedure ChangeSMSFormColor(AColor: TColor);
  227. procedure ChangeSMSFormSkin(ASkinName: String);
  228. procedure CloseAllSMSForm;
  229. procedure UpdateSMSForm(ARealICQUser: TRealICQUser);
  230. procedure SetAllSMSFormEnabledState(AEnableValue: Boolean);
  231. procedure UpdateCanSendSMSCount;
  232. var
  233. SMSForms: TList;
  234. SMSMessages: TStringList;
  235. {$I LXTalk.inc}
  236. implementation
  237. uses MainFrm, MessagesManagerFrm, NotReadMessageBoxFrm, TeamsAdapter, UsersService,
  238. ConditionConfig, Math;
  239. {$R *.dfm}
  240. //------------------------------------------------------------------------------
  241. //显示可发短信数量和已经发送的短信数量
  242. //------------------------------------------------------------------------------
  243. procedure UpdateCanSendSMSCount;
  244. var
  245. iLoop: Integer;
  246. HintStr:String;
  247. AForm: TSMSForm;
  248. begin
  249. for iLoop := SMSForms.Count - 1 downto 0 do
  250. begin
  251. AForm := SMSForms[iLoop];
  252. if not AForm.lblSmsLimitInfo.Visible then
  253. AForm.lblSmsLimitInfo.Visible:=True;
  254. if MainForm.RealICQClient.UserPermission.SMSLimitRole=smsBranchRole then
  255. HintStr:='您处于部门模式下,本%s贵部门尚可发送%d条短信,'
  256. +'您个人已发送%d条短信'
  257. else if MainForm.RealICQClient.UserPermission.SMSLimitRole=smsUserRole then
  258. HintStr:='您处于个人模式下,本%s您尚可发送%d条短信,'
  259. +'您个人已发送%d条短信'
  260. else
  261. HintStr:='';
  262. if MainForm.RealICQClient.UserPermission.SMSLimitMode=smsMonthLimit then
  263. AForm.lblSmsLimitInfo.Caption:=Format(HintStr,['月',
  264. MainForm.RealICQClient.UserPermission.CanSendSmsCount,
  265. MainForm.RealICQClient.UserPermission.HasBeenSentSmsCount])
  266. else
  267. AForm.lblSmsLimitInfo.Caption:=Format(HintStr,['日',
  268. MainForm.RealICQClient.UserPermission.CanSendSmsCount,
  269. MainForm.RealICQClient.UserPermission.HasBeenSentSmsCount]);
  270. AForm.TimerForGetHasSendSmsCount.Interval:=AForm.TimerForGetHasSendSmsCount.Interval+1000;
  271. end;
  272. end;
  273. procedure SetAllSMSFormEnabledState(AEnableValue: Boolean);
  274. var
  275. iLoop: Integer;
  276. AForm: TSMSForm;
  277. begin
  278. for iLoop := SMSForms.Count - 1 downto 0 do
  279. begin
  280. AForm := SMSForms[iLoop];
  281. AForm.pnlClient.Enabled := AEnableValue;
  282. PostMessage(AForm.pnlDisplayer.Handle, WM_SIZE, 0, 0);
  283. end;
  284. end;
  285. //------------------------------------------------------------------------------
  286. procedure SetSMSFormPosition(APrevForm, ASMSForm: TSMSForm; AShowActive: Boolean);
  287. begin
  288. if APrevForm <> nil then
  289. begin
  290. ASMSForm.Left := APrevForm.Left + 20;
  291. ASMSForm.Top := APrevForm.Top + 20;
  292. if (ASMSForm.Left + ASMSForm.Width > Screen.WorkAreaWidth) or
  293. (ASMSForm.Top + ASMSForm.Height > Screen.WorkAreaHeight) then
  294. begin
  295. ASMSForm.Left := 0;
  296. ASMSForm.Top := 0;
  297. end;
  298. end
  299. else
  300. begin
  301. //TalkingForm.Left := (Screen.WorkAreaWidth - TalkingForm.Width) div 2;
  302. //TalkingForm.Top := (Screen.WorkAreaHeight - TalkingForm.Height) div 2;
  303. end;
  304. if AShowActive then
  305. ASMSForm.WindowState := wsNormal
  306. else
  307. ASMSForm.WindowState := wsMinimized;
  308. ASMSForm.Show;
  309. if AShowActive then
  310. begin
  311. ShowWindow(ASMSForm.Handle, SW_SHOW);
  312. ForceForeGroundWindow(ASMSForm.Handle);
  313. end;
  314. end;
  315. function OpenSMSFormByWeb(Mobile:String): TSMSForm;
  316. var
  317. // iLoop: Integer;
  318. SMSForm: TSMSForm;
  319. begin
  320. SMSForm := TSMSForm.Create(MainForm);
  321. SMSForm.edMobiles.Text:=Mobile;
  322. SMSForm.Show;
  323. SetSMSFormPosition(nil, SMSForm, True);
  324. Result := SMSForm;
  325. MainForm.HideMainForm;
  326. end;
  327. //------------------------------------------------------------------------------
  328. function OpenTeamSMSForm(ATeamID: String): TSMSForm;
  329. var
  330. iLoop: Integer;
  331. AForm,
  332. SMSForm: TSMSForm;
  333. begin
  334. AForm := nil;
  335. for iLoop := 0 to SMSForms.Count - 1 do
  336. begin
  337. AForm := SMSForms[iLoop];
  338. if AForm.FIsMultiSend then continue;
  339. if AnsiSameText(AForm.TeamID, ATeamID) then
  340. begin
  341. ForceForeGroundWindow(AForm.Handle);
  342. Result := AForm;
  343. Exit;
  344. end;
  345. end;
  346. SMSForm := TSMSForm.Create(MainForm);
  347. SMSForm.TeamID := ATeamID;
  348. SMSForm.Show;
  349. SetSMSFormPosition(AForm, SMSForm,True);
  350. Result := SMSForm;
  351. MainForm.HideMainForm;
  352. end;
  353. //------------------------------------------------------------------------------
  354. function OpenSMSForm(AReceiver: String; AShowActive: Boolean = True): TSMSForm;
  355. var
  356. iLoop: Integer;
  357. AForm,
  358. SMSForm: TSMSForm;
  359. begin
  360. AForm := nil;
  361. for iLoop := 0 to SMSForms.Count - 1 do
  362. begin
  363. AForm := SMSForms[iLoop];
  364. if AForm.FIsMultiSend then continue;
  365. if AnsiSameText(AForm.Receiver, AReceiver) then
  366. begin
  367. if AShowActive then ForceForeGroundWindow(AForm.Handle);
  368. Result := AForm;
  369. Exit;
  370. end;
  371. end;
  372. SMSForm := TSMSForm.Create(MainForm);
  373. SMSForm.Receiver := AReceiver;
  374. SMSForm.Show;
  375. SetSMSFormPosition(AForm, SMSForm, AShowActive);
  376. Result := SMSForm;
  377. MainForm.HideMainForm;
  378. end;
  379. //------------------------------------------------------------------------------
  380. function GetSMSForm(AReceiver: String): TSMSForm;
  381. var
  382. iLoop: Integer;
  383. AForm: TSMSForm;
  384. begin
  385. Result := nil;
  386. for iLoop := 0 to SMSForms.Count - 1 do
  387. begin
  388. AForm := SMSForms[iLoop];
  389. if AForm.FIsMultiSend then continue;
  390. if AnsiSameText(AForm.Receiver, AReceiver) then
  391. begin
  392. Result := AForm;
  393. Exit;
  394. end;
  395. end;
  396. end;
  397. //------------------------------------------------------------------------------
  398. procedure CloseAllSMSForm;
  399. var
  400. AForm: TSMSForm;
  401. begin
  402. while SMSForms.Count > 0 do
  403. begin
  404. AForm := SMSForms[0];
  405. FreeAndNil(AForm);
  406. end;
  407. end;
  408. //------------------------------------------------------------------------------
  409. procedure UpdateSMSForm(ARealICQUser: TRealICQUser);
  410. var
  411. iLoop: Integer;
  412. AForm: TSMSForm;
  413. begin
  414. for iLoop := SMSForms.Count - 1 downto 0 do
  415. begin
  416. AForm := SMSForms[iLoop];
  417. if AForm.FIsMultiSend then
  418. begin
  419. AForm.UpdateSMSMember(ARealICQUser);
  420. end
  421. else if (AForm.FReceiver = ARealICQUser.LoginName) then
  422. begin
  423. AForm.SetReceiver(ARealICQUser.LoginName);
  424. end;
  425. end;
  426. end;
  427. //------------------------------------------------------------------------------
  428. procedure ChangeSMSFormColor(AColor: TColor);
  429. var
  430. iLoop: Integer;
  431. AForm: TSMSForm;
  432. begin
  433. for iLoop := 0 to SMSForms.Count - 1 do
  434. begin
  435. AForm := SMSForms[iLoop];
  436. AForm.ChangeUIColor(AColor);
  437. end;
  438. end;
  439. //------------------------------------------------------------------------------
  440. procedure ChangeSMSFormSkin(ASkinName: String);
  441. var
  442. iLoop: Integer;
  443. AForm: TSMSForm;
  444. OldSkin: String;
  445. begin
  446. ASkinName := AnsiReplaceText(ASkinName, 'MainForm', '');
  447. for iLoop := 0 to SMSForms.Count - 1 do
  448. begin
  449. AForm := SMSForms[iLoop];
  450. OldSkin := AForm.SkinName;
  451. try
  452. AForm.SkinName := ASkinName;
  453. except
  454. AForm.SkinName := OldSkin;
  455. end;
  456. AForm.ChangeUIColor(MainForm.UIMainColor)
  457. end;
  458. end;
  459. //------------------------------------------------------------------------------
  460. constructor TSMSMessage.Create(ASMSForm: TSMSForm);
  461. begin
  462. FSMSForm := ASMSForm;
  463. end;
  464. //------------------------------------------------------------------------------
  465. function TSMSForm.GetCanWriteMessage: Boolean;
  466. begin
  467. Result := not pnlForHideWebBrowser.Visible;
  468. end;
  469. function TSMSForm.GetWaitSendSMSCount(SMSContent: String;
  470. RecevierCount: Integer): Integer;
  471. begin
  472. Result:=Length(SMSContent) div 140;
  473. if (Length(SMSContent) mod 140)<> 0 then
  474. Inc(Result,1);
  475. Result:=Result*RecevierCount;
  476. end;
  477. //------------------------------------------------------------------------------
  478. procedure TSMSForm.CreateParams(var Params: TCreateParams);
  479. begin
  480. inherited;
  481. with Params do
  482. begin
  483. Params.WndParent := 0;
  484. end;
  485. end;
  486. procedure TSMSForm.edMobilesChange(Sender: TObject);
  487. var
  488. SelStart,
  489. iCount,
  490. iLength,
  491. iLoop: Integer;
  492. begin
  493. iCount := 0;
  494. iLength := Length(edMobiles.Text);
  495. if edMobiles.SelStart < iLength then Exit;
  496. for iLoop := iLength - 1 downto 0 do
  497. begin
  498. if edMobiles.Text[iLoop] in ['0'..'9'] then
  499. begin
  500. Inc(iCount);
  501. if iCount = 10 then
  502. begin
  503. SelStart := edMobiles.SelStart;
  504. edMobiles.OnChange := nil;
  505. edMobiles.Text := edMobiles.Text + ',';
  506. edMobiles.OnChange := edMobilesChange;
  507. edMobiles.SelStart := SelStart + 1;
  508. iCount := 0;
  509. Exit;
  510. end;
  511. end
  512. else
  513. begin
  514. iCount := 0;
  515. Exit;
  516. end;
  517. end;
  518. end;
  519. procedure TSMSForm.edMobilesKeyPress(Sender: TObject; var Key: Char);
  520. begin
  521. if not (key in ['0'..'9',',',#8]) then
  522. begin
  523. key:=#0;
  524. Messagebeep(0);
  525. end;
  526. end;
  527. //------------------------------------------------------------------------------
  528. procedure TSMSForm.SetReceiver(Value: String);
  529. var
  530. FRealICQUser: TRealICQUser;
  531. begin
  532. FReceiver := Value;
  533. if Length(Trim(FReceiver)) > 0 then
  534. begin
  535. pnlMobile.Visible := False;
  536. FRealICQUser:= TUsersService.GetUsersService.GetUser(Receiver);
  537. if not Assigned(FRealICQUser) then Exit;
  538. if FRealICQUser.DisplayName = '' then TimerForGetUserInformation.Enabled := True;
  539. end
  540. else
  541. begin
  542. pnlMobile.Visible := True;
  543. lblDest.OnClick := nil;
  544. end;
  545. PostMessage(pnlDisplayer.Handle, WM_SIZE, 0, 0);
  546. PostMessage(Handle, WM_SIZE, 0, 0);
  547. end;
  548. //------------------------------------------------------------------------------
  549. procedure TSMSForm.AddLVTeamMembers;
  550. var ItemIndex:Integer;
  551. begin
  552. {$region '生成显示群发列表的ListView'}
  553. ItemIndex := MainForm.AddContacterListView(pnlTeamMemberContainer, '');
  554. FLVTeamMembers := MainForm.ContacterListViews.Objects[ItemIndex] as TRealICQContacterListView;
  555. MainForm.ContacterListViews.Delete(ItemIndex);
  556. FLVTeamMembers.OnItemOnline := nil;
  557. FLVTeamMembers.OnItemOffline := nil;
  558. FLVTeamMembers.PopupMenu := ppUserItemRightMenu;
  559. FLVTeamMembers.Style := lsSmallHeadImage;
  560. FLVTeamMembers.CaptionStyle := csDisplayName;
  561. FLVTeamMembers.OnItemMouseEnter := nil;
  562. FLVTeamMembers.OnItemMouseLeave := nil;
  563. FLVTeamMembers.OnItemIconButtonClick := nil;
  564. //FLVTeamMembers.OnItemIconButtonDblClick := nil;
  565. FLVTeamMembers.ShowHeadImageButton := False;
  566. FLVTeamMembers.AdjustPosition := False;
  567. FLVTeamMembers.ShowTelButton := False;
  568. FLVTeamMembers.ShowMobileButton := False;
  569. FLVTeamMembers.ShowEmailButton := False;
  570. FLVTeamMembers.ShowCameraButton := False;
  571. FLVTeamMembers.ChangeUIColor(MainForm.UIMainColor);
  572. {$endregion}
  573. end;
  574. //------------------------------------------------------------------------------
  575. procedure TSMSForm.SetTeamID(Value: String);
  576. var
  577. iLoop,ItemIndex: Integer;
  578. ATeam: TRealICQTeam;
  579. MemberList: TStringList;
  580. LoginName:String;
  581. RealICQUser: TRealICQUser;
  582. AListItem: TRealICQContacterListItem;
  583. begin
  584. FTeamID:=Value;
  585. ATeam := TTeamsAdapter.GetTeam(FTeamID);
  586. if ATeam = nil then Exit;
  587. if FLVTeamMembers = nil then AddLVTeamMembers;
  588. pnlUsers.Width := 228;
  589. pnlMobile.Visible := False;
  590. FIsMultiSend := True;
  591. MemberList := SplitString(ATeam.TeamMembers, Chr(10));
  592. try
  593. for iLoop := 0 to MemberList.Count - 1 do
  594. begin
  595. LoginName := MemberList[iLoop];
  596. if Length(Trim(LoginName)) = 0 then continue;
  597. RealICQUser:= TUsersService.GetUsersService.GetOrRequestUser(LoginName);
  598. AddUserToListView(RealICQUser);
  599. end;
  600. lblTeamMemberCount.Caption := Format('接收者(%d/%d)', [FLVTeamMembers.OnlineNumeric, FLVTeamMembers.Items.Count]);
  601. finally
  602. MemberList.Free;
  603. pnlDisplayerResize(pnlDisplayer);
  604. PostMessage(Handle, WM_SIZE, 0, 0);
  605. end;
  606. {FTeamID:=Value;
  607. ItemIndex := MainForm.RealICQClient.Teams.IndexOf(FTeamID);
  608. if ItemIndex<0 then Exit;
  609. ATeam := MainForm.RealICQClient.Teams.Objects[ItemIndex] as TRealICQTeam;
  610. if FLVTeamMembers = nil then AddLVTeamMembers;
  611. pnlUsers.Width := 228;
  612. pnlMobile.Visible := False;
  613. FIsMultiSend := True;
  614. MemberList := SplitString(ATeam.TeamMembers, Chr(10));
  615. try
  616. for iLoop := 0 to MemberList.Count - 1 do
  617. begin
  618. LoginName := MemberList[iLoop];
  619. if Length(Trim(LoginName)) = 0 then continue;
  620. RealICQUser :=MainForm.RealICQClient.GetRealICQUserObject(LoginName);
  621. AddUserToListView(RealICQUser);
  622. end;
  623. lblTeamMemberCount.Caption := Format('接收者(%d/%d)', [FLVTeamMembers.OnlineNumeric, FLVTeamMembers.Items.Count]);
  624. finally
  625. MemberList.Free;
  626. pnlDisplayerResize(pnlDisplayer);
  627. PostMessage(Handle, WM_SIZE, 0, 0);
  628. end; }
  629. end;
  630. procedure TSMSForm.AddUserToListView(RealICQUser: TRealICQUser);
  631. var AListItem: TRealICQContacterListItem;
  632. ItemIndex:Integer;
  633. begin
  634. if not Assigned(RealICQUser) then Exit;
  635. if Length(Trim(RealICQUser.Mobile)) = 0 then Exit;
  636. FSMSReveivers.AddObject(RealICQUser.LoginName, TStringList.Create);
  637. ItemIndex := FLVTeamMembers.Items.IndexOf(RealICQUser.LoginName);
  638. if ItemIndex = -1 then ItemIndex := FLVTeamMembers.Items.Add(RealICQUser.LoginName);
  639. AListItem := FLVTeamMembers.Items.Objects[ItemIndex] as TRealICQContacterListItem;
  640. MainForm.BindUserDataToItem(AListItem, RealICQUser);
  641. end;
  642. procedure TSMSForm.spbMultiSendClick(Sender: TObject);
  643. var
  644. AddUserForm: TMultiSendSMSForm;
  645. iIndex: Integer;
  646. iLoop: Integer;
  647. LoginName: String;
  648. RealICQUser: TRealICQUser;
  649. AddedUsers: TStringList;
  650. SendedSMSMessages: TStringList;
  651. AListItem: TRealICQContacterListItem;
  652. begin
  653. if (not MainForm.RealICQClient.UserPermission.EnableMultiSendSms) then
  654. begin
  655. ShowMessage('您没有群发手机短信的权限!');
  656. Exit;
  657. end;
  658. if FLVTeamMembers = nil then AddLVTeamMembers;
  659. AddUserForm := TMultiSendSMSForm.Create(Self);
  660. //将上次选择发送的对象加入到已选择列表中。
  661. for iLoop := 0 to FLVTeamMembers.Items.Count - 1 do
  662. begin
  663. RealICQUser:=(FLVTeamMembers.Items.Objects[iLoop] as TRealICQContacterListItem).data;
  664. AddUserForm.AddedUsers.AddObject(RealICQUser.Mobile,RealICQUser);
  665. end;
  666. try
  667. if AddUserForm.ShowModal = mrOk then
  668. begin
  669. AddedUsers := AddUserForm.AddedUsers;
  670. try
  671. if AddedUsers.Count = 0 then
  672. begin
  673. pnlUsers.Width := 0;
  674. FIsMultiSend := False;
  675. FReceiver := '';
  676. FLVTeamMembers.Items.Clear;
  677. SetReceiver(FReceiver);
  678. Exit;
  679. end;
  680. pnlUsers.Width := 228;
  681. pnlMobile.Visible := False;
  682. FIsMultiSend := True;
  683. Application.ProcessMessages;
  684. while FSMSReveivers.Count > 0 do
  685. begin
  686. SendedSMSMessages := FSMSReveivers.Objects[0] as TStringList;
  687. FSMSReveivers.Delete(0);
  688. try
  689. FreeAndNil(SendedSMSMessages);
  690. except
  691. end;
  692. end;
  693. FSMSReveivers.Clear;
  694. for iLoop := 0 to AddedUsers.Count - 1 do
  695. begin
  696. AddUserToListView(AddedUsers.Objects[iLoop] as TRealICQUser);
  697. end;
  698. for iLoop := FLVTeamMembers.Items.Count - 1 downto 0 do
  699. begin
  700. AListItem := FLVTeamMembers.Items.Objects[iLoop] as TRealICQContacterListItem;
  701. if AddedUsers.IndexOf(AListItem.Mobile) = -1 then
  702. begin
  703. FLVTeamMembers.Items.Delete(iLoop);
  704. end;
  705. end;
  706. lblTeamMemberCount.Caption := Format('接收者(%d/%d)', [FLVTeamMembers.OnlineNumeric, FLVTeamMembers.Items.Count]);
  707. finally
  708. FreeAndNil(AddedUsers);
  709. end;
  710. end;
  711. finally
  712. pnlDisplayerResize(pnlDisplayer);
  713. PostMessage(Handle, WM_SIZE, 0, 0);
  714. try
  715. FreeAndNil(AddUserForm);
  716. except
  717. end;
  718. end;
  719. end;
  720. //------------------------------------------------------------------------------
  721. procedure TSMSForm.TimerForGetHasSendSmsCountTimer(Sender: TObject);
  722. begin
  723. MainForm.RealICQClient.SendGetCanSendSMSCount;
  724. end;
  725. procedure TSMSForm.TimerForGetUserInformationTimer(Sender: TObject);
  726. var
  727. FRealICQUser: TRealICQUser;
  728. begin
  729. if Length(Trim(Receiver)) = 0 then Exit;
  730. FRealICQUser:= TUsersService.GetUsersService.GetUser(Receiver);
  731. if not Assigned(FRealICQUser) then Exit;
  732. TimerForGetUserInformation.Enabled := False;
  733. if FRealICQUser.DisplayName = '' then
  734. TUsersService.GetUsersService.GetOrRequestUser(FRealICQUser.LoginName, MainForm.RealICQClient);
  735. end;
  736. //------------------------------------------------------------------------------
  737. procedure TSMSForm.WebBrowserBeforeNavigate2(ASender: TObject;
  738. const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,
  739. Headers: OleVariant; var Cancel: WordBool);
  740. const
  741. BaseURL = 'about:blank';
  742. BaseURL1 = 'about:';
  743. var
  744. NewURL: String;
  745. function GetBaseIDFromUrl(SrcUrl:String):String;
  746. begin
  747. result := Copy(SrcUrl, AnsiPos('_',SrcUrl) + 1, Length(SrcUrl));
  748. end;
  749. begin
  750. NewUrl := Trim(AnsiReplaceText(String(URL), BaseURL, ''));
  751. NewUrl := Trim(AnsiReplaceText(String(NewUrl), BaseURL1, ''));
  752. {$region '复制,全选菜单'}
  753. if AnsiSameText(NewUrl , 'PopMenu') then
  754. begin
  755. Cancel := True;
  756. ppForWebBrowser.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y);
  757. Exit;
  758. end;
  759. {$endregion}
  760. Cancel := True;
  761. end;
  762. //------------------------------------------------------------------------------
  763. procedure TSMSForm.WebBrowserDocumentComplete(ASender: TObject;
  764. const pDisp: IDispatch; var URL: OleVariant);
  765. begin
  766. try
  767. WebBrowser.OnDocumentComplete := nil;
  768. try
  769. SetDomStyle(WebBrowser.Document as IHtmlDocument2);
  770. finally
  771. pnlForHideWebBrowser.Visible := False;
  772. end;
  773. except
  774. end;
  775. end;
  776. //------------------------------------------------------------------------------
  777. procedure TSMSForm.SetDOMStyle(Doc:IHTMLDocument2);
  778. var
  779. v: Variant;
  780. CurrentColor,
  781. CssColor: String;
  782. begin
  783. if pnlForHideWebBrowser.Visible then
  784. begin
  785. v := VarArrayCreate([0, 0], varVariant);
  786. v[0] := '<html dir="ltr" lang="zh">'
  787. + '<head>'
  788. + '<META http-equiv="Content-Type" content="text/html; charset=gb2312">'
  789. + '<body link="#0000FF" vlink="#0000FF" alink="#0000FF" hlink="#0000FF" bgcolor="#fdfdfd" oncontextmenu="location.href=''PopMenu'';return false;" >'
  790. + '</body>'
  791. + '</head>';
  792. doc.write(PSafeArray(TVarData(v).VArray));
  793. end;
  794. try
  795. CurrentColor := IntToHex(ConvertColorToColor($00CDCDCD, MainForm.UIMainColor), 6);
  796. CssColor := '#' + Copy(CurrentColor,5,2) + Copy(CurrentColor,3,2) + Copy(CurrentColor,1,2);
  797. except
  798. end;
  799. Doc.body.language := 'gb2312';
  800. Doc.body.style.cssText:='SCROLLBAR-FACE-COLOR:' + CssColor + ';' +
  801. 'SCROLLBAR-HIGHLIGHT-COLOR: ButtonHighLight;' +
  802. 'SCROLLBAR-SHADOW-COLOR: ButtonShadow;' +
  803. 'SCROLLBAR-ARROW-COLOR: #333333;' +
  804. 'SCROLLBAR-3DLIGHT-COLOR:' + CssColor + ';' +
  805. 'SCROLLBAR-TRACK-COLOR:' + CssColor + ';' +
  806. 'SCROLLBAR-DARKSHADOW-COLOR:' + CssColor + ';' +
  807. 'word-break: break-all;' +
  808. 'background-attachment: fixed;' +
  809. 'background-repeat: no-repeat;' +
  810. 'background-position: left top;';
  811. Doc.body.style.overflow:='auto';
  812. Doc.body.style.border:='0px solid';
  813. Doc.body.style.margin:='2px';
  814. Doc.body.style.fontFamily:='宋体';
  815. Doc.body.style.fontSize:='9pt';
  816. end;
  817. //------------------------------------------------------------------------------
  818. procedure TSMSForm.actCloseExecute(Sender: TObject);
  819. begin
  820. Close;
  821. end;
  822. //------------------------------------------------------------------------------
  823. procedure TSMSForm.actCtrlEnterExecute(Sender: TObject);
  824. begin
  825. actCtrlEnter.Checked := True;
  826. MainForm.CtrlEnterSendMessage := True;
  827. end;
  828. //------------------------------------------------------------------------------
  829. procedure TSMSForm.actEnterExecute(Sender: TObject);
  830. begin
  831. actEnter.Checked := True;
  832. MainForm.CtrlEnterSendMessage := False;
  833. end;
  834. //------------------------------------------------------------------------------
  835. procedure TSMSForm.actPageSetExecute(Sender: TObject);
  836. begin
  837. WebBrowser.ExecWB(OLECMDID_PAGESETUP, OLECMDEXECOPT_DODEFAULT, EmptyParam, EmptyParam);
  838. end;
  839. //------------------------------------------------------------------------------
  840. procedure TSMSForm.actPreviewExecute(Sender: TObject);
  841. begin
  842. if WebBrowser.QueryStatusWB(OLECMDID_PRINTPREVIEW) = 3 then
  843. WebBrowser.ExecWB(OLECMDID_PRINTPREVIEW, OLECMDEXECOPT_DODEFAULT, EmptyParam, EmptyParam);
  844. end;
  845. //------------------------------------------------------------------------------
  846. procedure TSMSForm.actPrintExecute(Sender: TObject);
  847. begin
  848. WebBrowser.ExecWB(OLECMDID_PRINT, OLECMDEXECOPT_DODEFAULT, EmptyParam, EmptyParam);
  849. end;
  850. //------------------------------------------------------------------------------
  851. procedure TSMSForm.actSaveAsHTMLFileExecute(Sender: TObject);
  852. var
  853. StringList: TStringList;
  854. begin
  855. SaveDialog.FileName := Caption + '_' + FormatDateTime('yyyy-mm-dd',Now()) + '.Html';
  856. if SaveDialog.Execute then
  857. begin
  858. StringList := TStringList.Create;
  859. try
  860. StringList.Add(IHtmlDocument2(WebBrowser.Document).Body.innerHTML);
  861. StringList.SaveToFile(SaveDialog.FileName);
  862. finally
  863. StringList.Free;
  864. end;
  865. end;
  866. end;
  867. //------------------------------------------------------------------------------
  868. procedure TSMSForm.actSaveAsTextFileExecute(Sender: TObject);
  869. var
  870. StringList: TStringList;
  871. begin
  872. SaveDialog.FileName := Caption + '_' + FormatDateTime('yyyy-mm-dd',Now())+ '.TXT';
  873. if SaveDialog.Execute then
  874. begin
  875. StringList := TStringList.Create;
  876. try
  877. StringList.Add(IHtmlDocument2(WebBrowser.Document).Body.OuterText);
  878. StringList.SaveToFile(SaveDialog.FileName);
  879. finally
  880. StringList.Free;
  881. end;
  882. end;
  883. end;
  884. //------------------------------------------------------------------------------
  885. procedure TSMSForm.actShowHistoryExecute(Sender: TObject);
  886. begin
  887. MainForm.OpenMessagesManagerForm;
  888. Application.ProcessMessages;
  889. if (not pnlMobile.Visible) and (FIsMultiSend = False) then
  890. MessagesManagerForm.ShowUsersMessages(FReceiver)
  891. else
  892. begin
  893. MessagesManagerForm.ShowUsersMessages('<SMS>');
  894. end;
  895. end;
  896. //------------------------------------------------------------------------------
  897. procedure TSMSForm.ApplicationEventsMessage(var Msg: tagMSG;
  898. var Handled: Boolean);
  899. begin
  900. if IsChild(Webbrowser.Handle, Msg.hwnd) then
  901. begin
  902. if (Msg.Message = WM_KEYDOWN) or (Msg.Message = WM_SYSKEYDOWN) then
  903. begin
  904. if msg.wParam = VK_F5 then
  905. begin
  906. Handled := True;
  907. end;
  908. end;
  909. end;
  910. if RichEdInputer.Handle = Msg.hwnd then
  911. begin
  912. if (Msg.Message = WM_KEYDOWN) or (Msg.Message = WM_SYSKEYDOWN) then
  913. begin
  914. if (msg.wParam = 13) then
  915. begin
  916. if (not MainForm.CtrlEnterSendMessage) and (GetKeyState(VK_CONTROL) < 0) then Exit;
  917. if (MainForm.CtrlEnterSendMessage) and (GetKeyState(VK_CONTROL) >= 0) then Exit;
  918. btSendClick(nil);
  919. Handled := True;
  920. end;
  921. end;
  922. end;
  923. end;
  924. //------------------------------------------------------------------------------
  925. procedure TSMSForm.CMWininichange(var Message: TWMWinIniChange);
  926. begin
  927. ChangeUIColor(MainForm.UIMainColor);
  928. DisableAlign;
  929. try
  930. PostMessage(Handle, WM_SIZE, 0, 0);
  931. finally
  932. EnableAlign;
  933. end;
  934. end;
  935. //------------------------------------------------------------------------------
  936. procedure TSMSForm.LoadNotReadSMSMessages;
  937. var
  938. iLoop, iIndex: Integer;
  939. SMSSender,
  940. SenderName,
  941. ReceiverName,
  942. MessageID: String;
  943. NotReadSMSMessage: TNotReadSMSMessage;
  944. FRealICQUser: TRealICQUser;
  945. AMessageType: Integer;
  946. MessageList: TList;
  947. begin
  948. if FIsMultiSend then Exit;
  949. if Length(Trim(MainForm.RealICQClient.Me.DisplayName)) = 0 then
  950. ReceiverName := MainForm.RealICQClient.Me.LoginName
  951. else
  952. ReceiverName := MainForm.RealICQClient.Me.DisplayName;
  953. iIndex := MainForm.NotReadMessages.IndexOf(SMSMessageID + FReceiver);
  954. if iIndex < 0 then Exit;
  955. MessageList := MainForm.NotReadMessages.Objects[iIndex] as TList;
  956. MessageID := MainForm.NotReadMessages.Strings[iIndex];
  957. MainForm.NotReadMessages.Delete(iIndex);
  958. try
  959. NotReadMessageBoxForm.ShowNotReadMessage;
  960. NotReadMessageBoxForm.Height := 0;
  961. NotReadMessageBoxForm.Top := Screen.WorkAreaHeight - NotReadMessageBoxForm.Height;
  962. except
  963. end;
  964. for iLoop := 0 to MessageList.Count - 1 do
  965. begin
  966. SMSSender := Copy(MessageID,
  967. Length(SMSMessageID) + 1,
  968. Length(MessageID) - Length(SMSMessageID));
  969. NotReadSMSMessage := MessageList[iLoop];
  970. AMessageType := -2;
  971. if Length(Trim(SMSSender)) <= 0 then
  972. begin
  973. SMSSender := NotReadSMSMessage.SMSSender;
  974. AMessageType := -3;
  975. end;
  976. FRealICQUser := TUsersService.GetUsersService.GetUser(SMSSender);
  977. MainForm.DBHistory.SetReadFlag('-2',SMSSender);
  978. if Assigned(FRealICQUser) then
  979. begin
  980. if Length(Trim(FRealICQUser.DisplayName)) = 0 then
  981. SenderName := FRealICQUser.LoginName
  982. else
  983. SenderName := FRealICQUser.DisplayName;
  984. end
  985. else
  986. SenderName := SMSSender;
  987. AddMessageToWebBrowser(SMSSender,
  988. SenderName,
  989. ReceiverName,
  990. NotReadSMSMessage.SMSContent,
  991. NotReadSMSMessage.SMSDateTime,
  992. 0,
  993. True);
  994. MainForm.DBHistory.SaveSMSMessage(SMSSender, MainForm.RealICQClient.LoginName,
  995. NotReadSMSMessage.SMSDateTime, NotReadSMSMessage.SMSContent, AMessageType);
  996. FreeAndNil(NotReadSMSMessage);
  997. end;
  998. MessageList.Free;
  999. end;
  1000. //------------------------------------------------------------------------------
  1001. procedure TSMSForm.ShowSMSMessageResult(AMessageID: Cardinal; AResult: Integer);
  1002. var
  1003. E: IHTMLElement;
  1004. iIndex,
  1005. iLoop,
  1006. AMessageType: Integer;
  1007. SMSMessage: TSMSMessage;
  1008. TimeStamp1,
  1009. TimeStamp2: TTimeStamp;
  1010. FStartDateTime: TDateTime;
  1011. ErrorStr: String;
  1012. ARealICQUser: TRealICQUser;
  1013. begin
  1014. TimeStamp1 := DateTimeToTimeStamp(DatePickerStart.Date);
  1015. TimeStamp2 := DateTimeToTimeStamp(TimePickerStart.Time);
  1016. TimeStamp1.Time := TimeStamp2.Time;
  1017. FStartDateTime := TimeStampToDateTime(TimeStamp1);
  1018. iIndex := SMSMessages.IndexOf(IntToStr(AMessageID));
  1019. if iIndex >= 0 then
  1020. begin
  1021. SMSMessage := SMSMessages.Objects[iIndex] as TSMSMessage;
  1022. if Self.pnlMobile.Visible then
  1023. AMessageType := -3
  1024. else
  1025. AMessageType := -2;
  1026. if SMSMessage.FMuiltySend then
  1027. begin
  1028. UpdateListItemSendState(SMSMessage.FReceiverID);
  1029. if AResult <> 0 then
  1030. begin
  1031. if AResult = -9999 then
  1032. ErrorStr := '(' + IntToStr(AResult) + ':号码有误)'
  1033. else if(AResult = -1002) then
  1034. ErrorStr := '(您已经超出今天允许发送的短信条数,请明天再发)'
  1035. else
  1036. ErrorStr := '(' + IntToStr(AResult) + ')';
  1037. ShowMessageInWebBrowser(WebBrowser, '无法将短信发送给:' + SMSMessage.FReceiverName + ErrorStr);
  1038. end;
  1039. Exit;
  1040. end;
  1041. end;
  1042. E := (WebBrowser.Document as IHTMLDocument2).all.item('SMSIMG_' + IntToStr(AMessageID), 0) as IHTMLElement;
  1043. if AResult = 0 then
  1044. begin
  1045. E.setAttribute('src', ExtractFilePath(Application.ExeName) + SMSSendOK, 0);
  1046. E := (WebBrowser.Document as IHTMLDocument2).all.item('SMSState_' + IntToStr(AMessageID), 0) as IHTMLElement;
  1047. //if cbCustomSendDateTime.Checked then
  1048. // E.innerHTML := '(将于 ' + DateTimeToStr(FStartDateTime) + ' 发送)';
  1049. if iIndex >= 0 then
  1050. begin
  1051. ARealICQUser := TUsersService.GetUsersService.GetUser(SMSMessage.FReceiverID);
  1052. if (MainForm.RealICQClient.MoreUsers.IndexOf(SMSMessage.FReceiverID) < 0) then
  1053. begin
  1054. if (ARealICQUser <> nil) and (trim(ARealICQUser.Mobile)<>'') then
  1055. SMSMessage.FReceiverID := ARealICQUser.Mobile;
  1056. AMessageType := -3;
  1057. end
  1058. else
  1059. if ARealICQUser <> nil then
  1060. SMSMessage.FReceiverID := ARealICQUser.LoginName;
  1061. MainForm.DBHistory.SaveSMSMessage(SMSMessage.SenderID, SMSMessage.FReceiverID,
  1062. SMSMessage.FSendDateTime, SMSMessage.FMessageStr, AMessageType);
  1063. MainForm.RealICQClient.SendGetCanSendSMSCount;
  1064. TimerForGetHasSendSmsCount.Interval:=5000;
  1065. end;
  1066. end
  1067. else
  1068. begin
  1069. E.setAttribute('src', ExtractFilePath(Application.ExeName) + SMSSendError, 0);
  1070. E := (WebBrowser.Document as IHTMLDocument2).all.item('SMSState_' + IntToStr(AMessageID), 0) as IHTMLElement;
  1071. if AResult = -9999 then
  1072. E.innerHTML := '(' + IntToStr(AResult) + ':号码有误)'
  1073. else if(AResult = -1002) then
  1074. E.innerHTML := '(您已经超出今天允许发送的短信条数,请明天再发)'
  1075. else
  1076. E.innerHTML := '(' + IntToStr(AResult) + ')';
  1077. end;
  1078. end;
  1079. {将消息内容显示在WebBrowser中}
  1080. //------------------------------------------------------------------------------
  1081. procedure TSMSForm.AddMessageToWebBrowser(SenderID: String;
  1082. SenderName, ReceiverName, MessageStr: String;
  1083. SendDateTime: TDateTime;
  1084. SMSMessageID: Cardinal;
  1085. IsReceivedSMS: Boolean = False;
  1086. IsHistory: Boolean = False);
  1087. var
  1088. MsgContent,
  1089. HTML,
  1090. SenderColor: String;
  1091. TimeStamp1,
  1092. TimeStamp2: TTimeStamp;
  1093. FStartDateTime: TDateTime;
  1094. begin
  1095. TimeStamp1 := DateTimeToTimeStamp(DatePickerStart.Date);
  1096. TimeStamp2 := DateTimeToTimeStamp(TimePickerStart.Time);
  1097. TimeStamp1.Time := TimeStamp2.Time;
  1098. FStartDateTime := TimeStampToDateTime(TimeStamp1);
  1099. MsgContent := '';
  1100. if CompareDate(Now, SendDateTime) = EqualsValue then
  1101. MsgContent := SenderName + ' -> ' + ReceiverName + ' ' + TimeToStr(SendDateTime) + ':'
  1102. else
  1103. MsgContent := SenderName + ' -> ' + ReceiverName + ' ' + DateTimeToStr(SendDateTime) + ':';
  1104. MsgContent := FilterHTMLCode(MsgContent, MainForm.AllowURL); //过滤HTML代码
  1105. if not IsHistory then
  1106. begin
  1107. if AnsiSameText(SenderID, MainForm.RealICQClient.LoginName) then
  1108. SenderColor := '#0000FF'
  1109. else
  1110. SenderColor := '#009900';
  1111. end
  1112. else
  1113. SenderColor := '#686868';
  1114. HTML := '<DIV style="padding-bottom:2px; padding-top:2px; color:' + SenderColor + '">' + MsgContent;
  1115. if AnsiSameText(SenderID, MainForm.RealICQClient.LoginName) and (not IsReceivedSMS) then
  1116. begin
  1117. if (not FIsMultiSend) then
  1118. HTML := HTML + '<IMG ID="SMSIMG_' + IntToStr(SMSMessageID) + '" src="' + ExtractFilePath(Application.ExeName) + SMSSending + '" align="absmiddle">';
  1119. HTML := HTML + '<SPAN ID="SMSState_' + IntToStr(SMSMessageID) + '"></Span>';
  1120. end;
  1121. HTML := HTML + '</DIV>';
  1122. HTML := HTML + '<DIV style="padding-left:9px; padding-bottom:2px;';
  1123. //设置字体
  1124. HTML := HTML + ';font-family:宋体';
  1125. HTML := HTML + ';color:#000000';
  1126. HTML := HTML + ';font-size:9pt';
  1127. MsgContent := FilterHTMLCode(MessageStr, MainForm.AllowURL); //过滤HTML代码
  1128. HTML := HTML + '">' + MsgContent + ' </DIV>';
  1129. if cbCustomSendDateTime.Checked and (not IsHistory) and (not IsReceivedSMS) then
  1130. HTML := HTML + '<DIV style="color:#666666">' + Format('(本条信息将于%s发送)', [FormatDateTime('yyyy年MM月dd日 hh点nn分ss秒',FStartDateTime)]) + ' </DIV>';
  1131. InsertHTML(WebBrowser, HTML);
  1132. end;
  1133. procedure TSMSForm.UpdateListItemSendState(ALoginName: String);
  1134. var
  1135. iIndex,
  1136. iLoop,
  1137. iSended: Integer;
  1138. AListItem: TRealICQContacterListItem;
  1139. SendedSMSMessages: TStringList;
  1140. SMSMessage: TSMSMessage;
  1141. begin
  1142. iIndex := FLVTeamMembers.Items.IndexOf(ALoginName);
  1143. if iIndex < 0 then Exit;
  1144. AListItem := FLVTeamMembers.Items.Objects[iIndex] as TRealICQContacterListItem;
  1145. iIndex := FSMSReveivers.IndexOf(ALoginName);
  1146. if iIndex < 0 then Exit;
  1147. SendedSMSMessages := FSMSReveivers.Objects[iIndex] as TStringList;
  1148. iSended := 0;
  1149. for iLoop := 0 to SendedSMSMessages.Count - 1 do
  1150. begin
  1151. SMSMessage := SendedSMSMessages.Objects[iLoop] as TSMSMessage;
  1152. if SMSMessage.Sended then
  1153. Inc(iSended);
  1154. end;
  1155. //AListItem.Watchword := Format('(%d/%d条)', [iSended, SendedSMSMessages.Count]);
  1156. AListItem.Watchword := Format('(成功:%d/%d条)', [iSended, SendedSMSMessages.Count]);
  1157. //AListItem.Watchword := Format('(×:%d,√:%d)', [SendedSMSMessages.Count - iSended, iSended]);
  1158. AListItem.ReDrawItem;
  1159. MainForm.RealICQClient.SendGetCanSendSMSCount;
  1160. TimerForGetHasSendSmsCount.Interval:=5000;
  1161. end;
  1162. //------------------------------------------------------------------------------
  1163. procedure TSMSForm.btSendClick(Sender: TObject);
  1164. var
  1165. SenderName,
  1166. UnderWrite,
  1167. ReceiverName,
  1168. MessageStr,
  1169. OneMessageStr: String;
  1170. FRealICQUser: TRealICQUser;
  1171. iLoop, jLoop,
  1172. OnSMSLength, iIndex, HZCount,ItemIndex: Integer;
  1173. SMSMessage: TSMSMessage;
  1174. Mobiles: TStringList;
  1175. StartChr: Char;
  1176. TimeStamp1,
  1177. TimeStamp2: TTimeStamp;
  1178. FStartDateTime: TDateTime;
  1179. SendedSMSMessages: TStringList;
  1180. AListItem: TRealICQContacterListItem;
  1181. begin
  1182. TimeStamp1 := DateTimeToTimeStamp(DatePickerStart.Date);
  1183. TimeStamp2 := DateTimeToTimeStamp(TimePickerStart.Time);
  1184. TimeStamp1.Time := TimeStamp2.Time;
  1185. FStartDateTime := TimeStampToDateTime(TimeStamp1);
  1186. if cbCustomSendDateTime.Checked then
  1187. begin
  1188. if FStartDateTime < Now then
  1189. begin
  1190. ShowMessage('定时发送时间不能小于当前时间!');
  1191. Exit;
  1192. end;
  1193. end;
  1194. if not MainForm.RealICQClient.UserPermission.EnableSendSms then
  1195. begin
  1196. ShowMessage('您没有发送手机短信的权限!');
  1197. Exit;
  1198. end;
  1199. if Length(Trim(RichEdInputer.Text)) > MaxSmsLength then
  1200. begin
  1201. MessageBox(Handle, '对不起,您输入消息太长', '提示', MB_ICONINFORMATION);
  1202. RichEdInputer.SetFocus;
  1203. Exit;
  1204. end;
  1205. if (GetTickCount - FLastSendMsgTicket) < 1000 then
  1206. begin
  1207. ShowSendMessageTooQuickly(WebBrowser);
  1208. Exit;
  1209. end;
  1210. if pnlMobile.Visible then //手输号码
  1211. begin
  1212. if Length(Trim(edMobiles.Text)) = 0 then
  1213. begin
  1214. MessageBox(Handle, '请输入手机号码!', '提示', MB_ICONINFORMATION);
  1215. RichEdInputer.SetFocus;
  1216. Exit;
  1217. end;
  1218. edMobiles.Text := Trim(edMobiles.Text);
  1219. end;
  1220. MessageStr := '';
  1221. RichEdInputer.OnChange := nil;
  1222. RichEdInputer.Visible := False;
  1223. try
  1224. MessageStr := Trim(RichEdInputer.Text);
  1225. if Length(MessageStr) = 0 then
  1226. begin
  1227. MessageBox(Handle, '对不起,不能发送空消息', '提示', MB_ICONINFORMATION);
  1228. Exit;
  1229. end;
  1230. finally
  1231. RichEdInputer.MaxLength := MaxSMSLength;
  1232. RichEdInputer.OnChange := RichEdInputerChange;
  1233. RichEdInputer.Lines.Clear;
  1234. RichEdInputerChange(RichEdInputer);
  1235. RichEdInputer.Visible := True;
  1236. RichEdInputer.SetFocus;
  1237. end;
  1238. if Length(Trim(MainForm.RealICQClient.Me.DisplayName)) = 0 then
  1239. SenderName := MainForm.RealICQClient.Me.LoginName
  1240. else
  1241. SenderName := MainForm.RealICQClient.Me.DisplayName;
  1242. //UnderWrite := ' -- ' + SenderName + '(可直接回复)';
  1243. //OnSMSLength := 120 - Length(UnderWrite);
  1244. //iIndex := 1;
  1245. //while iIndex <= Length(MessageStr) do
  1246. //begin
  1247. //OneMessageStr := Copy(MessageStr, iIndex, OnSMSLength);
  1248. //HZCount := 0;
  1249. //for jLoop := 1 to length(OneMessageStr) do
  1250. //begin
  1251. //if WORD(OneMessageStr[jLoop]) > 126 then Inc(HZCount);
  1252. //end;
  1253. //if HZCount mod 2 <> 0 then
  1254. //begin
  1255. //OneMessageStr := Copy(MessageStr, iIndex, OnSMSLength - 1);
  1256. //Inc(iIndex, OnSMSLength - 1);
  1257. //end
  1258. //else
  1259. //begin
  1260. //Inc(iIndex, OnSMSLength);
  1261. //end;
  1262. OneMessageStr := MessageStr + ' -- ' + SenderName + ''; //消息内容(可直接回复)
  1263. if pnlMobile.Visible then //手输号码
  1264. begin
  1265. {$region '手输号码'}
  1266. if Length(Trim(edMobiles.Text)) = 0 then
  1267. begin
  1268. MessageBox(Handle, '请输入手机号码!', '提示', MB_ICONINFORMATION);
  1269. Exit;
  1270. end;
  1271. Mobiles := SplitString(edMobiles.Text, ',');
  1272. if (Mobiles.Count>2) and (not MainForm.RealICQClient.UserPermission.EnableMultiSendSms) then
  1273. begin
  1274. ShowMessage('您没有群发手机短信的权限!');
  1275. Exit;
  1276. end;
  1277. if not CheckCount(Mobiles.Count - 1, OneMessageStr) then
  1278. begin
  1279. Exit;
  1280. end;
  1281. try
  1282. for jLoop := 0 to Mobiles.Count - 1 do
  1283. begin
  1284. ReceiverName := Mobiles.Strings[jLoop];
  1285. if Length(Trim(ReceiverName)) = 0 then continue;
  1286. //验证手机号码
  1287. if not CheckMobile(trim(ReceiverName)) then
  1288. begin
  1289. MessageBox(Handle, '手机号码不正确!', '提示', MB_ICONINFORMATION);
  1290. edMobiles.SetFocus;
  1291. Exit;
  1292. end;
  1293. SMSMessage := TSMSMessage.Create(Self);
  1294. SMSMessage.FSenderID := MainForm.RealICQClient.LoginName;
  1295. SMSMessage.FReceiverID := ReceiverName;
  1296. SMSMessage.FSenderName := SenderName;
  1297. SMSMessage.FReceiverName := ReceiverName;
  1298. SMSMessage.FMessageStr := OneMessageStr;
  1299. SMSMessage.FSendDateTime := Now;
  1300. SMSMessage.FSended := False;
  1301. SMSMessage.FMuiltySend := False;
  1302. SMSMessage.FSMSMessageID := GetTickCount + SMSMessages.Count;
  1303. SMSMessages.AddObject(IntToStr(SMSMessage.FSMSMessageID), SMSMessage);
  1304. MainForm.RealICQClient.SendSMSMessage(SMSMessage.ReceiverName,
  1305. SMSMessage.MessageStr,
  1306. SMSMessage.SMSMessageID,
  1307. cbCustomSendDateTime.Checked,
  1308. FStartDateTime);
  1309. AddMessageToWebBrowser(SMSMessage.SenderID,
  1310. SMSMessage.SenderName,
  1311. SMSMessage.ReceiverName,
  1312. SMSMessage.MessageStr,
  1313. SMSMessage.SendDateTime,
  1314. SMSMessage.SMSMessageID);
  1315. Sleep(200);
  1316. Application.ProcessMessages;
  1317. end;
  1318. finally
  1319. FreeAndNil(Mobiles);
  1320. end;
  1321. {$endregion}
  1322. end
  1323. else if FIsMultiSend then //群发
  1324. begin
  1325. {$region '群发'}
  1326. if FLVTeamMembers.Items.Count < 1 then
  1327. begin
  1328. MessageBox(Handle, '请选择用户!', '提示', MB_ICONINFORMATION);
  1329. Exit;
  1330. end;
  1331. if not CheckCount(FLVTeamMembers.Items.Count, OneMessageStr) then
  1332. begin
  1333. Exit;
  1334. end;
  1335. AddMessageToWebBrowser(MainForm.RealICQClient.LoginName,
  1336. SenderName,
  1337. '群发',
  1338. OneMessageStr,
  1339. Now,
  1340. 10000);
  1341. for jLoop := 0 to FLVTeamMembers.Items.Count - 1 do
  1342. begin
  1343. ReceiverName := FLVTeamMembers.Items[jLoop];
  1344. AListItem := FLVTeamMembers.Items.Objects[jLoop] as TRealICQContacterListItem;
  1345. {ItemIndex:=MainForm.RealICQClient.AddrBookUsers.IndexOf(ReceiverName);
  1346. if ItemIndex>=0 then
  1347. begin
  1348. FRealICQUser := MainForm.RealICQClient.AddrBookUsers.Objects[ItemIndex] as TRealICQUser;
  1349. end
  1350. else
  1351. begin
  1352. ItemIndex:=MainForm.RealICQClient.Friends.IndexOf(ReceiverName);
  1353. if ItemIndex<0 then continue;
  1354. FRealICQUser := MainForm.RealICQClient.Friends.Objects[ItemIndex] as TRealICQUser;
  1355. end;}
  1356. ItemIndex:=MainForm.RealICQClient.AddrBookUsers.IndexOf(ReceiverName);
  1357. if ItemIndex>=0 then
  1358. begin
  1359. FRealICQUser := MainForm.RealICQClient.AddrBookUsers.Objects[ItemIndex] as TRealICQUser;
  1360. end
  1361. else if(ItemIndex<0) then
  1362. begin
  1363. FRealICQUser:= TUsersService.GetUsersService.GetUser(ReceiverName);
  1364. if FRealICQUser = nil then
  1365. begin
  1366. ItemIndex:=MainForm.RealICQClient.MoreUsers.IndexOf(ReceiverName);
  1367. if ItemIndex<0 then continue;
  1368. FRealICQUser := MainForm.RealICQClient.MoreUsers.Objects[ItemIndex] as TRealICQUser ;
  1369. end;
  1370. end;
  1371. if not Assigned(FRealICQUser) then Exit;
  1372. if Length(Trim(FRealICQUser.Mobile)) = 0 then continue;
  1373. if Length(Trim(FRealICQUser.DisplayName)) = 0 then
  1374. ReceiverName := FRealICQUser.LoginName
  1375. else
  1376. ReceiverName := FRealICQUser.DisplayName;
  1377. SMSMessage := TSMSMessage.Create(Self);
  1378. SMSMessage.FSenderID := MainForm.RealICQClient.LoginName;
  1379. SMSMessage.FReceiverID := FRealICQUser.LoginName;
  1380. SMSMessage.FSenderName := SenderName;
  1381. SMSMessage.FReceiverName := ReceiverName;
  1382. SMSMessage.FMessageStr := OneMessageStr;
  1383. SMSMessage.FSendDateTime := Now;
  1384. SMSMessage.FSended := False;
  1385. SMSMessage.FMuiltySend := True;
  1386. SMSMessage.FSMSMessageID := GetTickCount + SMSMessages.Count;
  1387. SMSMessages.AddObject(IntToStr(SMSMessage.FSMSMessageID), SMSMessage);
  1388. iIndex := FSMSReveivers.IndexOf(FRealICQUser.LoginName);
  1389. if iIndex < 0 then Continue;
  1390. SendedSMSMessages := FSMSReveivers.Objects[iIndex] as TStringList;
  1391. SendedSMSMessages.AddObject(IntToStr(SMSMessage.FSMSMessageID), SMSMessage);
  1392. //UpdateListItemSendState(FRealICQUser.LoginName);
  1393. MainForm.RealICQClient.SendSMSMessage(FRealICQUser.Mobile,
  1394. SMSMessage.MessageStr,
  1395. SMSMessage.SMSMessageID,
  1396. cbCustomSendDateTime.Checked,
  1397. FStartDateTime);
  1398. Application.ProcessMessages;
  1399. end;
  1400. {$endregion}
  1401. end
  1402. else
  1403. begin
  1404. {$region '单发'}
  1405. FRealICQUser := TUsersService.GetUsersService.GetUser(Receiver);
  1406. if not Assigned(FRealICQUser) then Exit;
  1407. if Length(Trim(FRealICQUser.DisplayName)) = 0 then
  1408. ReceiverName := FRealICQUser.LoginName
  1409. else
  1410. ReceiverName := FRealICQUser.DisplayName;
  1411. SMSMessage := TSMSMessage.Create(Self);
  1412. SMSMessage.FSenderID := MainForm.RealICQClient.LoginName;
  1413. SMSMessage.FReceiverID := FRealICQUser.LoginName;
  1414. SMSMessage.FSenderName := SenderName;
  1415. SMSMessage.FReceiverName := ReceiverName;
  1416. SMSMessage.FMessageStr := OneMessageStr;
  1417. SMSMessage.FSendDateTime := Now;
  1418. SMSMessage.FSended := False;
  1419. SMSMessage.FMuiltySend := False;
  1420. SMSMessage.FSMSMessageID := GetTickCount + SMSMessages.Count;
  1421. SMSMessages.AddObject(IntToStr(SMSMessage.FSMSMessageID), SMSMessage);
  1422. MainForm.RealICQClient.SendSMSMessage(FRealICQUser.Mobile,
  1423. SMSMessage.MessageStr,
  1424. SMSMessage.SMSMessageID,
  1425. cbCustomSendDateTime.Checked,
  1426. FStartDateTime);
  1427. AddMessageToWebBrowser(SMSMessage.SenderID,
  1428. SMSMessage.SenderName,
  1429. SMSMessage.ReceiverName,
  1430. SMSMessage.MessageStr,
  1431. SMSMessage.SendDateTime,
  1432. SMSMessage.SMSMessageID);
  1433. {$endregion}
  1434. end;
  1435. //end;
  1436. FLastSendMsgTicket := GetTickCount;
  1437. end;
  1438. function TSMSForm.CheckCount(ACount: Integer; AContent: string): Boolean;
  1439. var
  1440. ALen: Integer;
  1441. begin
  1442. ALen := Length(AContent) + Length(TConditionConfig.GetConfig.SMSName);
  1443. Result := MainForm.RealICQClient.UserPermission.CanSendSmsCount > Ceil(ALen / 70) * ACount;
  1444. if not Result then
  1445. ShowMessage(Format('您这次要发送%d条,已超出可发送条数。',[Ceil(ALen / 70) * ACount]));
  1446. end;
  1447. procedure TSMSForm.CalculateSMSCount;
  1448. begin
  1449. lblSMSState.Caption := '已输入 ' + IntToStr(Length(RichEdInputer.Text)) + ' 个字符;'
  1450. +'每条短信上限140个字符(70个汉字);本次产生'+IntToStr(GetWaitSendSMSCount(RichEdInputer.Text,1));
  1451. if self.FIsMultiSend then
  1452. lblSMSState.Caption :=lblSMSState.Caption+'×('+IntToStr(FLVTeamMembers.Items.Count)+')'
  1453. else if (pnlMobile.Visible) and (Trim(edMobiles.Text)<>'') then
  1454. begin
  1455. lblSMSState.Caption :=lblSMSState.Caption+'×('+IntToStr(SplitString(edMobiles.Text, ',').Count-1)+')';
  1456. end;
  1457. lblSMSState.Caption :=lblSMSState.Caption+'条短信';
  1458. end;
  1459. procedure TSMSForm.cbCustomSendDateTimeClick(Sender: TObject);
  1460. begin
  1461. DatePickerStart.Enabled := cbCustomSendDateTime.Checked;
  1462. TimePickerStart.Enabled := cbCustomSendDateTime.Checked;
  1463. end;
  1464. //------------------------------------------------------------------------------
  1465. procedure TSMSForm.ChangeUIColor(AColor: TColor);
  1466. begin
  1467. inherited ChangeUIColor(AColor);
  1468. pnlClient.Color := FormColor;
  1469. pnlMenu.Color := FormColor;
  1470. pnlUsers.Color := FormColor;
  1471. pnlTalkingArea.Color := FormColor;
  1472. pnlForActionMainMenuBar.Color := FormColor;
  1473. pnlForActionToolBar.Color := FormColor;
  1474. ActionMainMenuBar.ColorMap.Color := FormColor;
  1475. ActionMainMenuBar.ColorMap.SelectedColor := ConvertColorToColor(ActionMainMenuBar.ColorMap.SelectedColor, AColor);
  1476. ActionMainMenuBar.ColorMap.BtnFrameColor := ConvertColorToColor(ActionMainMenuBar.ColorMap.BtnFrameColor, AColor);
  1477. ActionMainMenuBar.Font.Name := '宋体';
  1478. ActionMainMenuBar.Font.Size := 9;
  1479. rndTeamMembers.ChangeUIColor(AColor);
  1480. rndTeamMemberContainer.ChangeUIColor(AColor);
  1481. spbSMSManage.ChangeUIColor(AColor);
  1482. spbMultiSend.ChangeUIColor(AColor);
  1483. spMobileBorder.Pen.Color := ConvertColorToColor(spMobileBorder.Pen.Color, AColor);
  1484. ConvertBitmapToColor(imgToolbarBack.Picture.Bitmap, AColor);
  1485. imgToolbarBack.Invalidate;
  1486. ConvertBitmapToColor(ImgDisplayerTopLeft.Picture.Bitmap, AColor);
  1487. ImgDisplayerTopLeft.Invalidate;
  1488. ConvertBitmapToColor(ImgDisplayerTopRight.Picture.Bitmap, AColor);
  1489. ImgDisplayerTopRight.Invalidate;
  1490. ShpDisplayerTopMiddle.Pen.Color := ConvertColorToColor(ShpDisplayerTopMiddle.Pen.Color, AColor);
  1491. ShpDisplayerTopMiddle.Brush.Color := ConvertColorToColor(ShpDisplayerTopMiddle.Brush.Color, AColor);
  1492. ShpDisplayerClient.Pen.Color := ConvertColorToColor(ShpDisplayerClient.Pen.Color, AColor);
  1493. ConvertBitmapToColor(ImgInputerTopLeft.Picture.Bitmap, AColor);
  1494. ImgInputerTopLeft.Invalidate;
  1495. ConvertBitmapToColor(ImgInputerTopMiddle.Picture.Bitmap, AColor);
  1496. ImgInputerTopMiddle.Invalidate;
  1497. ConvertBitmapToColor(ImgInputerTopRight.Picture.Bitmap, AColor);
  1498. ImgInputerTopRight.Invalidate;
  1499. ConvertBitmapToColor(ImgInputerBottomLeft.Picture.Bitmap, AColor);
  1500. ImgInputerBottomLeft.Invalidate;
  1501. ConvertBitmapToColor(ImgInputerBottomMiddle.Picture.Bitmap, AColor);
  1502. ImgInputerBottomMiddle.Invalidate;
  1503. ConvertBitmapToColor(ImgInputerBottomRight.Picture.Bitmap, AColor);
  1504. ImgInputerBottomRight.Invalidate;
  1505. ShpInputerClient.Pen.Color := ConvertColorToColor(ShpInputerClient.Pen.Color, AColor);
  1506. if FLVTeamMembers <> nil then FLVTeamMembers.ChangeUIColor(AColor);
  1507. ShpHint.Pen.Color := ConvertColorToColor(ShpHint.Pen.Color, AColor);
  1508. btSend.ChangeUIColor(AColor);
  1509. try
  1510. if (not WebBrowser.Busy) and (WebBrowser.Document <> nil) then SetDomStyle(WebBrowser.Document as IHtmlDocument2);
  1511. except
  1512. end;
  1513. end;
  1514. //------------------------------------------------------------------------------
  1515. procedure TSMSForm.UpdateSMSMember(ARealICQUser: TRealICQUser);
  1516. var
  1517. ItemIndex: Integer;
  1518. AListItem: TRealICQContacterListItem;
  1519. begin
  1520. if FLVTeamMembers <> nil then
  1521. begin
  1522. ItemIndex := FLVTeamMembers.Items.IndexOf(ARealICQUser.LoginName);
  1523. if ItemIndex = -1 then Exit;
  1524. AListItem := FLVTeamMembers.Items.Objects[ItemIndex] as TRealICQContacterListItem;
  1525. MainForm.BindUserDataToItem(AListItem, ARealICQUser);
  1526. lblTeamMemberCount.Caption := Format('接收者(%d/%d)', [FLVTeamMembers.OnlineNumeric, FLVTeamMembers.Items.Count]);
  1527. end;
  1528. end;
  1529. //------------------------------------------------------------------------------
  1530. procedure TSMSForm.FormClose(Sender: TObject; var Action: TCloseAction);
  1531. begin
  1532. Action := caFree;
  1533. end;
  1534. //------------------------------------------------------------------------------
  1535. procedure TSMSForm.FormCreate(Sender: TObject);
  1536. var
  1537. iLoop: Integer;
  1538. begin
  1539. SMSForms.Add(Self);
  1540. DoubleBuffered := True;
  1541. pnlClient.DoubleBuffered := True;
  1542. pnlToolBar.DoubleBuffered := True;
  1543. pnlMenu.DoubleBuffered := True;
  1544. pnlUsers.DoubleBuffered := True;
  1545. pnlTalkingArea.DoubleBuffered := True;
  1546. pnlInputer.DoubleBuffered := True;
  1547. pnlDisplayer.DoubleBuffered := True;
  1548. pnlHint.DoubleBuffered := True;
  1549. pnlForWebBrowser.DoubleBuffered := True;
  1550. btSend.DoubleBuffered := True;
  1551. WebBrowser.DoubleBuffered := False;
  1552. pnlForActionToolBar.DoubleBuffered := True;
  1553. pnlInputeBack.DoubleBuffered := True;
  1554. RichEdInputer.DoubleBuffered := True;
  1555. for iLoop := 0 to RichEdInputer.ControlCount - 1 do
  1556. begin
  1557. if RichEdInputer.Controls[iLoop] is TWinControl then
  1558. TWinControl(RichEdInputer.Controls[iLoop]).DoubleBuffered := True;
  1559. end;
  1560. RichEdInputer.Parent.DoubleBuffered := True;
  1561. pnlSendButtonBack.DoubleBuffered := True;
  1562. pnlMobile.DoubleBuffered := True;
  1563. FSMSReveivers := TStringList.Create;
  1564. pnlUsers.Width := 0;
  1565. FIsMultiSend := False;
  1566. FLastSendMsgTicket := 0;
  1567. Left := MainForm.SMSFormLeft;
  1568. Top := MainForm.SMSFormTop;
  1569. Width := MainForm.SMSFormWidth;
  1570. Height := MainForm.SMSFormHeight;
  1571. if Left < 0 then Left := 0;
  1572. if Left + Width > Screen.WorkAreaWidth then Left := Screen.WorkAreaWidth - Width;
  1573. if Top < 0 then Top := 0;
  1574. if Top + Height > Screen.WorkAreaHeight then Top := Screen.WorkAreaHeight - Height;
  1575. actAlwayOnTop.Checked := MainForm.TalkingFormAlwaysOnTop;
  1576. if actAlwayOnTop.Checked then
  1577. FormStyle := fsStayOnTop
  1578. else
  1579. FormStyle := fsNormal;
  1580. actCtrlEnter.Checked := MainForm.CtrlEnterSendMessage;
  1581. actEnter.Checked := not MainForm.CtrlEnterSendMessage;
  1582. RichEdInputer.MaxLength :=0;
  1583. RichEdInputer.DoubleBuffered := False;
  1584. RichEdInputer.Color := clWhite;
  1585. RichEdInputer.Font := MainForm.InputFont;
  1586. SkinName := AnsiReplaceText(MainForm.SkinName, 'MainForm', '');
  1587. ChangeUIColor(MainForm.UIMainColor);
  1588. DatePickerStart.Date := Now;
  1589. TimePickerStart.Time := Now;
  1590. WebBrowser.OnBeforeNavigate2 := nil;
  1591. WebBrowser.Navigate('about:blank');
  1592. WebBrowser.OnBeforeNavigate2 := WebBrowserBeforeNavigate2;
  1593. MainForm.RealICQClient.SendGetCanSendSMSCount;
  1594. TimerForGetHasSendSmsCount.Enabled:=True;
  1595. end;
  1596. //------------------------------------------------------------------------------
  1597. procedure TSMSForm.FormDestroy(Sender: TObject);
  1598. begin
  1599. SMSForms.Remove(Self);
  1600. if WindowState <> wsMaximized then
  1601. begin
  1602. MainForm.SMSFormLeft := Left;
  1603. MainForm.SMSFormTop := Top;
  1604. MainForm.SMSFormWidth := Width;
  1605. MainForm.SMSFormHeight := Height;
  1606. MainForm.SaveDefaultConfigs;
  1607. end;
  1608. if FLVTeamMembers <> nil then FreeAndNil(FLVTeamMembers);
  1609. FreeAndNil(FSMSReveivers);
  1610. end;
  1611. procedure TSMSForm.FormShow(Sender: TObject);
  1612. var
  1613. iWaitTimes: Integer;
  1614. begin
  1615. {$IFDEF NXQST}
  1616. spbSMSManage.Visible := False;
  1617. // AppCentreFrm.chrm1.Options.ApplicationCache := STATE_DISABLED;
  1618. {$ENDIF}
  1619. Application.ProcessMessages;
  1620. iWaitTimes := 0;
  1621. while not CanWriteMessage do
  1622. begin
  1623. Application.ProcessMessages;
  1624. Inc(iWaitTimes);
  1625. if iWaitTimes > 1000 then break;
  1626. Sleep(10);
  1627. end;
  1628. try
  1629. LoadNotReadSMSMessages;
  1630. except
  1631. end;
  1632. OnShow := nil;
  1633. end;
  1634. //------------------------------------------------------------------------------
  1635. procedure TSMSForm.pnlDisplayerResize(Sender: TObject);
  1636. var
  1637. UserName,
  1638. AStateMsg,
  1639. HIntMsg,
  1640. HDestIntMsg: WideString;
  1641. FRealICQUser: TRealICQUser;
  1642. begin
  1643. if pnlMobile.Visible then
  1644. begin
  1645. HDestIntMsg := '请输入接收短信的手机号码,多个号码之间以逗号隔开';
  1646. Caption := '手机短信';
  1647. end
  1648. else if FIsMultiSend then
  1649. begin
  1650. HDestIntMsg := '短信群发模式';
  1651. Caption := '群发 - 手机短信';
  1652. end
  1653. else
  1654. begin
  1655. FRealICQUser := TUsersService.GetUsersService.GetUser(FReceiver);
  1656. if Assigned(FRealICQUser) then
  1657. begin
  1658. if FRealICQUser.DisplayName = '' then
  1659. UserName := FRealICQUser.LoginName
  1660. else
  1661. UserName := FRealICQUser.DisplayName;
  1662. if (FRealICQUser.LoginState = stLeave) or (FRealICQUser.LoginState = stBusy) then
  1663. AStateMsg := FRealICQUser.LeaveMessage
  1664. else
  1665. AStateMsg := StateValues[Integer(FRealICQUser.LoginState) mod 5];
  1666. if FRealICQUser.Watchword = '' then
  1667. HDestIntMsg := '发送至: ' + UserName + '(' + AStateMsg + ')'
  1668. else
  1669. HDestIntMsg := '发送至: ' + UserName + '(' + AStateMsg + ') - ' + FRealICQUser.Watchword;
  1670. Caption := UserName + ' - 手机短信';
  1671. end
  1672. else //这种情况是与服务器的连接已断开了
  1673. begin
  1674. HDestIntMsg := LblDest.Hint;
  1675. end;
  1676. end;
  1677. if (MainForm.RealICQClient.Me = nil) then
  1678. begin
  1679. AStateMsg := StateValues[Integer(stOffline)];
  1680. HIntMsg := '您不能发送任何消息,因为您当前的状态为“' + AStateMsg + '”';
  1681. LblHint.Height := LblHint.Canvas.TextHeight(HIntMsg) * (LblHint.Canvas.TextWidth(HIntMsg) div LblHint.Width + 1);
  1682. pnlHint.Visible := True;
  1683. LblHint.Caption := HIntMsg;
  1684. pnlClient.Enabled := False;
  1685. btSend.Enabled := False;
  1686. end
  1687. else
  1688. begin
  1689. pnlHint.Visible := False;
  1690. LblHint.Caption := '';
  1691. pnlClient.Enabled := True;
  1692. btSend.Enabled := True;
  1693. end;
  1694. {$region '信息显示'}
  1695. LblDest.Hint := HDestIntMsg;
  1696. LblDest.ShowHint := False;
  1697. //字符串长度过长时,截短字符串并在后面显示“...”
  1698. while LblDest.Canvas.TextWidth(HDestIntMsg) > LblDest.Width do
  1699. begin
  1700. if Length(HDestIntMsg) > 3 then
  1701. begin
  1702. if Copy(HDestIntMsg, Length(HDestIntMsg) - 2, Length(HDestIntMsg)) = '...' then
  1703. HDestIntMsg := Copy(HDestIntMsg, 1, Length(HDestIntMsg) - 3);
  1704. HDestIntMsg := Copy(HDestIntMsg, 1, Length(HDestIntMsg) - 1) + '...';
  1705. end
  1706. else
  1707. break;
  1708. LblDest.ShowHint := True;
  1709. end;
  1710. LblDest.Caption := HDestIntMsg;
  1711. {$endregion}
  1712. end;
  1713. //------------------------------------------------------------------------------
  1714. procedure TSMSForm.ppForInputerGetControlClass(Sender: TCustomActionBar;
  1715. AnItem: TActionClient; var ControlClass: TCustomActionControlClass);
  1716. begin
  1717. MainForm.ChangePPMenuColorMap(ppForInputer.PopupMenu);
  1718. end;
  1719. procedure TSMSForm.ppForWebBrowserGetControlClass(Sender: TCustomActionBar;
  1720. AnItem: TActionClient; var ControlClass: TCustomActionControlClass);
  1721. begin
  1722. MainForm.ChangePPMenuColorMap(ppForWebBrowser.PopupMenu);
  1723. end;
  1724. procedure TSMSForm.ppUserItemRightMenuGetControlClass(Sender: TCustomActionBar;
  1725. AnItem: TActionClient; var ControlClass: TCustomActionControlClass);
  1726. begin
  1727. MainForm.ChangePPMenuColorMap(ppUserItemRightMenu.PopupMenu);
  1728. end;
  1729. //------------------------------------------------------------------------------
  1730. procedure TSMSForm.ppUserItemRightMenuPopup(Sender: TObject);
  1731. begin
  1732. miSendMessage.Visible := FLVTeamMembers.SelCount = 1;
  1733. miSeeUserInformation.Visible := FLVTeamMembers.SelCount = 1;
  1734. end;
  1735. //------------------------------------------------------------------------------
  1736. procedure TSMSForm.spbSMSManageClick(Sender: TObject);
  1737. begin
  1738. ShellExecute(handle, 'open', PChar(MainForm.GetDefaultBrowser),PChar(Format(MainForm.RealICQClient.WebAppBaseURL + BaseURL, [StrToBase64(MainForm.RealICQClient.LoginName), StrToBase64(MD5En(MainForm.RealICQClient.Password)), StrToBase64(SMSURL)])),'',SW_SHOWDEFAULT);
  1739. end;
  1740. procedure TSMSForm.RichEdInputerChange(Sender: TObject);
  1741. //var
  1742. // iCount, OnSMSLength: Integer;
  1743. //SenderName: String;
  1744. begin
  1745. if Length(Trim(RichEdInputer.Text)) = 0 then
  1746. begin
  1747. lblSMSState.Caption := '准备发送消息';
  1748. end
  1749. else
  1750. begin
  1751. lblSMSState.Caption := '已输入 ' + IntToStr(Length(RichEdInputer.Text)) + ' 个字符';
  1752. {
  1753. if Length(Trim(MainForm.RealICQClient.Me.DisplayName)) = 0 then
  1754. SenderName := MainForm.RealICQClient.Me.LoginName
  1755. else
  1756. SenderName := MainForm.RealICQClient.Me.DisplayName;
  1757. SenderName := ' -- ' + SenderName + '(可直接回复)';
  1758. OnSMSLength := 120 - Length(SenderName);
  1759. if Length(RichEdInputer.Text) mod OnSMSLength = 0 then
  1760. iCount := Length(RichEdInputer.Text) div OnSMSLength
  1761. else
  1762. iCount := Length(RichEdInputer.Text) div OnSMSLength + 1;
  1763. lblSMSState.Caption := '将发送 ' + IntToStr(iCount) + ' 条短信';
  1764. }
  1765. if TimerForGetHasSendSmsCount.Interval>7000 then
  1766. begin
  1767. MainForm.RealICQClient.SendGetCanSendSMSCount;
  1768. TimerForGetHasSendSmsCount.Interval:=5000;
  1769. end;
  1770. CalculateSMSCount;
  1771. end;
  1772. RichEdInputer.MaxLength :=MaxSmsLength;
  1773. if MaxSmsLength - Length(Trim(RichEdInputer.Text))<0 then
  1774. begin
  1775. MessageBox(Handle, '对不起,您输入的消息太长', '提示', MB_ICONINFORMATION);
  1776. RichEdInputer.Text:= Copy(RichEdInputer.Text,1,900);
  1777. RichEdInputer.SelStart:=900;
  1778. end;
  1779. end;
  1780. //------------------------------------------------------------------------------
  1781. procedure TSMSForm.RichEdInputerMouseDown(Sender: TObject; Button: TMouseButton;
  1782. Shift: TShiftState; X, Y: Integer);
  1783. var
  1784. Point: TPoint;
  1785. begin
  1786. if Button = mbRight then
  1787. begin
  1788. Point.X := X;
  1789. Point.Y := Y;
  1790. Point := RichEdInputer.ClientToScreen(Point);
  1791. ppForInputer.Popup(Point.X, Point.Y);
  1792. end;
  1793. end;
  1794. //------------------------------------------------------------------------------
  1795. procedure TSMSForm.lblDestClick(Sender: TObject);
  1796. begin
  1797. SeeUserInformation(Receiver);
  1798. end;
  1799. //------------------------------------------------------------------------------
  1800. procedure TSMSForm.lblDestMouseDown(Sender: TObject; Button: TMouseButton;
  1801. Shift: TShiftState; X, Y: Integer);
  1802. begin
  1803. lblDest.Left := lblDest.Left + 1;
  1804. lblDest.Top := lblDest.Top + 1;
  1805. end;
  1806. //------------------------------------------------------------------------------
  1807. procedure TSMSForm.lblDestMouseEnter(Sender: TObject);
  1808. begin
  1809. lblDest.Cursor := crHandPoint;
  1810. lblDest.Font.Style := [fsUnderline]
  1811. end;
  1812. //------------------------------------------------------------------------------
  1813. procedure TSMSForm.lblDestMouseLeave(Sender: TObject);
  1814. begin
  1815. lblDest.Cursor := crDefault;
  1816. lblDest.Font.Style := []
  1817. end;
  1818. //------------------------------------------------------------------------------
  1819. procedure TSMSForm.InvokeCMD(InvokeIE: Boolean; Value1, Value2: Integer; var vaIn, vaOut: OleVariant);
  1820. const
  1821. CLSID_WebBrowser: TGUID = '{ED016940-BD5B-11cf-BA4E-00C04FD70816}';
  1822. var
  1823. CmdTarget: IOleCommandTarget;
  1824. PtrGUID: PGUID;
  1825. begin
  1826. New(PtrGUID);
  1827. if InvokeIE then PtrGUID^ := CLSID_WebBrowser else
  1828. PtrGuid := PGUID(nil);
  1829. if WebBrowser.Document <> nil then
  1830. try
  1831. WebBrowser.Document.QueryInterface(IOleCommandTarget, CmdTarget);
  1832. if CmdTarget <> nil then
  1833. try
  1834. CmdTarget.Exec(PtrGuid, Value1, Value2, vaIn, vaOut);
  1835. finally
  1836. CmdTarget._Release;
  1837. end;
  1838. except end;
  1839. Dispose(PtrGUID);
  1840. end;
  1841. //------------------------------------------------------------------------------
  1842. procedure TSMSForm.lblDestMouseUp(Sender: TObject; Button: TMouseButton;
  1843. Shift: TShiftState; X, Y: Integer);
  1844. begin
  1845. lblDest.Left := lblDest.Left - 1;
  1846. lblDest.Top := lblDest.Top - 1;
  1847. end;
  1848. //------------------------------------------------------------------------------
  1849. procedure TSMSForm.miCopyFromIEClick(Sender: TObject);
  1850. var
  1851. vaIn, vaOut: Olevariant;
  1852. begin
  1853. InvokeCmd(FALSE, OLECMDID_COPY, OLECMDEXECOPT_DODEFAULT, vaIn, vaOut);
  1854. end;
  1855. procedure TSMSForm.miSeeUserInformationClick(Sender: TObject);
  1856. var
  1857. iLoop: Integer;
  1858. ListItem: TRealICQContacterListItem;
  1859. begin
  1860. for iLoop := 0 to FLVTeamMembers.Items.Count - 1 do
  1861. begin
  1862. ListItem := FLVTeamMembers.Items.Objects[iLoop] as TRealICQContacterListItem;
  1863. if ListItem.Selected then
  1864. begin
  1865. SeeUserInformation(ListItem.LoginName);
  1866. Break;
  1867. end;
  1868. end;
  1869. end;
  1870. procedure TSMSForm.miSelAllFromIEClick(Sender: TObject);
  1871. var
  1872. vaIn, vaOut: Olevariant;
  1873. begin
  1874. InvokeCmd(FALSE, OLECMDID_SELECTALL, OLECMDEXECOPT_DODEFAULT, vaIn, vaOut);
  1875. end;
  1876. //------------------------------------------------------------------------------
  1877. procedure TSMSForm.miSendMessageClick(Sender: TObject);
  1878. var
  1879. iLoop: Integer;
  1880. ListItem: TRealICQContacterListItem;
  1881. begin
  1882. for iLoop := 0 to FLVTeamMembers.Items.Count - 1 do
  1883. begin
  1884. ListItem := FLVTeamMembers.Items.Objects[iLoop] as TRealICQContacterListItem;
  1885. if ListItem.Selected then
  1886. begin
  1887. if AnsiSameText(ListItem.LoginName, MainForm.RealICQClient.LoginName) then
  1888. begin
  1889. MessageBox(Handle, '对不起,不可以和自己对话!', '提示', MB_ICONINFORMATION);
  1890. Exit;
  1891. end;
  1892. OpenTalkingForm(ListItem.LoginName);
  1893. Break;
  1894. end;
  1895. end;
  1896. end;
  1897. procedure TSMSForm.N1Click(Sender: TObject);
  1898. var
  1899. iLoop: Integer;
  1900. ListItem: TRealICQContacterListItem;
  1901. begin
  1902. for iLoop := 0 to FLVTeamMembers.Items.Count - 1 do
  1903. begin
  1904. ListItem := FLVTeamMembers.Items.Objects[iLoop] as TRealICQContacterListItem;
  1905. if ListItem.Selected then
  1906. begin
  1907. FLVTeamMembers.Items.Delete(ListItem.ItemIndex);
  1908. Break;
  1909. end;
  1910. end;
  1911. lblTeamMemberCount.Caption := Format('接收者(%d/%d)', [FLVTeamMembers.OnlineNumeric, FLVTeamMembers.Items.Count]);
  1912. end;
  1913. //------------------------------------------------------------------------------
  1914. //------------------------------------------------------------------------------
  1915. initialization
  1916. SMSForms := TList.Create;
  1917. SMSMessages := TStringList.Create;
  1918. finalization
  1919. FreeAndNil(SMSForms);
  1920. FreeAndNil(SMSMessages);
  1921. end.