0

次の関数があります。これは、検索しているテキストが最初に出現した位置を返す必要があります。問題:

  • -1 を返します
  • ドキュメント コンテンツ全体を範囲として使用している場合 (またはドキュメント コンテンツの境界を含む範囲を使用している場合)、AV-s をスローします。

私が何をした:

  • 問題の原因、またはこのコードの代替を見つけるために、多くの Google 検索を行います。
  • 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 タグを削除する必要がありますが、次のひねりがあります: b、i、u、s、strong などの書式設定タグに遭遇した場合、iそれらを削除し、それに応じてテキストをフォーマットする必要があります)

4

1 に答える 1

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;

于 2012-10-11T20:43:59.880 に答える