2012-10-11 9 views
0

J'ai la fonction suivante, qui devrait retourner la position de la première occurrence du texte que je recherche. Le problème:Rechercher dans le document Word avec OLE ne fonctionne pas

  • retourne -1
  • lance AV-s, quand je suis en utilisant tout le contenu du document en tant que gamme (ou en utilisant une gamme avec les limites du contenu du document)

Qu'ai-je fait:

  • Beaucoup de recherches Google, pour trouver la source du problème, ou des solutions de rechange à ce code
  • MSDN creuser
  • tâtonnement

Voici le code:

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; 

Mise à jour

Le problème ne remplace pas le texte (je dois supprimer toutes les balises HTML qui peuvent apparaître dans le document Word, mais avec la torsion suivante: si je rencontre des balises de mise en forme, telles que b, i, u, s, fort, et autres, je dois les supprimer et mettre en forme le texte en conséquence)

Répondre

0

Voici quelques ancien code Delphi 7 qui peut aider:

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 } 

avec vE: = EmptyParam;

+1

La question n'a rien à voir avec le "remplacement" du texte, ce que fait votre fragment de code. Il manque également une déclaration pour 'vE'. –

+0

+1 Ken, Le problème ne remplace pas le texte (je dois supprimer toutes les balises HTML qui peuvent apparaître dans le document Word, mais avec la torsion suivante: si je rencontre des balises de formatage, telles que b, i, u, s, fort, et semblable, je dois les enlever et formater le texte en conséquence) – beerwin

Questions connexes