我使用idhttp下载网页,并放入数据库。用IHTMLdocument2对网页做解析,因为要循环嘛,就是这样
doc :=coIHTMLdocument.create as IHTMLdocument2;
while not adoquery1.eof do
shtml := adoquery1.fieldbyname('html').asstring;
sethtml(doc,shtml);//把shtml置放入IHTMLdocument2
do parse html
adoquery1.next
end;//while然而问题出来了,sethtml()之后立即解析网页,网页都是空白的!做如下修改时也同样:
sethtml(doc,shtml);
while doc.busy do;加上调试语句:
memo1.text := shtml;
sethtml(doc,shtml);
while doc.busy do;
caption := inttostr(doc.readystatus);//这时显示为1:READY_LOADING
memo2.text := doc.body.outHTML;      //memo2.text总是空再加上语句:
sethtml(doc,shtml);
while doc.busy do;
caption := inttostr(doc.readystate);//这时显示为1:READYSTATE_LOADING
while doc.busy=READYSTATE_COMPLETE do;程序进入了死循环,永远等不到READYSTATE_COMPLETE!
然而,如果在BUTTON1click做sethtml(doc,shtml),BUTTON2click做分析:
procedure Tfrmmain.Button1Click(Sender: TObject);
begin
   setHTMLdoc(doc, memo1.Text);
end;
procedure Tfrmmain.Button2Click(Sender: TObject);
begin
   memo2.Text := doc.body.outHTML; //此时得到与memo1.Text相同的内容
end;细想之下,是IHTMLDocument2是一个COM,它可能在等待某个消息之后才做内部处理。但如果要回到消息循环后才能继续循环,这个循环如何做下去?COM对象可真够累人!