先前用控制台程序做了个在线刷Kx的小工具,有一个问题就是perform wm_close后IE会报错:恢复当前会话什么的,而且占用资源也不小(主要是IE占资源)。
今晚想做一个VCL版的,特别是联系一下TWebBrowser控件等工具。通过对TWebBrowser控件的研究,熟悉了他的几个响应时间,也发觉其有一定的局限性。
或许是我没有找到具体的使用方法吧,至少怎样用TWebBrowser控件来控制自动登陆BBS我就没找到现成的控制函数,当然没找到并不代表没有,留个悬念吧。
有些收获我直接放在代码里了,有些还是总结一下吧:
1、用好时钟控件能减少一些代码的编写:本来想写个响应最小化的消息函数,来让程序隐藏切换至tray图标。但是发现可以利用WindowState=wsMinimized来
判断窗体的状态,最小化了就直接隐藏并切换至tray图标。
2、日期时间函数的学习,HourSpan和DaySpan的用法,来计算两个时间的间隔。
3、小数位数的操作RoundTo()
下面附上源代码,不足之处希望多批评指正!
MainFrm的:
unit MainFrm; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, OleCtrls, SHDocVw, ExtCtrls, StdCtrls,DateUtils,Math; type TForm1 = class(TForm) tmrStateMonitor: TTimer; tmrRefresh: TTimer; Panel1: TPanel; lstInfoShow: TListBox; wbIE: TWebBrowser; TrayIcon: TTrayIcon; procedure FormCreate(Sender: TObject); procedure wbIEDocumentComplete(ASender: TObject; const pDisp: IDispatch; var URL: OleVariant); procedure wbIENavigateError(ASender: TObject; const pDisp: IDispatch; var URL, Frame, StatusCode: OleVariant; var Cancel: WordBool); procedure tmrStateMonitorTimer(Sender: TObject); procedure tmrRefreshTimer(Sender: TObject); procedure TrayIconDblClick(Sender: TObject); procedure FormHide(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; bDocumentComplete,bNavigateError:Boolean; StartTime:TDateTime; const sErrorLinkInternet:String='错误!无法访问网页!'; const sSuccessLinkInternet:String=' 成功访问网页!'; const sSuccessRefresh:String=' 成功刷新网页!'; const sOnlineTime:string=' 在线时长:'; const sHour:string='小时'; implementation {$R *.dfm} function GetOnlineTimeStr(StartTime,EndTime:TDateTime):string; begin Result:=sOnlineTime+floattostr(RoundTo(HourSpan(StartTime,EndTime),-3))+sHour; end; procedure TForm1.FormCreate(Sender: TObject); begin wbIE.Navigate('http://bbs.pediy.com/index.php'); end; procedure TForm1.FormHide(Sender: TObject); begin Hide(); WindowState := wsMinimized; TrayIcon.Visible := True; end; procedure TForm1.tmrRefreshTimer(Sender: TObject); begin wbIE.Refresh;//根据制定事件刷新网页 lstInfoShow.Items.add(DateTimeToStr(now)+sSuccessRefresh+GetOnlineTimeStr(StartTime,Now)); end; procedure TForm1.tmrStateMonitorTimer(Sender: TObject); begin if bNavigateError then begin ShowMessage(sErrorLinkInternet);//无法打开网页时结束程序 Application.Terminate; end; if bDocumentComplete and (tmrRefresh.Enabled=False) then begin StartTime:=Now; lstInfoShow.Items.add(DateTimeToStr(StartTime)+sSuccessLinkInternet); tmrRefresh.Enabled:=True; end; if WindowState=wsMinimized then// 最小化的时候切换到Tray begin Hide(); TrayIcon.Visible := True; end; end; procedure TForm1.TrayIconDblClick(Sender: TObject); begin { Hide the tray icon and show the window, setting its state property to wsNormal. } TrayIcon.Visible := False; Show(); WindowState := wsNormal; Application.BringToFront(); end; procedure TForm1.wbIEDocumentComplete(ASender: TObject; const pDisp: IDispatch; var URL: OleVariant); begin //只要页面加载完毕就会发生这个事件,无论页面是否加载正常。 //基于ReadyState属性来判断 // 正常访问时,第一个显示DownloadComplete, //第二个相应的是NavigateComplete2 第三是downloadcomplete 第四才是documentcomplete //ShowMessage('DocumentComplete'); bDocumentComplete:=True; end; //procedure TForm1.wbIEDownloadComplete(Sender: TObject); //begin // //与onDocumentComplete事件类似,无论页面是否正常加载都会显示 // // 发生错误时,第一个显示DownloadComplete,居然抢在 NavigateError前 // //第三个相应的是NavigateComplete2 第四是downloadcomplete 第五是documentcomplete // //downloadcomplete还要出现一次。 // //ShowMessage('DownloadComplete'); //end; //procedure TForm1.wbIENavigateComplete2(ASender: TObject; const pDisp: IDispatch; // var URL: OleVariant); //begin // //Note: Unlike the OnDownloadComplete event, OnNavigateComplete2 does not occur if the operation is not successful. // //ShowMessage('NavigateComplete2'); //end; procedure TForm1.wbIENavigateError(ASender: TObject; const pDisp: IDispatch; var URL, Frame, StatusCode: OleVariant; var Cancel: WordBool); begin //综合起来判断一次访问成功与否,关键在看出不出NavigateError //当 DocumentComplete发生,NavigateError不发生的时候,可以认为访问成功。 //实际上,只要NavigateError发生,就报错终止程序,那么自然可以认为 //DocumentComplete是访问成功的标志。 //ShowMessage('NavigateError!'); bNavigateError:=True; end; end.
Dpr的:
program RefreshKxTB; uses Forms, MainFrm in 'MainFrm.pas' {Form1}; {$R *.res} begin ReportMemoryLeaksOnShutdown:=True; Application.Initialize; Application.MainFormOnTaskbar := True; Application.CreateForm(TForm1, Form1); Application.Run; end.