2010-04-09 2 views
2

Application.ProcessMessages를 사용하지 않고 MSHTML 문서를로드하는 다른 방법이 있습니까?Application.ProcessMessages를 사용하지 않고 MSHTML 문서를로드하는 다른 방법이 있습니까?

는 IHTMLDocument에 문서를로드하기 위해 나는이 작업을 수행해야합니다

내가 즉, 내 응용 프로그램의 흐름을 변경하는 것 때문에 나는, 로딩 동안 모든 메시지 큐를 처리하지 않도록 할
while Doc.readyState <> 'complete' do 
    Application.ProcessMessages; 

, 로드가 완료되기 전에 처리되어야하는 일부 메시지는로드가 끝나기 전에 조기에 처리 될 수 있습니다.

로드 프로세스에서 IHTMLDocument가 앞으로 나아갈 것으로 기대되는 특별한 메시지 코드가 있습니까? 아니면 다른 방법으로로드 할 수 있습니까?

+0

감사합니다. –

답변

6

Application.ProcessMessages를 호출하면 MSHTML activeX 컨트롤 시간이 문서로드를 완료하는 데 필요한 것일 수 있습니다. 백그라운드에서 문서로드를 시뮬레이션하기 위해 여기에서 협업 멀티 태스킹을 사용하는 것 같습니다. ActiveX는 다음 청크를 처리하기 위해 메시지를 게시합니다.

일반적으로 정상적인 메시지 루프의 일부로 문서로드가 발생하므로 앱의 흐름에 영향을 미치지 않습니다. 그러나 문서를 동 기적으로로드하려는 경우 (문서가 완전히로드 될 때까지 아무 작업도 수행하지 않음) 메시지를 통해 백그라운드로드를 수행하는 방식에 민감합니다.

한 가지 해결책 : 문서를 동 기적으로로드해야하는 요구 사항을 제거 할 수 있는지 확인하십시오. 로드가 발생하면로드가 발생하도록하고 readState = complete에 대한 점검을 타이머로 이동 시키십시오 (아마도 1 초 간격으로). 타이머가 문서로드가 완료된 것을 발견하면 다운 스트림 먹이 사슬 활동을 시작하십시오.

다른 해결책 : 문서가로드 될 때까지 기다리는 동안 모달 대화 상자를 표시합니다. 재 입력의 위험을 감수하지 않도록 나머지 UI를 비활성화하는 이점이 있습니다. ProcessMessages를 호출하면 사용자가 여전히 창과 상호 작용할 수 있고, 버튼, 메뉴 등을 클릭 할 수 있다는 것을 의미합니다. 일반적으로 문제가 발생합니다. 모달 대화 상자 ("진행 대화 상자")를 표시하면 모달 대화 상자 뒤에있는 모든 것을 비활성화하여 재진입을 피할 수 있습니다.

세 번째 가능성 : Application.ProcessMessages를 PeekMessage 및 논리로 바꿔서 메시지를 검사하여 나중에 다시 사용할 수 있도록 메시지 대기열에 넣을 지 또는 다시 넣을 지 결정하십시오. 이것은 약간 더럽지 만 매우 특별한 경우에 적용될 수 있습니다.

나는 모달 대화 상자 # 2를 권장합니다.

+0

+1 approch # 2도 동의합니다. –

+0

대부분의 경우 # 2가 최상의 솔루션이라고 생각합니다. 하지만 초당 여러 개의 문서를 처리해야 할 때 성능이 많이 떨어집니다. 그래서 세 번째 가능성을 따르지만 TApplicationEvents 구성 요소를 사용하고 키보드와 마우스의 메시지는 무시합니다. 잘 작동했습니다. Very tks. –

+0

모달 대화 상자를 사용하는 경우에도 문제가 발생하는 WM_TIMER와 같은 다른 메시지가있을 수 있습니다. 이는 응용 프로그램이 IE가로드를 완료하기를 기다리는 동안 의도하지 않은 상태로 만들 수 있기 때문입니다. –

3

성분 TEmbeddedWB 직접 MSHTML 제어에 문서를로드와 같은 LoadFromFile LoadFromStream 같은 헬퍼 기능을 포함한다. 전체 논리를 onDocumentComplete 이벤트로 이동하십시오.

+0

링크가 깨졌습니다. –

+0

은 http://www.bsalsa.com/downloads.html이어야합니다. – skamradt

+0

서버가 응답하지 않습니다. TWebBrowser를 직접 사용하기 전에 TEmbbeddedWB를 사용한다고 생각했지만 액세스 할 수 없었습니다. –

1

문서로드가 완료되면 발동되는 TEmbeddedWB.OnDocumentComplete 이벤트가 있습니다. 왜 그걸 사용하고 싶지 않은 특별한 이유가 있습니까?

+0

서버가 응답하지 않습니다. TWebBrowser를 직접 사용하기 전에 TEmbbeddedWB를 사용한다고 생각했지만 액세스 할 수 없었습니다. –

+0

TWebBrowser는 동일한 이벤트를가집니다. 서버가 응답하지 않더라도 브라우저에 대한 문서 완료 이벤트가 있습니다. – r4w8173

관련 문제