程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> 從OleContainer學到的東西

從OleContainer學到的東西

編輯:.NET實例教程
從OleContainer學到的東西

最近在寫一個東西,裡面牽涉到了嵌入word的功能,打開word,得到word的文檔結構圖,實現Word中
文檔結構圖類似的功能(跳轉到當前標題),還有把Word轉換成PDF,最後把PDF文件Base64加密變成字符串存儲在XML中。

(1)由於要嵌入到程序中,所以用到了oleContianer,但是這個東西用起來真是有一番曲折,開始的時候打開文件直接用CreateObjectFromFile,但是在某些情況下(文件有一些修改存檔)有的文件打開會有問題,具體原因不明,經過多方嘗試,終於解決這個問題,方案就是從流中把文件讀到olecontianer,完整的方法如下:
type
  //流Header的結構
  TStreamHeader = record
    Signature: Integer;    //$434F4442
    DrawASPect: Integer;   //1
    DataSize: Integer;     //stream.size;
  end;

procedure LoadFromFile(const AFileName: string; Container: TOleContainer);
var
  Header : TStreamHeader;
  oMemoryStream : TMemoryStream;
  oFileStream: TFileStream;
begin
  oFileStream := TFileStream.Create(AFileName, fmShareDenyNone);
  oMemoryStream := TMemoryStream.Create;
  try
    with Header do
    begin
      Signature := $434F4442;
      DrawASPect := 1;
      DataSize := oFileStream.Size;
    end;
    oFileStream.Position := 0;
    oMemoryStream.WriteBuffer(Header,SizeOf(Header));
    oMemoryStream.CopyFrom(oFileStream, 0);
    oMemoryStream.Position := 0;
    Container.LoadFromStream(oMemoryStream);
  finally
    oMemoryStream.Free;
    oFileStream.Free;
  end;
end;
這裡要注意的就是olecontainer要求的流結構比普通的流多一個Header,要加上這個Header才可以!
(2)加載以後,由於olecontianer本身並沒有對word的相關操作,那麼我們需要操作Word,應該怎麼辦?一種辦法就是使用Delphi中提供的TWordApplication,代碼大概如下:
WordApplication.Connect或者
WordApplication.ConnectTo(IDispatch(OleContainer.OleObject.Application) as _Application)
我開始的時候就是用這個,但是後來在一台機器上出現問題了,這台機器以前裝過word2000,現在裝的word2003,跑這個程序就有問題了,總是在上面那行代碼出錯''Interface not Supported'',我是想了很多辦法,都沒有搞定,比如可能是word版本的問題,於是就是Word重新卸載,把Office相關的注冊表全部刪除,重新安裝Office,還是沒有用;又把Delphi重新安裝,Delphi安裝的時候要選擇Office版本,我是XP和2000的都交叉的試過了,還是不行;然後又上網狂搜索,可惜網上針對我這個問題的信息不多。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved