| Autor |
Beitrag |
SmileySN
      
Beiträge: 297
WinXP, Win7
Delphi 2010 Professional
|
Verfasst: So 08.04.07 21:56
Ich habe Delphi2006 mit der WordXP Lib installiert.
Damit will ich Ein Worddokument laden und einen bzw. mehrere Textstellen darin ändern (Replace).
Mit Word Formulen bin ich bereits gut klargekommen, dort ist jedoch das Problem, dass das Dokument und die zu ersetzenden Formularfelder immer genau übereinstimmen müssen.
Jetzt will ich es mit der Ersetzen-Funktion versuchen.
Mein Programm bringt jetzt zwar keine Fehler mehr, aber es wird im Dokument nichts ersetzt.
Was kann das noch sein.
Hier mein Programm:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93:
| procedure TForm1.Button1Click(Sender: TObject); begin filename:=ProgPath+'Brief.doc'; ConnectToWord(True); Word_StringReplace('##Adr_Anrede##','Herr',True); WordBeenden; end;
Procedure ConnectToWord(sichtbar: Boolean); Var wFalse: OleVariant;
Begin wFalse := False; if not FileExists(Filename) then begin ShowMessage('Das Dokument ist nicht vorhanden'); Exit; end;
With Form1 Do Begin If (Not aktiv('Word.Application')) Then WordApplication1.Create(Nil); Try WordApplication1.Connect; Except Showmessage('Word konnte nicht gestartet werden'); exit; End; WordApplication1.Visible := sichtbar; WordApplication1.Documents.OpenOld(FileName, wFalse, wFalse, wFalse, EmptyParam, EmptyParam, wFalse, EmptyParam, EmptyParam, EmptyParam);
WordDocument1.ConnectTo(WordApplication1.ActiveDocument); End; End;
Procedure WordBeenden; Begin With Form1 Do Begin If aktiv('Word.Application') Then Begin Try Feld := False; WordApplication1.Disconnect; Except End; End; End; End;
Procedure Word_StringReplace(SearchString, ReplaceString: string; ReplaceAll:Boolean); const wdFindContinue = 1; wdReplaceOne = 1; wdReplaceAll = 2; var _Search,_Replace,_Wrap,_ReplaceAll,F,T: OLEVariant;
begin if ReplaceAll then _ReplaceAll:=wdReplaceAll else _ReplaceAll:=wdReplaceOne;
_Search:=SearchString; _Replace:=ReplaceString; _Wrap:=wdFindContinue; F:=False; T:=True; Form1.WordApplication1.Selection.Find.ExecuteOld( _Search, F, T, F, F, F, T, _Wrap, F,_Replace,_ReplaceAll);
Application.ProcessMessages; Showmessage('Weiter'); end; |
Der zu ersetzende Text '##Adr_Anrede##' ist zwar genau so wie angegeben im Dokument vorhanden, wird aber nicht ersetzt.
Was mache ich hier falsch ????
Moderiert von Gausi: Code- durch Delphi-Tags ersetzt
|
|
Keldorn
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: Mo 09.04.07 09:57
Hallo,
also die Proc Word_StringReplace geht bei mir (delphi2005 und Word2003). Evlt mal versuchen, nicht die ***old-aufrufe zu verwenden sondern die richtigen, da werden paramter fehlen, die bekommst du mit der codevervollständigung leicht hin, oder emptyparam übergeben. Obwohl ich nicht wirklich glaube, das es daran liegt, aber einen Versuch ist es wert. Evtl auch nochmal ein Makro aufzeichnen und guggn, wie es WordXP macht.
Mfg Frank
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|
SmileySN 
      
Beiträge: 297
WinXP, Win7
Delphi 2010 Professional
|
Verfasst: Mo 09.04.07 11:09
Meinst Du mit 'geht bei mir', dass die Routine tatsächlich den Text in dem Worddokument ersetzt ? oder nur, dass die Funktion sich aufrufen lässt.
Laufen tut das Programm bei mir auch ohne Fehler, es ersetz nur leider den Text im Dokument nicht.
Kann es sein, dass man erst noch etwas selektieren mus im Dokument, obwohl ich doch schon das 'WholeWord' Flag gesetzt habe. Hatte es auch schon ohne probiert und auch mit emptyParam, wo es möglich war.
Habe auch schon ein Word Macro aufgezeichnet und mich danach gerichtet.
Ich habe Word2003 und weiß jetzt nicht mehr weiter.
Die Beispiele die ich gefunden haben sind alle aus der Delphi5 und 6 Zeit( mit OLE), diese Synthax funktioniert bei mir nicht.
'Form1.WordApplication1.Selection.Find.Execute(Replace:=wdReplaceAll);' funktioniert nicht, dort wird einmal der Parameter Replace als nicht existent angezeigt und zu wenig Parameter gemeldet.
|
|
Keldorn
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: Mo 09.04.07 11:24
geht bei mir-> die proc hat den Text richtig ersetzt.
ansonsten häng mal dein Dok dran oder schicks mir per PN
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|
Keldorn
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: Mo 09.04.07 12:23
also bei mir funktoniert auch mit dem dokument es. Hab mal deinen code komplett übernommen. Was ist bei dir die aktiv-proc? die ist für meine Begriffe unnötig, das
Delphi-Quelltext 1:
| WordApplication1.Connect; |
alleine reicht vollkommen (autoconnect der wordapplication auf false).
auch was WordApplication1.Create(Nil); bedeuten soll, weiß ich nicht, wenn dann muß es
Delphi-Quelltext 1:
| WordApplication1:=TWordApplication.Create(Form1 bzw self); |
heißen. mit WordApplication1.Create(Nil); mußt du in einer AV landen. aber so oder so unnötig, normalerweise pappt man eine wordapplication aus der serverpalette auf die form und das extra Erzeugen ist nicht notwendig.
Probier das mal, bzw probier, ob du z.B. mit Typetext überhaupt was in word schreiben kannst. Die Ersetztenproc geht, vielleicht hast schon von Grund auf überhaupt keine Verbindung zu Word.
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|
SmileySN 
      
