|
세즈 님이 쓰신 글 :
: 인터넷 브라우져를 올려놓고
: Navigate 함수를 사용하여 페이지를 띄우고
: 그 띄운 결과에서 소스값을 받아서 데이터 처리를 하려고 합니다.
: 띄운 결과에서 소스값이 나올려면 페이지가 다 뜬뒤에 소스를 받아서 연산처리를 거쳐 특정 값을 줘야만 하는데...
: 이노무 것이 페이지가 다 뜨지도 않았는데 소스를 받으려고 하고 연산처리까지 빈 값으로 해버리더군요.
: 이같은경우 wait 이라든지 다른 뭔가가 방법이 있을듯 한데요.
: 혹시 이러한 문제를 해결하는 방법을 아시는분 계신가요???
:
:
:
:
: Memo1->Text = ""; //Memo1 Data Clear!!!
: CppWebBrowser1->Navigate(url);
:
: //요기 사이에 뭔가 들어가던가 해야될듯한데...
:
: if(Memo1->Text.SubString(1,5)=="data=")
: {
: NewNode->SubItems->Add(Get_nlevel(Memo1->Text.SubString(7,8)));
: //ShowMessage("nlevel");
: NewNode->SubItems->Add(Get_ntemp(Memo1->Text.SubString(7,8)));
: //ShowMessage("ntemp");
:
:
: void __fastcall TDeviceForm::CppWebBrowser1DocumentComplete(
: TObject *Sender, LPDISPATCH pDisp, Variant *URL)
: {
: Edit1->Text = CppWebBrowser1->LocationURL;
: IDispatch *Document;
: //err
: Document = CppWebBrowser1->Document;
: IHTMLElement *HTMLElement;
: IHTMLDocument2 *pHTMLDocument;
: HRESULT hr;
:
: WideString HTML;
: WideString Text;
: hr = Document->QueryInterface(IID_IHTMLDocument2,(void**)&pHTMLDocument );
: if ( hr == S_OK )
: {
: hr = pHTMLDocument->get_body(&HTMLElement);
: if ( hr == S_OK )
: {
: HTMLElement->get_innerHTML(&HTML);
: HTMLElement->get_innerText(&Text);
: HTMLElement->Release();
: }
: pHTMLDocument->Release();
: }
: Memo1->Lines->Clear();
: Memo1->Lines->Add(HTML);
: }
그러니까, 프레임으로 나누어진 문서의 경우 각 프레임마다 OnDocumentComplete 이벤트가 발생합니다.
각 프레임마다 OnDocumentComplete 이벤트가 발생하는데 pDisp의 값은 각 프레임의 IDispatch입니다.
다만, 마지막으로 OnDocumentComplete가 발생하는 프레임의 경우, pDisp의 값이 해당 프레임의 IDispatch가 아니고 TCppWebBrowser의 IDispatch가 됩니다.
프레임이 없는 경우는 한 번 발생하는데 pDisp의 값은 TCppWebBrowser의 IDispatch가 됩니다.
따라서, 이 두 IDispatch 포인터 값을 비교하면 됩니다.
빌더의 도움말에 나와있는 아래 예제를 참고하세요.
This example shows how to detect when a document is completely loaded, even if it includes multiple frames. Only the final OnDocumentComplete event passes the same Dispatch interface as the OnNavigateComplete event handler.
_di_IDispatch CurDispatch = NULL; // save the interface globally ;전역 변수로 선언/정의
void __fastcall TForm1::CppWebBrowser1NavigateComplete2(TObject *Sender, const _di_IDispatch pDisp, OleVariant &URL)
{
if (!CurDispatch)
CurDispatch = pDisp; // save for comparison ; OnDocumentComplete 이벤트 핸들러에서 비교하기 위함
}
void __fastcall TForm1::CppWebBrowser1DocumentComplete(TObject *Sender, const _di_IDispatch pDisp, OleVariant &URL)
{
if (pDisp == CurDispatch)
{
//님의 코드에서 : CppWebBrowser1->Navigate(url); 다음에 이어지는 내용을 이곳으로 이동.
Beep(); // the document is loaded, not just a frame ;문서 전체가 로드됐음
CurDispatch = NULL; //clear the global variable ; 다음 번 Navigate를 위해 초기화
}
}
|