2010-03-20 4 views
0

전체 HTML을 MSHTML로 설정하는 방법은 무엇입니까?전체 HTML을 MSHTML로 설정하는 방법은 무엇입니까?

나는이 할당 사용하려합니다 :

(Document as IHTMLDocument3).documentElement.innerHTML := 'abc'; 

을하지만 난 오류가있어 : 나는 또한

(Document as IHTMLDocument2).write 

를 사용하려고했습니다

"Target element invalid for this operation"

을하지만,이 양식은 HTML을 추가 본문 섹션에, 그리고 모든 HTML 소스를 교체해야합니다.
누군가이 작업을 어떻게 수행하는지 알고 있습니까?

미리 감사드립니다.

답변

1

여기 당신이 도움이된다면 내 예전의 코드 중 일부는 볼 수있다 : 웹 브라우저 주위 확장 래퍼 및 제공 방법을 사용하는 몇 가지 쉬운을 가지고 당신은 또한 TEmbededWB를 사용할 수있는 대안으로

type 
    THackMemoryStream = class(TMemoryStream); 

procedure Clear(const Document: IHTMLDocument2); 
begin 
    Document.write(PSafeArray(VarArrayAsPSafeArray(VarArrayOf([WideString('')])))); 
    Document.close; 
end; 

procedure LoadFromStream(const Document: IHTMLDocument2; Stream: TStream); 
var 
    Persist: IPersistStreamInit; 
begin 
    Clear(Document); 
    Persist := (Document as IDispatch) as IPersistStreamInit; 
    OleCheck(Persist.InitNew); 
    OleCheck(Persist.Load(TStreamAdapter.Create(Stream))); 
end; 

procedure SetHtml(const Document: IHTMLDocument2; const Html: WideString); 
var 
    Stream: TMemoryStream; 
begin 
    Stream := TMemoryStream.Create; 
    try 
    THackMemoryStream(Stream).SetPointer(PWideChar(Html), (Length(Html) + 1) * SizeOf(WideChar)); 
    Stream.Seek(0, soFromBeginning); 
    LoadFromStream(Document, Stream); 
    finally 
    Stream.Free; 
    end; 
end; 
+0

탁신. 완벽하게 작동했습니다. –

+0

문서를 삭제하는 올바른 방법은 대신 'about : blank'(으)로 이동하는 것입니다. –

+0

Navigate의 문제점은 비동기 적이므로 적절한 이벤트 핸들러를 기억/교체하고 나중에 kludgy로 복원해야한다는 것입니다. 나는 위의 Clear 절차를 광범위하게 테스트하지 않았다는 것을 인정합니다. 문제가 있습니까? 대안은 빈 (또는 최소한의 HTML 문자열) 스트림에서로드하는 것일 수 있습니다. –