真正的DocumentComplete .

本文详细介绍了如何在Web浏览器加载完成时触发事件并进行处理,包括在VB和Visual C++中的实现方法,以及如何区分顶级帧和子帧的加载情况。重点讲述了DocumentComplete事件的触发时机和应用,提供了在不同编程环境中实现网页完整加载检测的代码示例。

http://blog.youkuaiyun.com/skyremember/article/details/2994168

DocumentComplete

当一个文档完整的完成下载Internet Explorer 激发DocumentComplete 事件. 仅仅当此事件激发后 文档对象才可安全使用.在一个无帧的Web页情形中文档对象是IHTMLDocument2 对象, 我们以后会讨论. 当文档对象准备好可用,他的状态为READYSTATE_COMPLETE.

关于 DocumentComplete 事件以西击点需要注意:

·         在没有帧的web页, DocumentComplete 事件在下载完成后激发一次.

  • 在多帧的web页,此事件激发多次.并非每一个帧激发一个事件, 但每一个帧激发DownloadBegin事件将会相应激发DocumentComplete 事件.
  • DocumentComplete又一个指向 IDispatch 的指针参数, 该参数指向激发此事件的窗口. 此窗口可以是帧中的窗口
  • 顶级帧在所有子帧激发了各自的DocumentComplete事件后激发自己的 DocumentComplete事件。因此,,要看一个web页是否完整下载完成, 你需要从该事件的处理句柄中获取由事件产地过来的IDispatch 参数的IUnknown 接口。下一步,比较IUnknown 接口是否指向你正宿主的WebBrowser控件或者自动化的IE的实例的IUnknown 接口.如果这两个指针相同,这意味着全部HTML, 图片images, 控件,以及诸如此类在顶级帧或者子帧的全部对象元素都被下载了.

 

VB中实现以上四点及其容易.仅需要检查发送给事件的pDisp 参数事一个WebBrowser 对象. Visual Basic小心检查这些对象的 Iunknown否为同一个对象.此处为VB代码::

Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object,
                                         URL As Variant)
   If (pDisp Is WebBrowser1.Object) Then
      MsgBox "The document is finished loading."
   End If
End Sub

实现以上四点在Visual C++ 应用程序里较困难一点,但你可以做到! 首先在DocumentComplete 事件的宏中如下声明:

ON_EVENT(CMfcWebHostView, IDC_WEBBROWSER, DISPID_DOCUMENTCOMPLETE,
         OnDocumentComplete, VTS_DISPATCH VTS_PVARIANT)

接下来声明OnDocumentComplete 方法作为事件处理句柄

void OnDocumentComplete(LPDISPATCH lpDispatch, VARIANT FAR* URL);

最后,实现该方法以检测 是否页面已经下载,我们得到我们宿主控制bBrowser 控件的IUnknown. (注意我们不是简单获取指向 IUnknown ,而是要调用GetControlUnknown 方法. GetControlUnknown方法返回的IUnknown 指针 实际上并不等于被宿主话的 WebBrowser控件的IUnknown. 那将返回IOleObject 接口指针.) 下一步, 获取IUnknown 指针,如果QueryInterface 查询得到的Dispatch 参数同Iunknown接口是同一对象,则页面完成整个下载。.

void CMfcWebHostView::OnDocumentComplete(LPDISPATCH lpDispatch,
                                         VARIANT FAR* URL)
{
   HRESULT   hr;
   LPUNKNOWN lpUnknown;
   LPUNKNOWN lpUnknownWB = NULL;
   LPUNKNOWN lpUnknownDC = NULL;
 
   lpUnknown = m_webBrowser.GetControlUnknown();
   ASSERT(lpUnknown);
 
   if (lpUnknown)
   {
      // Get the pointer to the IUnknown interface of the WebBrowser 
      // control being hosted. The pointer to the IUnknown returned from 
      // GetControlUnknown is not the pointer to the IUnknown of the 
      // WebBrowser control. It's actually a pointer to the IOleObject.
      // 
      hr = lpUnknown->QueryInterface(IID_IUnknown,
                                     (LPVOID*)&lpUnknownWB);
 
      ASSERT(SUCCEEDED(hr));
 
      if (FAILED(hr))
         return;
 
      // Get the pointer to the IUnknown of the object that fired this 
      // event.
      //
      hr = lpDispatch->QueryInterface(IID_IUnknown, 
                                      (LPVOID*)&lpUnknownDC);
 
      ASSERT(SUCCEEDED(hr));
 
      if (SUCCEEDED(hr) && lpUnknownWB == lpUnknownDC)
      {
         // The document has finished loading.
         //
         MessageBox("The document has finished loading.");
      }
 
      if (lpUnknownWB)
         lpUnknownWB->Release();
 
      if (lpUnknownDC)
         lpUnknownDC->Release();
   }
}