Beiträge: 297
WinXP, Win7
Delphi 2010 Professional
|
Verfasst: Mo 09.04.07 13:20
Das folgende brauche is deshalb,
Quelltext 1: 2: 3: 4:
| If (Not aktiv('Word.Application')) Then Form1.WordApplication1:=TWordApplication.Create(Form1); Try WordApplication1.Connect; |
weil der Benutzer, nachdem ich das Worddokument geöffnet habe, dieses manchmal schließt, inclusive dem gesamten Word und ich dann natürlich beim nächsten Öffnen Probleme mit dem Connect bekomme da kein Word mehr vorhanden ist.
Wenn ich mein Programm schließe, dann mache ich erst ein Wordapplication1.Quit um ein betehendes Word dann endgültig zu schließen.
Wo kann ich denn mehr über die Integration des Wordapplication Objektes in Delphi erfahren.
Möchte gern wissen was dort automatisch gemacht wird und was die Properties bewirken.
|
|
SmileySN 
      
Beiträge: 297
WinXP, Win7
Delphi 2010 Professional
|
Verfasst: Mo 09.04.07 13:42
Zu deiner frage ob die Kommunikation überhaupt funktioniert, kann ich sagen, dass ich mein Projekt bisher mit Formuarfeldern schon am laufen habe, wollte jetzt die Methode mit dem ersetzen ausprobieren.
Bisher habe ich meine Daten folgendermassen eingefügt:
Quelltext 1: 2:
| Feld := 'Adr_Anrede'; Form1.WordApplication1.ActiveDocument.FormFields.Item(Feld).Result := Form1.QKundenAnrede.Text; |
Ich kann Dir gern auch mal das ganze Projekt senden, wenn Du Dich damit beschäftigen willst.
Die Wordanbindung und Steuerung ist mir noch neu und ich suche mir meine Informationen aus Foren und Beispielen zusammen.
Leider sind die Beispiele immer mit alten Delphi Versionen und ohne das WordApplication Objekt gemacht.
Wenn ich das mit dem Replace durch habe, will ich die Mailmerge Funktion ausprobieren.
So arbeite ich mich langsam in das Thema ein.
|
|
Keldorn
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: Mo 09.04.07 17:01
| Zitat: |
weil der Benutzer, nachdem ich das Worddokument geöffnet habe, dieses manchmal schließt, inclusive dem gesamten Word und ich dann natürlich beim nächsten Öffnen Probleme mit dem Connect bekomme da kein Word mehr vorhanden ist.
|
Brauchst du nicht unbedingt. Wordapplication hat auch ereignisse, wo Du auf das schliessen von Word reagieren und dort dein disconnect aufrufen kannst.
Da ist nur ein Bug, wenn du erst ein Dok, dann Word schließt, bekommst du ein close ereignis nicht mitgeteilt (oder so ähnlich, muß ich erst in meine Quelltext guggn)
| Zitat: |
Wo kann ich denn mehr über die Integration des Wordapplication Objektes in Delphi erfahren.
Möchte gern wissen was dort automatisch gemacht wird und was die Properties bewirken. |
Da weiß ich leider keinen Link
| Zitat: |
Ich kann Dir gern auch mal das ganze Projekt senden, wenn Du Dich damit beschäftigen willst.
|
kannst Du machen, vor dem nächsten WE werde ich allerdings kaum Zeit haben da drüberzuschauen.
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|
SmileySN 
      
Beiträge: 297
WinXP, Win7
Delphi 2010 Professional
|
Verfasst: Mo 09.04.07 17:46
Danke Keldorn für Deine Hilfe,
ich habe nun festgestellt, dass es nur auf meinem Entwicklungssystem nicht funktioniert, auf zwei anderen Computern geht alles wie geplant.
Es muss also etwas mit meiner Office-Konfiguration zu tun haben.
Falls noch jemand eine Idee hat was verhindern kann, dass der Replacebefehl einfach nichts macht, kann mir gerne einen Tip zukommen lassen.
Ich denke mal es ist irgend ein Wert in den Optionen von Word.
Werde das mal mit dem anderen PC vergleichen was da eingestellt ist.
Der Tip, dass das OnClose Ereignis der Wordapp. mir rechtzeitig das schließen von Word mitteilt, ist sehr hilfreich, ich hoffe nur es wird auch immer gemeldet. Aber auch dann muss ich die WordApp. ja dann neu aufrufen oder etwa nicht ?
Falls noch jemand eine Stelle weiß, wo ich aktuelle Informationen über das WordApplication Objekt erfahren kann, würde es mich freuen wenn er es hier bekannt gibt.
|
|
|