Newsgroup: it.comp.lang.delphi
Titolo: Sostituire testo in Ms Word

Ho trovato su Torry una bellissima procedura che serve per sostituire 
una stringa in un documento Word con un'altra passata per parametro.
Tutto funziona perfettamente, ma non con le stringhe più lunghe di n
caratteri (forse 255). Qualcuno può dirmi come posso fare per fargliele
accettare?
Riporto di seguito il codice di Torry:
uses 
  ComObj; 
// Replace Flags 
type 
  TWordReplaceFlags = set of (wrfReplaceAll, wrfMatchCase,
wrfMatchWildcards);
function Word_StringReplace(ADocument: TFileName; SearchString,
ReplaceString: string; Flags: TWordReplaceFlags): Boolean;
const 
  wdFindContinue = 1; 
  wdReplaceOne = 1; 
  wdReplaceAll = 2; 
  wdDoNotSaveChanges = 0; 
var 
  WordApp: OLEVariant; 
begin 
  Result := False; 
  { Check if file exists } 
  if not FileExists(ADocument) then 
  begin 
    ShowMessage('Specified Document not found.'); 
    Exit; 
  end; 
  { Create the OLE Object } 
  try 
    WordApp := CreateOLEObject('Word.Application'); 
  except 
    on E: Exception do 
    begin 
      E.Message := 'Word is not available.'; 
      raise; 
    end; 
  end; 
  try 
    { Hide Word } 
    WordApp.Visible := False; 
    { Open the document } 
    WordApp.Documents.Open(ADocument); 
    { Initialize parameters} 
    WordApp.Selection.Find.ClearFormatting; 
    WordApp.Selection.Find.Text := SearchString; 
    WordApp.Selection.Find.Replacement.Text := ReplaceString; 
    WordApp.Selection.Find.Forward := True; 
    WordApp.Selection.Find.Wrap := wdFindContinue; 
    WordApp.Selection.Find.Format := False; 
    WordApp.Selection.Find.MatchCase := wrfMatchCase in Flags; 
    WordApp.Selection.Find.MatchWholeWord := False; 
    WordApp.Selection.Find.MatchWildcards := wrfMatchWildcards in Flags;
    WordApp.Selection.Find.MatchSoundsLike := False; 
    WordApp.Selection.Find.MatchAllWordForms := False; 
    { Perform the search} 
    if wrfReplaceAll in Flags then 
      WordApp.Selection.Find.Execute(Replace := wdReplaceAll) 
    else 
      WordApp.Selection.Find.Execute(Replace := wdReplaceOne); 
    { Save word } 
    WordApp.ActiveDocument.SaveAs(ADocument); 
    { Assume that successful } 
    Result := True; 
    { Close the document } 
    WordApp.ActiveDocument.Close(wdDoNotSaveChanges); 
  finally 
    { Quit Word } 
    WordApp.Quit; 
    WordApp := Unassigned; 
  end; 
end; 
procedure TForm1.Button1Click(Sender: TObject); 
begin 
  Word_StringReplace('C:\Test.doc','Old String','New
String',[wrfReplaceAll]);
end; 
Grazie a tutti
Dario
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 caratteri (forse 255).
Premetto che non ho analizzato il tuo codice ma, nella stessa situazione di
dover automatizzare il Search and Replace di Word, ho avuto il tuo stesso
problema (il limite di tot caratteri).
In particolare, provando un po' avevo individuato la dimensione massima
della stringa da sostituire in 240 caratteri ed avevo risolto in questo
modo, un po' operaio ma efficace: in pratica, spezzo il testo che devo
inviare in blocchi di 230 caratteri e in tutti i blocchi che invio (tranne
l'ultimo) inserisco alla fine di nuovo la stringa da sostituire, chiamando
la procedura di sostituzione più volte con ogni volta i successivi 230
caratteri:
Ad esempio, se il limite fosse 10 caratteri:
- ricerco @@TESTO
- devo sostituirlo con abcdefghilmnopqrstuvz (21 caratteri)
- invio i primi 10: Replace @@TESTO con abcdefghil@@TESTO
- invio i secondi 10: Replace @@TESTO con mnopqrstuv@@TESTO
- invio gli ultimi 10: Replace @@TESTO con z (siccome dopo non ne ho più non
aggiungo @@TESTO)
Tutto ciò gira in produzione da due anni almeno su PC sia con Word97 che
2000 che 2002, e l'ho provato con successo anche con il 2003.
Saluti
        Marco Bortolani
        info @ 
marcobortolani.it