有一点需要注意上面的代码我们在GetControlUnknown 返回的IUnknown 接口指针使用时并没有进行Release ,因为b IUnknown 指针并没有在GetControlUnknown方法中 AddRef'. GetControlUnknown 方法仅仅返回一个IOleObject 数据成员的指针,该指针由控件站点类—CcontrolSite 操纵处理. 如果你释放了IUnknown 接口指针, 载你关闭应用程序时,一个访问违例将会发生,因为MFC 将试图在对象被删除时候多释放一次.

DownloadBegin

DownloadBegin 事件通知应用程序一个导航操作开始. 一般情况下该事件在BeforeNavigate2 事件之后激发, 除非导航操作在BeforeNavigate2 事件处理过程中被取消.容器应当显示动画或者忙指示当前正处于连接的DownloadBegin事件. 每一个 DownloadBegin 事件有一个相应的DownloadComplete 事件. 在刷新页面的情形中, DownloadBegin DownloadComplete 使唯一的被激发的导航事件.

DownloadComplete

DownloadComplete在一个导航操作完成时候发生, 停止, 或者失败. 不像 NavigateComplete2仅仅当成功导航才发生, DownloadComplete总是在道涵开始后激发.任何在DownloadBegin 中显示的动画或者忙指示将会在DownloadComplete 中停止.

NavigateComplete2

NavigateComplete2 事件在导航到一个超连接整个窗口或者帧集合的元素全部完成时候发生. 第一此事件发生表示文档document已经准备好.在此事件发生后, 你可以通过Document 属性存取文档(document)而不接收到错误.但是能够访问一个文档不意味着你访问文档使安全的.你可以在DocumentComplete 事件激发后安全访问文档.

档你需要访问document对象但是不需要访问文档内的元素,你可以在NavigateComplete2 事件中尽可能快的处理,例如当你在文打工通过高级宿主接口. NavigateComplete2 事件有2个参数—IDispatch of 代表激发事件的对象URL 为你需要导航到的URL.

