2012-10-11 67 views
0

我有以下函數,它應該返回我正在搜索的文本的第一個出現的位置。 問題:在OLE的Word文檔中查找不起作用

  • 返回-1
  • 拋出AV-S,當我使用整個文檔內容爲一個範圍(或使用與所述文檔內容的邊界的範圍)

我做了什麼:

  • 大量的谷歌搜索,找到問題的根源,或替代該代碼
  • MSDN挖
  • 試驗和錯誤

下面是代碼:

function FindTextWord(wordApp: TWordApplication; afindText: OleVariant; startIndex, endIndex: Integer; findEndOffsetFast: Boolean): Integer; 
var 
    matchCase  : OleVariant; 
    matchWholeWord : OleVariant; 
    matchWildcards : OleVariant; 
    matchSoundsLike : OleVariant; 
    matchAllWordForms: OleVariant; 
    fWd   : OleVariant; 
    wrap    : OleVariant; 
    format   : OleVariant; 
    replaceWith  : OleVariant; 
    replace   : OleVariant; 
    myRange   : Range; 
    startSearchOffset: OleVariant; 
    endSearchOffset : OleVariant; 
begin 
    WordApp.Selection.Start := 0; 
    WordApp.Selection.End_ := 0; 
    result:=-1; 
    try 
    if (Assigned(WordApp)) then 
    begin 

     if (startIndex<1) then 
     begin 
     WordApp.ActiveDocument.GrammarChecked:=true; 
     WordApp.ActiveDocument.SpellingChecked:=true; 
     WordApp.ActiveDocument.ShowGrammaticalErrors:=false; 
     WordApp.ActiveDocument.ShowSpellingErrors:=false; 
     startSearchOffset:=WordApp.ActiveDocument.Content.Start; 
     end else 
     begin 
     startSearchOffset:=startIndex; 
     end; 

     if (endIndex<1) then 
     begin 
     if (findEndOffsetFast)or(startIndex<1) then 
     begin 
      endSearchOffset:=WordApp.ActiveDocument.Content.End_; 
     end else 
     begin 
      endSearchOffset:=startSearchOffset+1; 
      WordApp.Selection.Start:=startSearchOffset; 
      while (WordApp.Selection.Start=startSearchOffset)and(endSearchOffset<WordApp.ActiveDocument.Content.End_)and(endSearchOffset-startSearchOffset<4000) do 
      begin 
      endSearchOffset:=endSearchOffset+1; 
      WordApp.Selection.End_:=endSearchOffset; 
      end; 

      endSearchOffset:=endSearchOffset-1-Length(afindText); 
     end; 

     end else 
     begin 
     endSearchOffset:=endIndex; 
     end; 

     myRange:=WordApp.ActiveDocument.Range(startSearchOffset,endSearchOffset); 
     myRange.Find.ClearFormatting; 
     myRange.Start:=Integer(startSearchOffset); 
     myRange.End_:=Integer(endSearchOffset); 


     MatchCase := False; 
     MatchWholeWord := TRUE; 
     MatchWildcards := False; 
     MatchSoundsLike := False; 
     MatchAllWordForms := False; 
     fWd := True; 
     Wrap := wdFindStop; 
     Format := False; 
     ReplaceWith := ''; 
     Replace := wdReplaceNone; 

     if MyRange.Find.Execute(aFindText,MatchCase,MatchWholeWord, 
         MatchWildcards,MatchSoundsLike, 
         MatchAllWordForms,fWd, 
         Wrap,Format,ReplaceWith,Replace) 
     then begin 
     if (myRange.Start>=startSearchOffset) then 
     begin 
      if (myRange.Find.Found) then 
      begin 
      result:=myRange.Start; 
      end; 
     end else 
     begin 
      result:=FindTextWord(wordApp,afindText,startIndex,endIndex,false); 
     end; 
     end; 
    end; 
    except 
    end; 
end; 

更新

問題不替換文本(我必須消除可能出現在所有的HTML標籤在word文檔中,但有以下幾點:如果我遇到格式化標籤,比如b,i,u,s,strong等,我必須刪除它們並相應地設置文本格式)

回答

0

這裏的一些老的Delphi 7代碼,可以幫助:

PROCEDURE TFrmBuildReport.WordGlobalReplace(Orig,Repl: String); 
VAR VOrigText,vReplText,vReplWhat: OleVariant; 
BEGIN 
    VOrigText := Orig; 
    VReplText := Repl; 
    vReplWhat := wdReplaceAll; 
    WAppl.ActiveDocument.Content.Find.ClearFormatting; 
    WAppl.ActiveDocument.Content.Find.Replacement.ClearFormatting; 
    WAppl.ActiveDocument.Content.Find.Execute(VOrigText,vE,vE,vE,vE,vE,vE,vE,vE,VReplText,vReplWhat); 
END; { WordGlobalReplace } 

與VE爲= EmptyParam這樣;

+1

這個問題與「替換」文本無關,這就是你的代碼片斷所做的。它也缺少'vE'的聲明。 –

+0

+1 Ken, 問題不在於替換文本(我必須刪除可能出現在word文檔中的所有HTML標籤,但是以下轉折:如果我遇到格式標籤,例如b,i,u,s,強壯等等,我必須刪除它們並相應地設置文本格式) – beerwin