2009-07-25 1 views
1

델파이의 THtmlViewer 구성 요소 안에 표시 할 유니 코드 .html 파일이 있습니다.PBear의 THtmlViewer를 유니 코드 HTML 파일 로딩하고 표시하는 방법은 무엇입니까?

'.LoadFromFile'을 수행하는 코드를 설득하는 것처럼 보이지 않습니다. 먼저 유니 코드 파일을 스트림으로로드 한 다음 어떻게 든 변환해야합니까? 델파이 2007

, 내가 전에, 유니 코드 파일 또는 THtmlViewer와 아무 짓도하지 한

THtmlViewer의 v9.45.

+0

왜 "유니 코드"html 파일이 있습니까? UTF-16/UCS-2 인코딩 (http://en.wikipedia.org/wiki/UCS-2)에 파일이 있다는 것을 의미한다고 가정합니다. 생성하는 응용 프로그램을 UTF-8 인코딩으로 변경하는 것이 훨씬 낫습니다. [일반적인 관찰, 나는'THtmlViewer'에 대해서는 아무런 경험이 없습니다.] – mghie

+0

@mghie - 관측에 감사드립니다. 그것들은 UTF-16 파일입니다. 왜냐하면 그것들을 생성하는 프로그램이 (내 제어 밖에있는) 그것들을 출력하고 있기 때문입니다. 그래서 나는 그 순간에 붙어 있습니다. 비록 제가 프로젝트의 세대 부분을 인수 할 수 있고 출력 포맷을 적절히 제어 할 수 있기를 희망합니다. – robsoft

답변

1

는 좋아요, 여기에 내가 무엇을 최대 온의 배짱이다. 건설적인 비평과 관찰이 감사합니다!

 
// load either an ansi or unicode-type html doc into the browser component. 
// the filename has already been confirmed as an existing file 
procedure TfrmBrowser.LoadDocument(FFileName:string); 
var 
    FWideText : Widestring; 
    FAnsiText : AnsiString; 
    FRequiredLen : Integer; 
    FFileStream : TFileStream; 
    FMemStream : TMemoryStream; 
    FBuffer : Byte; 
begin 
    FFileStream := TFileStream.Create(FFileName, fmOpenRead or fmShareDenyNone); 
    // anything less than half a dozen bytes would be pointless, but... 
    if FFileStream.Size>1 then 
    begin 
    // checking the first byte of the file to give us a clue about file-type 
    FFileStream.Read(FBuffer,1); 
    FFileStream.Position:=0; // rewind position 
    if (FBuffer=$FF) or (FBuffer=$EF) then 
    begin 
     // probably Unicode 
     FRequiredLen := FFileStream.Size div 2; // 2 bytes per char 
     SetLength(FWideText, FRequiredLen); 
     FFileStream.Read(FWideText[1], FFileStream.Size); 
     // cast it into an Ansistring 
     FAnsiText := FWideText; 
     FMemStream := TMemoryStream.Create; 
     FMemStream.Write(FAnsiText[1], FRequiredLen); 
     FMemStream.Position := 0; // rewind the position 
     // load the stream into the THtmlViewer 
     vwBrowse.LoadFromStream(FMemStream); 
     FMemStream.Free; 
    end 
    else 
    begin 
     // probably Ansi, just load original filestream in 
     vwBrowse.LoadFromStream(FFileStream); 
    end; 
    FFileStream.Free; 
    end; 

분명히 몇 가지 오류 트래핑이 누락되었지만 이것이 기본 아이디어입니다.

1

당신은 델파이 프로그래밍에서 유니 코드 시대의 시작하기 전에의 델파이 2007을 사용하고 있습니다! 이 델파이의 초기 버전에서 유니 코드 작업을하는 것은 매우 귀찮은이지만

, 일부 컨트롤, 특히 THtmlView 구성 요소에서 만족스러운 결과를 달성하는 것은 매우 가능하다.

//code to toggle source or WYSIWYG views 
var 
    htmEd: IHTMLDocument2; 
begin 
    htmEd := HtmlEdit.Document as IHtmlDocument2; 
    if ToggleTabSet.TabIndex = 0 then 
    begin 
    HtmlEditContainer.PageIndex := 0; // Tab sheet index 
    htmEd.body.innerHTML := Memo1.Lines.Text; // TTntMemo 
    pnlEditorState.Caption := 'Design View'; 
    end 
    else 
    if ToggleTabSet.TabIndex = 1 then 
    begin 
     HtmlEditContainer.PageIndex := 1; 
     Memo1.Lines.Text := HtmEd.body.innerHTML; 
     pnlEditorState.Caption := 'Source View'; 
    end; 

위의 코드 당신은 내가 HTML 파일이 처음로드되는에 TTntMemo 구성 요소를 사용하고 있음을 알 수 읽기 :

나는 내 프로그램 중 하나에서 일부 코드 예제를 게시 할 수 있습니다. 그런 다음 HtmlView의 'body.innerHTML'속성에 메모의 'Text'를로드합니다.

htmEd.body.innerHTML := Memo1.Lines.Text; 

:

  1. TntWare의 'Memo1.Lines.Text;' WideString 유형입니다.
  2. 'IHTMLDocument2'는 TEmbeddedWB에서 가져옵니다. 이유를 참조하십시오 why TEmbeddedWB is good?

저도 초기에 저에게 도움이되었습니다. 필자는 Delphi 2009로 전환했으며, 파일을로드하는 동안 적절한 TEncoding을 설정하는 것이 훨씬 쉽습니다!

+0

감사합니다 올라프, 재미 있어요. 나는 전에 TTntMemo (etc) 또는 TEmbeddedWB를 보지 못했습니다.THTMLViewer에서 작동하는 무언가를 얻을 수 있었지만 그 솔루션을 사용하면 나에게 인쇄 (PDF 파일에 메타 파일로서의 브라우저보기의 다이얼로그가없는 인쇄)가 훨씬 더 많이 제어되었습니다. TWebBrowser에서 출력물을 채우는 악몽을 꾸미고있었습니다. 나는 시간이있을 때 더 자세히 볼 수 있도록 두 구성 요소를 북마크 할 것입니다 - 많은 감사합니다! – robsoft

+0

@robsoft : 천만에! – Olaf

+0

@robsoft : 필자는 TWebBrowser에서 인쇄물을 제어하는 ​​악몽을 꾸미고있었습니다. << 사용자가 만든 메서드 나 평범한 오래된 'HtmlEdit.PrintPreView;'를 사용하고 있습니까? IE 자체의 기성 인쇄 미리보기의 이점을 제공합니다! – Olaf

2

참고로, THTMLViewer 적극적으로 (마지막 전에 몇 분을 커밋) 구글 코드를 유지 : http://code.google.com/p/thtmlviewer/

D6-DXE2와 나사로의 호환성은 "원래"(9.45) 버전에서 수정 및 개선의 톤.

+0

정보 주셔서 감사합니다 - 매우 유용합니다! – robsoft

관련 문제