1 {/** 2 3 Date:2025-11-15 4 5 Author:吴chunyuan转载请注明出处 6 7 **/} 8 9 procedure TFxlcj.Caiji_xl(OperNum:integer); {本程序主要处理环节: 采集新浪数据 0-初始化 1-盘中 体球网采集:3-联赛球队 4-期数系列 } 10 var Rp_Count,Get_Web,LineCount,c,i,j,backStart,Count_ws ,Count_qx:integer; 11 ThreadId1:DWORD; 12 Ret_Get_bszl:TArr; 13 // Fmt :TCharFormat2; 14 begin 15 Get_Web:=1; 16 if Eqhao.Text='' then 17 begin 18 if OperNum<4 then 19 begin 20 SendtoMain('采集窗口提示:请输入期号如130808'); 21 exit; 22 end; 23 end; 24 25 Csh_qpfx(OperNum); {初始化期号} 26 Edit2.CopyToClipboard; //将剪切板初始化 27 sleep(20); 28 RichEdit1.PlainText := true; 29 //WebBrowser1.SetFocus; 30 31 { if WebBrowser1.ReadyState > READYSTATE_LOADING then 32 begin 33 WebBrowser1.stop; 34 WebBrowser1.SetFocus; 35 end else 36 begin 37 SendtoMain('取网页异常,请重来1!'); 38 exit; 39 end; 40 } 41 WebBrowser1.SetFocus; 42 43 Rp_Count:=0; {初始化重负复制网页的次数,因为有时复制不成功 上限20次} 44 45 Repeat {复制网页以提取数据} 46 47 try 48 webbrowser1.ExecWB(OLECMDID_SELECTALL,0); 49 webbrowser1.ExecWB(OLECMDID_COPY,0); 50 // WebBrowser1.ExecWB(OLECMDID_UNDO, 0); 51 Get_Web:=0; 52 except 53 SendtoMain('复制网页异常,请重来!'); 54 Get_Web:=1; 55 end; 56 57 if Get_Web=0 then 58 begin 59 richedit1.Lines.Clear; 60 //richedit1.SetFocus; 61 richedit1.PasteFromClipboard; 62 WebBrowser1.ExecWB(OLECMDID_UNDO, OLECMDEXECOPT_DODEFAULT); //取消全选 63 c:=0; {寻找选择区域的起点位置} 64 // backStart := RichEdit1.SelStart; //备份光标位置 65 RichEdit1.SelStart := c; //寻找选择区域的起点位置 66 // initializeCriticalSection(CS); //没初始化会 提示访问ntdll.dll模块出错 67 LineCount:=RichEdit1.Lines.Count; 68 SendtoMain('采集失败,请重来!'); 69 end; 70 Rp_Count:=Rp_Count+1; 71 until ((LineCount>100) or (Rp_Count>2) ); //重复不超2次 72 73 { 74 75 WebBrowser1.ExecWB(OLECMDID_SELECTALL, OLECMDEXECOPT_DODEFAULT); //全选网页 76 WebBrowser1.ExecWB(OLECMDID_COPY, OLECMDEXECOPT_DODEFAULT); //复制网页 77 WordDocu.Range.Paste; //word文档粘贴 78 WebBrowser1.ExecWB(OLECMDID_UNDO, OLECMDEXECOPT_DODEFAULT); //取消全选 79 } 80 81 if Rp_Count>20 then exit; 82 83 {采集期数序列} 84 85 setlength(Ret_Get_bszl,18); {初始化数组} 86 87 if OperNum=4 then //取期号序列 88 begin 89 for i:=10 to 50 do 90 begin 91 Ret_Get_bszl:=Get_bszl(2,i); 92 if (Ret_Get_bszl[0]<>'1.0') and (length(Ret_Get_bszl[0])=6) then 93 begin 94 Eqhao.Text:=Ret_Get_bszl[0]; 95 ComboBox2.Items.Clear; 96 for j:=0 to 9 do 97 ComboBox2.Items.Add(Ret_Get_bszl[j]); 98 ComBobox2.ItemIndex:=0; 99 //Memo1.Lines.Clear; 100 SendtoMain('取期号序列成功:'); 101 SendtoMain(Ret_Get_bszl[0]+' '+Ret_Get_bszl[1]+' '+Ret_Get_bszl[2]+' '+Ret_Get_bszl[3]+' '+Ret_Get_bszl[4]+' '+Ret_Get_bszl[5]+' '+Ret_Get_bszl[6]+' '+Ret_Get_bszl[7]+' '+Ret_Get_bszl[8]+' '+ Ret_Get_bszl[9]); 102 exit; 103 end; 104 end; 105 end; 106 107 {开始采集数据} 108 if OperNum<4 then 109 begin 110 if OperNum=0 then 111 SendtoMain('初始化采集中....') else 112 SendtoMain('盘中采集中....'); 113 Count_ws:=0; //未赛场数 114 Count_qx:=0; 115 for i:=0 to LineCount-1 do 116 begin 117 118 j:=Caiji_xl_cjoneline(OperNum,i); 119 if j=0 then Count_ws:=Count_ws+1; 120 if j=2 then Count_qx:=Count_qx+1; 121 sleep(5); 122 application.ProcessMessages; //使用简单多线程 123 124 end; 125 if Count_ws>0 then 126 SendtoMain('采集完毕,未赛场数:'+inttostr(Count_ws-1)+',取消场数:'+inttostr(Count_qx)) else 127 SendtoMain('采集失败!'); 128 129 130 131 end; 132 133 RichEdit1.SelStart := backStart ; //恢复光标位置 134 //webbrowser1.SetFocus; 135 // WebBrowser1.ExecWB(OLECMDID_UNDO,0); // OLECMDEXECOPT_DODEFAULT 136 end; 137 138 主要过程、函数:(贴两个好了。。) 139 140 function TFxlcj.Caiji_xl_cjoneline(OperNum:integer;Num:integer):integer; //返回 0- 无比分 1-有比分 2-取消 3-其他 141 var rs,i:integer; 142 Ret_Get_bszl,sparr:TArr; 143 fMainMessage,s,strpk,strbf,strypoz,strypsp:string; 144 begin 145 // EnterCriticalSection(CS); 146 rs:=3; 147 setlength(Ret_Get_bszl,18); 148 i:=Num; 149 Ret_Get_bszl:= Get_bszl(1,i); {取每条比赛记录,返回个字段值} 150 151 {取期号,没用到 if ( i>=24) and (i<=24) then 152 begin 153 strno:=GetFieldValue(' ',richedit1.Lines.Strings[i],1); 154 end;} 155 156 if i>=130 then //从网页131行开始取比赛资料 157 begin 158 if length(Ret_Get_bszl[1])=1 then {是比赛记录 将进行:取数-插入bslsz } 159 begin 160 g_IfInsert:=IfInsert_bslsz(Ret_Get_bszl[0],Ret_Get_bszl[3],Ret_Get_bszl[5]); 161 if g_IfInsert<0 then exit; 162 163 if Ret_Get_bszl[9]<>'' then {无比分} 164 begin 165 rs:=0; 166 //SendtoMain(strdate+','+str2+','+str3+','+str4+','+str5+','+str6+','+str7+','+str81+','+str82+','+str83+','+str10+','+str11+','+str12); 167 try 168 if g_IfInsert=0 then 169 s := Format('insert into bslsz (bsrq,xh,bssj,lsmc,zd,rangqiu,kd,sp1,sp2,sp3,xsp1,xsp2,xsp3,qhao) values (%s,%d,%s,%s,%s,%d,%s,%f,%f,%f,%f,%f,%f,%s)', 170 ['#'+Ret_Get_bszl[0]+'#',strtoint(Ret_Get_bszl[2]),quotedstr(Ret_Get_bszl[4]),quotedStr(Ret_Get_bszl[3]),quotedStr(Ret_Get_bszl[5]),strtoint(Ret_Get_bszl[6]),quotedStr(Ret_Get_bszl[7]),strtofloat(Ret_Get_bszl[8]),strtofloat(Ret_Get_bszl[9]),strtofloat(Ret_Get_bszl[10]),strtofloat(Ret_Get_bszl[14]),strtofloat(Ret_Get_bszl[15]),strtofloat(Ret_Get_bszl[16]),Quotedstr(Eqhao.Text)]); 171 g_insertflag:=1; 172 173 except 174 //exit; 175 g_insertflag:=0; 176 SendtoMain('无SP'); 177 end; 178 179 if ( (g_IfInsert>0) and (OperNum=0)) or (OperNum=1) then {无比分,更新最新xsp--重新初始化 } 180 Update_sp(Ret_Get_bszl[0],Ret_Get_bszl[3],Ret_Get_bszl[5],Ret_Get_bszl[8],Ret_Get_bszl[9],Ret_Get_bszl[10],Ret_Get_bszl[14],Ret_Get_bszl[15],Ret_Get_bszl[16],OperNum); {修改xsp1,xsp2,xsp3} 181 182 {OperNum=1 无比分,更新最新xsp--盘中 } 183 {修改xsp1,xsp2,xsp3} 184 end; 185 186 187 if Ret_Get_bszl[9]='' then {有比分} 188 begin 189 rs:=1; 190 try 191 strpk:= Return_pank(strtoint(Ret_Get_bszl[6]),strtoint(Ret_Get_bszl[8]),strtoint(Ret_Get_bszl[10])); 192 strbf:= Return_bf(strtoint(Ret_Get_bszl[8]),strtoint(Ret_Get_bszl[10])); 193 except 194 SendtoMain('errcode:2,'+Ret_Get_bszl[5]); 195 exit; 196 end; 197 198 //SendtoMain(Ret_Get_bszl[0]+','+Ret_Get_bszl[2]+','+Ret_Get_bszl[3]+','+Ret_Get_bszl[4]+','+Ret_Get_bszl[5]+','+Ret_Get_bszl[6]+','+Ret_Get_bszl[7]+','+Ret_Get_bszl[8]+':'+Ret_Get_bszl[10]+','+Ret_Get_bszl[11]+','+Ret_Get_bszl[12]+','+Ret_Get_bszl[13]+','+Ret_Get_bszl[14]+','+Ret_Get_bszl[15]+','+Ret_Get_bszl[16]+strpk+','+strbf); 199 fMainMessage:=Ret_Get_bszl[2]+' '+Ret_Get_bszl[3]+' '+Ret_Get_bszl[5]+'--'+Ret_Get_bszl[7]+' '+Ret_Get_bszl[8]+':'+Ret_Get_bszl[10]+' '+strpk+','+strbf; 200 SendtoMain(fMainMessage); 201 if g_IfInsert=0 then 202 try 203 204 s := Format('insert into bslsz (bsrq,xh,bssj,lsmc,zd,rangqiu,kd,zdrq,kdrq,sp1,sp2,sp3,xsp1,xsp2,xsp3,pjg,bfjg,qhao) values (%s,%d,%s,%s,%s,%d,%s,%d,%d,%f,%f,%f,%f,%f,%f,%s,%s,%s)', 205 ['#'+Ret_Get_bszl[0]+'#',strtoint(Ret_Get_bszl[2]),quotedstr(Ret_Get_bszl[4]),quotedStr(Ret_Get_bszl[3]),quotedStr(Ret_Get_bszl[5]),strtoint(Ret_Get_bszl[6]),quotedStr(Ret_Get_bszl[7]),strtoint(Ret_Get_bszl[8]),strtoint(Ret_Get_bszl[10]),strtofloat(Ret_Get_bszl[11]),strtofloat(Ret_Get_bszl[12]),strtofloat(Ret_Get_bszl[13]),strtofloat(Ret_Get_bszl[14]),strtofloat(Ret_Get_bszl[15]),strtofloat(Ret_Get_bszl[16]),quotedStr(strpk),quotedStr(strbf),Quotedstr(Eqhao.Text)]); 206 207 except 208 showmessage('e:'+s); 209 exit; 210 end; 211 212 if g_IfInsert>0 then 213 begin 214 setlength(sparr,13); 215 sparr:=Bslsz_sp(Ret_Get_bszl[0],Ret_Get_bszl[3],Ret_Get_bszl[5]); { sp1,nsp1,sp2,nsp2,sp3,nsp3,xsp1,nxsp1,xsp2,nxsp2,xsp3,nxsp3} 216 //SendtoMain(sparr[0]); 217 if strpk='赢' then {取最新SP 如果数据库最新 sp 或欧指为-1.0 取网页最新值 2013-7-30 } 218 begin strypoz:=Ret_Get_bszl[11]; strypsp:=Ret_Get_bszl[14]; end; 219 220 221 if strpk='平' then 222 begin strypoz:=Ret_Get_bszl[12]; strypsp:=Ret_Get_bszl[15]; end; 223 224 if strpk='负' then 225 begin strypoz:=Ret_Get_bszl[13]; strypsp:=Ret_Get_bszl[16]; end; 226 227 if strpk='取消' then 228 begin rs:=2;strypoz:='-1.0'; strypsp:='-1.0'; end; {2013-11-4增加,否则Update_bslsz 无数据,出错} 229 230 231 try 232 Update_bslsz(Ret_Get_bszl[0],Ret_Get_bszl[3],Ret_Get_bszl[5],strtoint(Ret_Get_bszl[8]),strtoint(Ret_Get_bszl[10]),strpk,strbf,strypsp,strypoz); 233 except 234 SendtoMain('errcode:update_bslsz'+strypsp+','+strypoz); 235 exit; 236 end; 237 end; 238 end; 239 240 if g_IfInsert=0 then 241 Insert_bslsz(s); 242 end;{插入结束} 243 // RichEdit1.SelLength := 0; //恢复选择 244 245 end; 246 result:=rs; 247 // LeaveCriticalSection(CS); 248 end; 249 250 251 252 253 Function TFxlcj.Get_bszl(Flag:Integer;Row:Integer):TArr; {取每行比赛资料,Flag=1比赛资料 2-取期序列} 254 var 255 str1,str2,str3,str4,str5,str6,str7,str8,str81,str82,str83,str9,str91,str92,str93,str10,str11,str12:string; 256 pos1:integer; 257 begin 258 259 str82:=''; 260 RichEdit1.SelLength := length(richedit1.Lines.Strings[Row]); //获得选择当前行的长度 261 str1:= GetFieldValue(' ',richedit1.Lines.Strings[Row],1); 262 str2:= GetFieldValue(' ',richedit1.Lines.Strings[Row],2); 263 if Flag=2 then {取期数系列} 264 begin 265 266 // SendtoMain(str1+','+str2); 267 268 Result[0]:='1.0'; 269 Result[1]:='1.0'; 270 Result[2]:='1.0'; 271 Result[3]:='1.0'; 272 Result[4]:='1.0'; 273 Result[5]:='1.0'; 274 Result[6]:='1.0'; 275 Result[7]:='1.0'; 276 Result[8]:='1.0'; 277 Result[9]:='1.0'; 278 Result[10]:='1.0'; 279 Result[11]:='1.0'; 280 Result[12]:='1.0'; 281 Result[13]:='1.0'; 282 Result[14]:='1.0'; 283 Result[15]:='1.0'; 284 Result[16]:='1.0'; 285 if copy(str2,1,4)='当前' then 286 begin 287 Result[0]:=str1; 288 Result[1]:=copy(str2,5,6); 289 Result[2]:=copy(str2,11,6); 290 Result[3]:=copy(str2,17,6); 291 Result[4]:=copy(str2,23,6); 292 Result[5]:=copy(str2,29,6); 293 Result[6]:=copy(str2,35,6); 294 Result[7]:=copy(str2,41,6); 295 Result[8]:=copy(str2,47,6); 296 Result[9]:=copy(str2,53,6); 297 298 end; 299 exit; 300 end; 301 302 303 str3:= GetFieldValue(' ',richedit1.Lines.Strings[Row],3); 304 str4:= GetFieldValue(' ',richedit1.Lines.Strings[Row],4); 305 str5:= GetFieldValue(' ',richedit1.Lines.Strings[Row],5); 306 pos1:=pos('(',str5); {去除主队(中)} 307 if pos1>0 then str5:=copy(str5,1,pos1-1); 308 str6:= GetFieldValue(' ',richedit1.Lines.Strings[Row],6); 309 str7:= GetFieldValue(' ',richedit1.Lines.Strings[Row],7); 310 str8:= GetFieldValue(' ',richedit1.Lines.Strings[Row],8); 311 pos1:=pos('-',str8); 312 313 if pos1>0 then {未有比分,无欧指} 314 begin 315 str81:='-1.0'; 316 str82:='-1.0'; 317 str83:='-1.0'; 318 end; 319 {begin 根据str8长度判断 =12 ; >12 ; <12且 <>'---' ; } 320 321 if length(str8)=12 then {有大于12的情况 :1.192.1912.19} 322 begin 323 str81:=copy(str8,1,4); 324 str82:=copy(str8,5,4); 325 str83:=copy(str8,9,4); 326 end; 327 328 if str8='---' then 329 begin 330 str81:='-1.0'; 331 str82:='-1.0'; 332 str83:='-1.0'; 333 end; 334 335 336 if (length(str8)>12) then {有大于12的情况 :1.19 2.19 12.19} 337 begin 338 if (length(GetFieldValue('.',str8,1))=1) and (length(GetFieldValue('.',str8,2))=3) and (length(GetFieldValue('.',str8,3))=4) then 339 begin 340 str81:=copy(str8,1,4); 341 str82:=copy(str8,5,4); 342 str83:=copy(str8,9,5); 343 end; 344 {12.11 1.23 3.23} 345 if (length(GetFieldValue('.',str8,1))=2) and (length(GetFieldValue('.',str8,2))=3) and (length(GetFieldValue('.',str8,3))=3) then 346 begin 347 str81:=copy(str8,1,5); 348 str82:=copy(str8,6,4); 349 str83:=copy(str8,10,4); 350 end; 351 352 {12.11 11.23 3.23} 353 if (length(GetFieldValue('.',str8,1))=2) and (length(GetFieldValue('.',str8,2))=4) and (length(GetFieldValue('.',str8,3))=3) then 354 begin 355 str81:=copy(str8,1,5); 356 str82:=copy(str8,6,5); 357 str83:=copy(str8,11,4); 358 end; 359 360 361 {1.11 21.23 3.23} 362 if (length(GetFieldValue('.',str8,1))=1) and (length(GetFieldValue('.',str8,2))=4) and (length(GetFieldValue('.',str8,3))=3) then 363 begin 364 str81:=copy(str8,1,4); 365 str82:=copy(str8,5,5); 366 str83:=copy(str8,10,4); 367 end; 368 369 {1.11 21.23 13.23} 370 if (length(GetFieldValue('.',str8,1))=1) and (length(GetFieldValue('.',str8,2))=4) and (length(GetFieldValue('.',str8,3))=4) then 371 begin 372 str81:=copy(str8,1,4); 373 str82:=copy(str8,5,5); 374 str83:=copy(str8,10,5); 375 end; 376 377 378 379 380 end; 381 382 383 if (length(str8)<12) and (trim(str8)<>'---') then {有比分 如果* -腰斩不取} 384 begin 385 str81:= GetFieldValue(':',str8,1); 386 str82:=''; { str82='' 无比分的标志} 387 str83:= GetFieldValue(':',str8,2); 388 if trim(str8)='*' then 389 begin 390 str81:='-1'; 391 str83:='-1'; 392 end; 393 394 end; 395 396 {end 根据str8长度判断 =12 ; >12 ; <12且 <>'---' ; } 397 398 str9:= GetFieldValue(' ',richedit1.Lines.Strings[Row],9) ; {SP} 399 {begin 根据str9长度判断 =12 ; >12 } 400 if length(str9)=12 then 401 begin 402 str91:=copy(str9,1,4); 403 str92:=copy(str9,5,4); 404 str93:=copy(str9,9,4); 405 end; 406 407 if length(str9)>12 then {有大于12的情况 :1.192.1912.19} 408 begin 409 if (length(GetFieldValue('.',str9,1))=1) and (length(GetFieldValue('.',str9,2))=3) and (length(GetFieldValue('.',str9,3))=4) then 410 begin 411 str91:=copy(str9,1,4); 412 str92:=copy(str9,5,4); 413 str93:=copy(str9,9,5); 414 end; 415 {12.111.233.23} 416 if (length(GetFieldValue('.',str9,1))=2) and (length(GetFieldValue('.',str9,2))=3) and (length(GetFieldValue('.',str9,3))=3) then 417 begin 418 str91:=copy(str9,1,5); 419 str92:=copy(str9,6,4); 420 str93:=copy(str9,10,4); 421 end; 422 423 {1.1121.233.23} 424 if (length(GetFieldValue('.',str9,1))=1) and (length(GetFieldValue('.',str9,2))=4) and (length(GetFieldValue('.',str9,3))=3) then 425 begin 426 str91:=copy(str9,1,4); 427 str92:=copy(str9,5,5); 428 str93:=copy(str9,10,4); 429 end; 430 431 end; 432 {end根据str9长度判断 =12 ; >12 } 433 434 {begin 以下取 str10,str11,str12 ,str91,str,92,str93} 435 if length(str9)>=12 then {有比分时的nsp} 436 begin 437 str10:= GetFieldValue(' ',richedit1.Lines.Strings[Row],11); 438 str11:= GetFieldValue(' ',richedit1.Lines.Strings[Row],12); 439 str12:= GetFieldValue(' ',richedit1.Lines.Strings[Row],13); 440 if length(str10)=1 then str10:='-1.0'; 441 if length(str11)=1 then str11:='-1.0'; 442 if length(str12)=1 then str12:='-1.0'; 443 end; 444 445 446 if str9='---' then {有比分时无oz-20130814} 447 begin 448 str91:='-1.0'; 449 str92:='-1.0'; 450 str93:='-1.0'; 451 str10:= GetFieldValue(' ',richedit1.Lines.Strings[Row],11); 452 str11:= GetFieldValue(' ',richedit1.Lines.Strings[Row],12); 453 str12:= GetFieldValue(' ',richedit1.Lines.Strings[Row],13); 454 if length(str10)=1 then str10:='-1.0'; 455 if length(str11)=1 then str11:='-1.0'; 456 if length(str12)=1 then str12:='-1.0'; 457 end; 458 459 if length(str8)>=12 then {无比分nsp} 460 begin 461 str10:= GetFieldValue(' ',richedit1.Lines.Strings[Row],10); 462 str11:= GetFieldValue(' ',richedit1.Lines.Strings[Row],11); 463 str12:= GetFieldValue(' ',richedit1.Lines.Strings[Row],12); 464 if trim(str10)='-' then str10:='-1.0' ; 465 if trim(str11)='-' then str11:='-1.0' ; 466 if trim(str12)='-' then str12:='-1.0' ; 467 end; 468 {end 取 str10,str11,str12 ,str91,str,92,str93} 469 470 if length(str1)>4 then{取比赛日期} 471 g_strdate:=str1; 472 473 {返回各字段到TArr } 474 Result[0]:=g_strdate; 475 Result[1]:=str1; 476 Result[2]:=str2; 477 Result[3]:=str3; 478 Result[4]:=str4; 479 Result[5]:=str5; 480 Result[6]:=str6; 481 Result[7]:=str7; 482 Result[8]:=str81; 483 Result[9]:=str82; 484 Result[10]:=str83; 485 Result[11]:=str91; 486 Result[12]:=str92; 487 Result[13]:=str93; 488 Result[14]:=str10; 489 Result[15]:=str11; 490 Result[16]:=str12; 491 492 if Result[11]='' then Result[11]:='1.0'; 493 if Result[12]='' then Result[12]:='1.0'; 494 if Result[13]='' then Result[13]:='1.0'; 495 if Result[14]='' then Result[14]:='1.0'; 496 if Result[15]='' then Result[15]:='1.0'; 497 if Result[16]='' then Result[16]:='1.0'; 498 499 end; 500 501 function TFxlcj.Caiji_xl_cjoneline(OperNum:integer;Num:integer):integer; //返回 0- 无比分 1-有比分 2-取消 3-其他 502 var rs,i:integer; 503 Ret_Get_bszl,sparr:TArr; 504 fMainMessage,s,strpk,strbf,strypoz,strypsp:string; 505 begin 506 // EnterCriticalSection(CS); 507 rs:=3; 508 setlength(Ret_Get_bszl,18); 509 i:=Num; 510 Ret_Get_bszl:= Get_bszl(1,i); {取每条比赛记录,返回个字段值} 511 512 {取期号,没用到 if ( i>=24) and (i<=24) then 513 begin 514 strno:=GetFieldValue(' ',richedit1.Lines.Strings[i],1); 515 end;} 516 517 if i>=130 then //从网页131行开始取比赛资料 518 begin 519 if length(Ret_Get_bszl[1])=1 then {是比赛记录 将进行:取数-插入bslsz } 520 begin 521 g_IfInsert:=IfInsert_bslsz(Ret_Get_bszl[0],Ret_Get_bszl[3],Ret_Get_bszl[5]); 522 if g_IfInsert<0 then exit; 523 524 if Ret_Get_bszl[9]<>'' then {无比分} 525 begin 526 rs:=0; 527 //SendtoMain(strdate+','+str2+','+str3+','+str4+','+str5+','+str6+','+str7+','+str81+','+str82+','+str83+','+str10+','+str11+','+str12); 528 try 529 if g_IfInsert=0 then 530 s := Format('insert into bslsz (bsrq,xh,bssj,lsmc,zd,rangqiu,kd,sp1,sp2,sp3,xsp1,xsp2,xsp3,qhao) values (%s,%d,%s,%s,%s,%d,%s,%f,%f,%f,%f,%f,%f,%s)', 531 ['#'+Ret_Get_bszl[0]+'#',strtoint(Ret_Get_bszl[2]),quotedstr(Ret_Get_bszl[4]),quotedStr(Ret_Get_bszl[3]),quotedStr(Ret_Get_bszl[5]),strtoint(Ret_Get_bszl[6]),quotedStr(Ret_Get_bszl[7]),strtofloat(Ret_Get_bszl[8]),strtofloat(Ret_Get_bszl[9]),strtofloat(Ret_Get_bszl[10]),strtofloat(Ret_Get_bszl[14]),strtofloat(Ret_Get_bszl[15]),strtofloat(Ret_Get_bszl[16]),Quotedstr(Eqhao.Text)]); 532 g_insertflag:=1; 533 534 except 535 //exit; 536 g_insertflag:=0; 537 SendtoMain('无SP'); 538 end; 539 540 if ( (g_IfInsert>0) and (OperNum=0)) or (OperNum=1) then {无比分,更新最新xsp--重新初始化 } 541 Update_sp(Ret_Get_bszl[0],Ret_Get_bszl[3],Ret_Get_bszl[5],Ret_Get_bszl[8],Ret_Get_bszl[9],Ret_Get_bszl[10],Ret_Get_bszl[14],Ret_Get_bszl[15],Ret_Get_bszl[16],OperNum); {修改xsp1,xsp2,xsp3} 542 543 {OperNum=1 无比分,更新最新xsp--盘中 } 544 {修改xsp1,xsp2,xsp3} 545 end; 546 547 548 if Ret_Get_bszl[9]='' then {有比分} 549 begin 550 rs:=1; 551 try 552 strpk:= Return_pank(strtoint(Ret_Get_bszl[6]),strtoint(Ret_Get_bszl[8]),strtoint(Ret_Get_bszl[10])); 553 strbf:= Return_bf(strtoint(Ret_Get_bszl[8]),strtoint(Ret_Get_bszl[10])); 554 except 555 SendtoMain('errcode:2,'+Ret_Get_bszl[5]); 556 exit; 557 end; 558 559 //SendtoMain(Ret_Get_bszl[0]+','+Ret_Get_bszl[2]+','+Ret_Get_bszl[3]+','+Ret_Get_bszl[4]+','+Ret_Get_bszl[5]+','+Ret_Get_bszl[6]+','+Ret_Get_bszl[7]+','+Ret_Get_bszl[8]+':'+Ret_Get_bszl[10]+','+Ret_Get_bszl[11]+','+Ret_Get_bszl[12]+','+Ret_Get_bszl[13]+','+Ret_Get_bszl[14]+','+Ret_Get_bszl[15]+','+Ret_Get_bszl[16]+strpk+','+strbf); 560 fMainMessage:=Ret_Get_bszl[2]+' '+Ret_Get_bszl[3]+' '+Ret_Get_bszl[5]+'--'+Ret_Get_bszl[7]+' '+Ret_Get_bszl[8]+':'+Ret_Get_bszl[10]+' '+strpk+','+strbf; 561 SendtoMain(fMainMessage); 562 if g_IfInsert=0 then 563 try 564 565 s := Format('insert into bslsz (bsrq,xh,bssj,lsmc,zd,rangqiu,kd,zdrq,kdrq,sp1,sp2,sp3,xsp1,xsp2,xsp3,pjg,bfjg,qhao) values (%s,%d,%s,%s,%s,%d,%s,%d,%d,%f,%f,%f,%f,%f,%f,%s,%s,%s)', 566 ['#'+Ret_Get_bszl[0]+'#',strtoint(Ret_Get_bszl[2]),quotedstr(Ret_Get_bszl[4]),quotedStr(Ret_Get_bszl[3]),quotedStr(Ret_Get_bszl[5]),strtoint(Ret_Get_bszl[6]),quotedStr(Ret_Get_bszl[7]),strtoint(Ret_Get_bszl[8]),strtoint(Ret_Get_bszl[10]),strtofloat(Ret_Get_bszl[11]),strtofloat(Ret_Get_bszl[12]),strtofloat(Ret_Get_bszl[13]),strtofloat(Ret_Get_bszl[14]),strtofloat(Ret_Get_bszl[15]),strtofloat(Ret_Get_bszl[16]),quotedStr(strpk),quotedStr(strbf),Quotedstr(Eqhao.Text)]); 567 568 except 569 showmessage('e:'+s); 570 exit; 571 end; 572 573 if g_IfInsert>0 then 574 begin 575 setlength(sparr,13); 576 sparr:=Bslsz_sp(Ret_Get_bszl[0],Ret_Get_bszl[3],Ret_Get_bszl[5]); { sp1,nsp1,sp2,nsp2,sp3,nsp3,xsp1,nxsp1,xsp2,nxsp2,xsp3,nxsp3} 577 //SendtoMain(sparr[0]); 578 if strpk='赢' then {取最新SP 如果数据库最新 sp 或欧指为-1.0 取网页最新值 2013-7-30 } 579 begin strypoz:=Ret_Get_bszl[11]; strypsp:=Ret_Get_bszl[14]; end; 580 581 582 if strpk='平' then 583 begin strypoz:=Ret_Get_bszl[12]; strypsp:=Ret_Get_bszl[15]; end; 584 585 if strpk='负' then 586 begin strypoz:=Ret_Get_bszl[13]; strypsp:=Ret_Get_bszl[16]; end; 587 588 if strpk='取消' then 589 begin rs:=2;strypoz:='-1.0'; strypsp:='-1.0'; end; {2013-11-4增加,否则Update_bslsz 无数据,出错} 590 591 592 try 593 Update_bslsz(Ret_Get_bszl[0],Ret_Get_bszl[3],Ret_Get_bszl[5],strtoint(Ret_Get_bszl[8]),strtoint(Ret_Get_bszl[10]),strpk,strbf,strypsp,strypoz); 594 except 595 SendtoMain('errcode:update_bslsz'+strypsp+','+strypoz); 596 exit; 597 end; 598 end; 599 end; 600 601 if g_IfInsert=0 then 602 Insert_bslsz(s); 603 end;{插入结束} 604 // RichEdit1.SelLength := 0; //恢复选择 605 606 end; 607 result:=rs; 608 // LeaveCriticalSection(CS); 609 end;
最新发布
11-16
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值