Autor Beitrag
SmileySN
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 297

WinXP, Win7
Delphi 2010 Professional
BeitragVerfasst: 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:

ausblenden volle Höhe Delphi-Quelltext
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;


//******************************************************************************
//***************** Word öffnen ************************************************
//******************************************************************************
Procedure ConnectToWord(sichtbar: Boolean);
Var
  wFalse: OleVariant;

Begin
  wFalse := False;
  { Check if file exists }
  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;

//******************************************************************************
//***************** Word Beenden ***********************************************
//******************************************************************************
Procedure WordBeenden;
Begin
  With Form1 Do
    Begin
      If aktiv('Word.Application'Then
        Begin
          Try
            Feld := False;
            WordApplication1.Disconnect;
          Except
          End;
        End;
    End;
End;

//******************************************************************************
//***************** Word Replace Funktion **************************************
//******************************************************************************

Procedure Word_StringReplace(SearchString, ReplaceString: string; ReplaceAll:Boolean);
const
  wdFindContinue  = 1;
  wdReplaceOne    = 1;
  wdReplaceAll    = 2;
var
  _Search,_Replace,_Wrap,_ReplaceAll,F,T: OLEVariant;

begin
    { Initialisiere Parameter}
    if ReplaceAll then
      _ReplaceAll:=wdReplaceAll
    else
      _ReplaceAll:=wdReplaceOne;

     _Search:=SearchString;
     _Replace:=ReplaceString;
     _Wrap:=wdFindContinue;
     F:=False;
     T:=True;
    { Perform the search}
    //FindText,Case,WholeWord,WildChars,SoundsLike,AllWordForms,Forward,Wrap,ReplaceWith,ReplaceTyp
     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 user profile iconGausi: Code- durch Delphi-Tags ersetzt
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 297

WinXP, Win7
Delphi 2010 Professional
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: 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
ausblenden 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
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 297

WinXP, Win7
Delphi 2010 Professional
BeitragVerfasst: Mo 09.04.07 13:20 
Das folgende brauche is deshalb,
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 297

WinXP, Win7
Delphi 2010 Professional
BeitragVerfasst: 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 297

WinXP, Win7
Delphi 2010 Professional
BeitragVerfasst: 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.