Fehler mit Bookmarks in Word
Moderator: Moderatoren
- Muecke
- 1000 working lines a day
- Beiträge: 623
- Registriert: Di, 24. Okt 2006 7:19
- Wohnort: Samstagern CH
- Hat sich bedankt: 3 Mal
- Danksagung erhalten: 9 Mal
- Kontaktdaten:
Fehler mit Bookmarks in Word
Hallo zusammen,
Ich hab eine Vorlage mit ".dot". Ersetze Namen, Ortschaft, usw. und speichere sie dann.
Werde einfach nicht schlau,warum ich solch eine Meldung bekomme, wenn ich Word schliesse.
Muss aber dazu noch sagen, dass Outlook aktive ist.
"Diese Datei wird gerade von einem anderen Benutzer verwendet(c:\...\vorlagen\normal.dot)
Wenn ich Outlook schliesse funktioniert alles.
Gruss
Thomas
Ich hab eine Vorlage mit ".dot". Ersetze Namen, Ortschaft, usw. und speichere sie dann.
Werde einfach nicht schlau,warum ich solch eine Meldung bekomme, wenn ich Word schliesse.
Muss aber dazu noch sagen, dass Outlook aktive ist.
"Diese Datei wird gerade von einem anderen Benutzer verwendet(c:\...\vorlagen\normal.dot)
Wenn ich Outlook schliesse funktioniert alles.
Gruss
Thomas
- Lewi
- 1000 working lines a day
- Beiträge: 830
- Registriert: Di, 07. Feb 2006 14:10
- Wohnort: Hamburg
- Danksagung erhalten: 2 Mal
Du ersetzt innerhalb der DOT-Datei und nicht im Dokument, dass als Vorlage die entsprechende DOT-Datei hat?
Die Lösung könnte in etwa so aussehen:
Die Lösung könnte in etwa so aussehen:
Code: Alles auswählen
FUNC Brief( cDot)
oWord := CreateObject("Word.Application")
IF Empty( oWord )
MsgBox( "Microsoft Word ist nicht installiert" )
ENDIF
oWord:visible := .F. // Word-application not visible
oWord:Documents:Add(cDot ) // create a new Doc with the Formatcollecting <cDot> (.DOT)
oDoc := oWord:ActiveDocument
... ab hier "suchen & ersetzen" und ggf. drucken
::doc:close( .F. ) // object.Close(SaveChanges As Variant, OriginalFormat As Variant, RouteDocument As Variant)
oWord:destroy() // deactivate ActiceX-Connection
oWord := NIL
Return ( NIL )
- Muecke
- 1000 working lines a day
- Beiträge: 623
- Registriert: Di, 24. Okt 2006 7:19
- Wohnort: Samstagern CH
- Hat sich bedankt: 3 Mal
- Danksagung erhalten: 9 Mal
- Kontaktdaten:
Hi Andreas,
Also der Fehler Tritt nur auf, wenn ich im Word nicht zuerst das geänderte Dokument speichere.
Wenn ich direkt Word schliesse, kommt die Meldung "änderung des Dokuments speichern",Bestätigung mit "JA".
Und Jetzt kommt die Meldung das mit
"Diese Datei wird gerade von einem anderen Benutzer verwendet(c:\...\vorlagen\normal.dot)
Gruss Thomas
Also der Fehler Tritt nur auf, wenn ich im Word nicht zuerst das geänderte Dokument speichere.
Wenn ich direkt Word schliesse, kommt die Meldung "änderung des Dokuments speichern",Bestätigung mit "JA".
Und Jetzt kommt die Meldung das mit
"Diese Datei wird gerade von einem anderen Benutzer verwendet(c:\...\vorlagen\normal.dot)
Gruss Thomas
- Muecke
- 1000 working lines a day
- Beiträge: 623
- Registriert: Di, 24. Okt 2006 7:19
- Wohnort: Samstagern CH
- Hat sich bedankt: 3 Mal
- Danksagung erhalten: 9 Mal
- Kontaktdaten:
Hallo Lewi,
Das ist ein Teil meiner Procedure
Muss ich das Doku nochmals speichern beim beenden des Word.
In der Schlaufe wo while?
Gruss Thomas
Das ist ein Teil meiner Procedure
Code: Alles auswählen
// Erzeugen einer ActiveX-Komponente
oWord := CreateObject("openDocument.WriterDocument.1")
IF Empty( oWord )
oWord := CreateObject("Word.Application")
ENDIF
IF Empty( oWord )
MsgBox( "Microsoft Word ist nicht installiert" )
ENDIF
oWord := oWord:dynamicCast(ActiveXObject())
oWord:Quit := {||lWordFinished := .T.}
oWord:visible := .T.
lWordFinished := .F.
// Oeffnen eines Word-Dokuments und Zugriff auf
// eine Sammlung von Lesezeichen
oWord:documents:open( oEigner:aFile[1,2] ) //Dokumentvorlage mit .dot
oDoc := oWord:ActiveDocument
oDoc := oDoc:dynamicCast(ActiveXObject())
oDoc:close := {||lDocFinished := .T.}
lDocFinished := .F.
oBM := oDoc:Bookmarks
// Ersetzen des Lesezeichens durch einen neuen Wert
ReplaceBookmark(oBM , "COMPANY" , aData[1] )
ReplaceBookmark(oBM , "TO" , aData[2] )
ReplaceBookmark(oBM , "FAX" , aData[3] )
ReplaceBookmark(oBM , "FROM" , aData[4] )
...........
// Speichern des Ergebnisses
IF(ValType(cSaveAs)=="C")
oDoc:saveas(cSaveAs)
ENDIF
DO WHILE !lDocFinished
nEvent := AppEvent( @mp1, @mp2, , 1)
ENDDO
oWord:destroy()
oWord := NIL
sleep(0)
RETURN
In der Schlaufe wo while?
Gruss Thomas
- Lewi
- 1000 working lines a day
- Beiträge: 830
- Registriert: Di, 07. Feb 2006 14:10
- Wohnort: Hamburg
- Danksagung erhalten: 2 Mal
Statt
muß die :add()-Methode genommen werden:
Den Code:
brauchst Du nicht und kannst ihn ersatzlos streichen.
Dann sollte es eigentlich funktionieren.
Gruß, Olaf
Code: Alles auswählen
oWord:documents:open( oEigner:aFile[1,2] )
Code: Alles auswählen
oWord:documents:ADD( oEigner:aFile[1,2] )
Code: Alles auswählen
// Speichern des Ergebnisses
IF(ValType(cSaveAs)=="C")
oDoc:saveas(cSaveAs)
ENDIF
Dann sollte es eigentlich funktionieren.
Gruß, Olaf
- Muecke
- 1000 working lines a day
- Beiträge: 623
- Registriert: Di, 24. Okt 2006 7:19
- Wohnort: Samstagern CH
- Hat sich bedankt: 3 Mal
- Danksagung erhalten: 9 Mal
- Kontaktdaten:
Hallo Olaf,
den Code
-Denn brauche ich um dem Dokument einen Namen der aus einem SLE von mir Stammt zu übernehmen.
Wenn ich dies ohne diese Speicherfunktion mache, so muss ich nach dem schliessen dem Dokument einen Namen geben und sagen wohin dies gespeichert werden soll.
Gruss Thomas
den Code
Code: Alles auswählen
// Speichern des Ergebnisses
IF(ValType(cSaveAs)=="C")
oDoc:saveas(cSaveAs)
ENDIF
Wenn ich dies ohne diese Speicherfunktion mache, so muss ich nach dem schliessen dem Dokument einen Namen geben und sagen wohin dies gespeichert werden soll.
Gruss Thomas
- Koverhage
- Der Entwickler von "Deep Thought"
- Beiträge: 2470
- Registriert: Fr, 23. Dez 2005 8:00
- Wohnort: Aalen
- Hat sich bedankt: 102 Mal
- Danksagung erhalten: 3 Mal
- Kontaktdaten:
Hallo Lewi,
das ist mir nicht klar, ich benutze je nach Vorgabe open und add
Add nur wenn ich Textmarken erstzen will und das Dokument dann unsichtbar im Hintergrund ausdrucken will.
Wenn der User das nicht möchte kann er einen Schalter bearbeiten setzen,
dann wird das Dokument mit Open geöffnet. Er muß dann selber auf drucken gehen, oder was auch immer.
Der Nachteil hierbei ist, er sieht wie die Textmarken nach uns nach ersetzt werden.
Ansonsten gibt es damit keine Probleme.
Klaus
das ist mir nicht klar, ich benutze je nach Vorgabe open und add
Add nur wenn ich Textmarken erstzen will und das Dokument dann unsichtbar im Hintergrund ausdrucken will.
Wenn der User das nicht möchte kann er einen Schalter bearbeiten setzen,
dann wird das Dokument mit Open geöffnet. Er muß dann selber auf drucken gehen, oder was auch immer.
Der Nachteil hierbei ist, er sieht wie die Textmarken nach uns nach ersetzt werden.
Ansonsten gibt es damit keine Probleme.
Klaus
- Lewi
- 1000 working lines a day
- Beiträge: 830
- Registriert: Di, 07. Feb 2006 14:10
- Wohnort: Hamburg
- Danksagung erhalten: 2 Mal
Hallo Klaus,
bezugnehmend auf folgenden Code:
habe ich festgestellt, dass mit der :Open()-Methode die Datei nicht abgespeichert wird, aber bei der :Add()-Methode.
Nach diesem Code wird das Dokument in den Ordner "Eigene Dateien" abgespeichert. Wird Add() durch Open() ersetzt erfolgt keine Speicherung.
Nach meiner Kenntnis dient die ADD()-Methode zur Erzeugung neuer Dokumente auf Basis einer Formatvorlage (optional) , mit der OPEN()-Methode werden breits bestehende Dokumente geöffnet.
Gruß, Olaf
bezugnehmend auf folgenden Code:
Code: Alles auswählen
#include "activex.ch"
#DEFINE FALSE .f.
#DEFINE TRUE .t.
PROCEDURE main
LOCAL cDir
Local cDoc
Local cDaten
Local cPrinter := NIL
cDir := CurDrive()+":\"+CurDir()
cDoc := cDir +"\Test.dot"
Test(cDoc,cDaten, cPrinter)
RETURN
Func TEST( cDot )
Local oWord
Local oDoc
Local lWordFinished := .F.
Local oBM
Local lDocFinished := FALSE
Local mp1, mp2, nEvent
oWord := CreateObject("Word.Application")
oWord := oWord:dynamicCast(ActiveXObject())
oWord:visible := .T.
lWordFinished := .F.
oWord:documents:add(cDot ) //Dokumentvorlage mit .dot
oDoc := oWord:ActiveDocument
oDoc := oDoc:dynamicCast(ActiveXObject())
oDoc:close := {||lDocFinished := .T.}
oDoc:Bookmarks("BM1"):Range:Text := "Hallo"
oDoc:saveas("ABC.doc")
DO WHILE !lDocFinished
nEvent := AppEvent( @mp1, @mp2, , 1)
ENDDO
oWord:destroy()
oWord := NIL
sleep(0)
RETURN ( NIL )
Nach diesem Code wird das Dokument in den Ordner "Eigene Dateien" abgespeichert. Wird Add() durch Open() ersetzt erfolgt keine Speicherung.
Nach meiner Kenntnis dient die ADD()-Methode zur Erzeugung neuer Dokumente auf Basis einer Formatvorlage (optional) , mit der OPEN()-Methode werden breits bestehende Dokumente geöffnet.
Gruß, Olaf
- Muecke
- 1000 working lines a day
- Beiträge: 623
- Registriert: Di, 24. Okt 2006 7:19
- Wohnort: Samstagern CH
- Hat sich bedankt: 3 Mal
- Danksagung erhalten: 9 Mal
- Kontaktdaten:
Hallo Olaf,
ja jetzt klapt es.
Habe open mit add ersetzt und diese Zeile rausgenommen.
Nun sieht dies so aus
Jetzt kann der Anwender noch Zusatztext schreiben usw. und am schluss einfach Word schliessen.Das Doku hat immer noch den gleichen Namen und der Anwender muss sich nicht sorgen in welchen Ordner dies gespeichert wird. Dies Händle ich von einer Ini Datei.
Gruss Thomas
ja jetzt klapt es.
Habe open mit add ersetzt und diese Zeile rausgenommen.
Code: Alles auswählen
oWord := CreateObject("openDocument.WriterDocument.1")
Code: Alles auswählen
PROCEDURE WordFillDocument(oEigner, aData, cSaveAs )
LOCAL oWord,oBM,oDoc
LOCAL lWordFinished := .F.
LOCAL lDocFinished := .F.
LOCAL nEvent := 0, mp1, mp2
oWord := CreateObject("Word.Application")
IF Empty( oWord )
MsgBox( "Microsoft Word ist nicht installiert" )
ENDIF
oWord := oWord:dynamicCast(ActiveXObject())
oWord:Quit := {||lWordFinished := .T.}
oWord:visible := .T.
lWordFinished := .F.
// Oeffnen eines Word-Dokuments und Zugriff auf
// eine Sammlung von Lesezeichen
oWord:documents:ADD( oEigner:aFile[1,2] ) //Pfad Dokumentvorlage mit .dot
oDoc := oWord:ActiveDocument
oDoc := oDoc:dynamicCast(ActiveXObject())
oDoc:close := {||lDocFinished := .T.}
oBM := oDoc:Bookmarks
// Ersetzen des Lesezeichens durch einen neuen Wert
ReplaceBookmark(oBM , "COMPANY" , aData[1] )
ReplaceBookmark(oBM , "TO" , aData[2] )
ReplaceBookmark(oBM , "FAX" , aData[3] )
// Speichern des Ergebnisses
IF(ValType(cSaveAs)=="C")
oDoc:saveas(cSaveAs)
ENDIF
DO WHILE !lDocFinished
nEvent := AppEvent( @mp1, @mp2, , 1)
ENDDO
oWord:destroy()
oWord := NIL
sleep(0)
RETURN
Gruss Thomas
- Lewi
- 1000 working lines a day
- Beiträge: 830
- Registriert: Di, 07. Feb 2006 14:10
- Wohnort: Hamburg
- Danksagung erhalten: 2 Mal
Der Vollständigkeit halber:
Wie sieht eigentlich Deine Funktion "ReplaceBookmark" aus?
Gruß, Oaf
Code: Alles auswählen
IF Empty( oWord )
MsgBox( "Microsoft Word ist nicht installiert" )
RETURN
ENDIF
Gruß, Oaf
- Muecke
- 1000 working lines a day
- Beiträge: 623
- Registriert: Di, 24. Okt 2006 7:19
- Wohnort: Samstagern CH
- Hat sich bedankt: 3 Mal
- Danksagung erhalten: 9 Mal
- Kontaktdaten:
Oh danke, hab ich übersehen.Profis sehen dies.
Meine Funktion sieht etwa so aus
Gruss Thomas
Meine Funktion sieht etwa so aus
Code: Alles auswählen
FUNCTION ReplaceBookmark(oBM,cBM,cValue)
LOCAL lRet := oBM:Exists(cBM)
LOCAL oF
IF lRet
oF := oBM:Item(cBM)
oF:Range:Text := cValue
oF:Destroy()
ENDIF
RETURN(lRet)
- Lewi
- 1000 working lines a day
- Beiträge: 830
- Registriert: Di, 07. Feb 2006 14:10
- Wohnort: Hamburg
- Danksagung erhalten: 2 Mal
Moin Thomas,
hier eine Alternative zu Deinem Code. Mein Ansatz basiert auf ein Array, in dem die Bookmarks und die dazugehörigen Werte abgelegt sind:
Darauf aufbauend ergibt sich folgende Routine:
Gruß, Olaf
hier eine Alternative zu Deinem Code. Mein Ansatz basiert auf ein Array, in dem die Bookmarks und die dazugehörigen Werte abgelegt sind:
Code: Alles auswählen
aWerte := {;
{"COMPANY", aData[1} ,;
{"TO" , aData[2] ,;
{"FAX" , aData[3] ,;
{"FROM" , aData[4] ;
}
Code: Alles auswählen
ProcedureWordFillDocument( cDot, aWerte, cSaveAs )
Local oWord
Local oDoc
Local lWordFinished := .F.
Local oBM
Local lDocFinished := FALSE
Local mp1, mp2, nEvent
cSaveAs := IIf( cSaveAs <> NIL, cSaveAs, "")
oWord := CreateObject("Word.Application")
if empty( oWord )
MsgBox("Kein Word installiert" )
RETURN
endif
oWord := oWord:dynamicCast(ActiveXObject())
oWord:visible := .F. // Word unsichtbar!
lWordFinished := .F.
oWord:documents:add(cDot ) //Dokumentvorlage mit .dot
oDoc := oWord:ActiveDocument
oDoc := oDoc:dynamicCast(ActiveXObject())
oDoc:close := {||lDocFinished := .T.}
oBm := oDoc:Bookmarks
aeval(aWerte, {|x,i| IIF( oBm:Exists( x[1]), ReplaceBookmark( oBm, x[1], x[2]), NIL) } )
// alternative Möglichkeit
// aeval(aWerte, {|x,i| IIF( oBm:Exists( x[1]), oDoc:Bookmarks(x[1]):Range:Text := x[2], NIL) } )
oWord:visible := .T. // Word sichtbar nachdem alle Ersetzungen vorgenommen wurden
if ( ! empty( cSaveAs ) )
oDoc:saveas(cSaveAs)
endif
WHILE ( !lDocFinished )
nEvent := AppEvent( @mp1, @mp2, , 1)
ENDDO
oWord:destroy()
oWord := NIL
sleep(0)
RETURN ( NIL )
FUNCTION ReplaceBookmark(oBM,cBM,cValue)
Local oF := oBM:Item(cBM)
oF:Range:Text := cValue
RETURN( NIL )
Gruß, Olaf
- Muecke
- 1000 working lines a day
- Beiträge: 623
- Registriert: Di, 24. Okt 2006 7:19
- Wohnort: Samstagern CH
- Hat sich bedankt: 3 Mal
- Danksagung erhalten: 9 Mal
- Kontaktdaten:
Hallo Olaf,
feine Lösung.So kann ich für jeden DokuTyp Felder zu verfügung stehlen.
Was ich noch schauen muss, warum mir wenn ich eine neue Vorlage speichere auf Dot, den Zusatztext wenn ich es mit der funktion bearbeiten will löscht.Felder die imBookmark sind werden richtig ersetz.
Du hörst von mir.
Gruss Thomas
feine Lösung.So kann ich für jeden DokuTyp Felder zu verfügung stehlen.
Was ich noch schauen muss, warum mir wenn ich eine neue Vorlage speichere auf Dot, den Zusatztext wenn ich es mit der funktion bearbeiten will löscht.Felder die imBookmark sind werden richtig ersetz.
Du hörst von mir.
Gruss Thomas
- Lewi
- 1000 working lines a day
- Beiträge: 830
- Registriert: Di, 07. Feb 2006 14:10
- Wohnort: Hamburg
- Danksagung erhalten: 2 Mal
Hi Thomas,
ich habe meine Funktion getestet und sie funktioniert tadellos. Ein Text in einer Formatvorlage (.DOT) wird bei mir in Zusammenhang mit :Add( cDot ) im neuen Dokument ohne Probleme übernommen.
Vielleicht solltest Du Dir Deine entsprechende Formatvorlage noch einmal anschauen. Vielleicht wurde diese in Zusammenhang mit :Open(cDot) seinerzeit überschrieben.
Gruß, Olaf
PS: Mit welcher Word Version testest Du?
ich habe meine Funktion getestet und sie funktioniert tadellos. Ein Text in einer Formatvorlage (.DOT) wird bei mir in Zusammenhang mit :Add( cDot ) im neuen Dokument ohne Probleme übernommen.
Vielleicht solltest Du Dir Deine entsprechende Formatvorlage noch einmal anschauen. Vielleicht wurde diese in Zusammenhang mit :Open(cDot) seinerzeit überschrieben.
Gruß, Olaf
PS: Mit welcher Word Version testest Du?
- Lewi
- 1000 working lines a day
- Beiträge: 830
- Registriert: Di, 07. Feb 2006 14:10
- Wohnort: Hamburg
- Danksagung erhalten: 2 Mal
Noch ein Hinweis:
Falls Deine Anwendung für Word einen unerwarteten Fehler meldet, wird Deine Anwendung abgebrochen, ohne das Word beendet wird. Dies hat dann mehrere Probleme zur Folge:
1. Word ist noch im Speicher ( siehe Task-Manager)
2. Die Formatvorlage ist noch doch WORD in Benutzung!
Gruß, Olaf
Falls Deine Anwendung für Word einen unerwarteten Fehler meldet, wird Deine Anwendung abgebrochen, ohne das Word beendet wird. Dies hat dann mehrere Probleme zur Folge:
1. Word ist noch im Speicher ( siehe Task-Manager)
2. Die Formatvorlage ist noch doch WORD in Benutzung!
Gruß, Olaf
- Muecke
- 1000 working lines a day
- Beiträge: 623
- Registriert: Di, 24. Okt 2006 7:19
- Wohnort: Samstagern CH
- Hat sich bedankt: 3 Mal
- Danksagung erhalten: 9 Mal
- Kontaktdaten:
Ja Olaf du hast recht mit überschreiben.
Neue Vorlage, funktioniert.
Das wegen dem Absturz:
- Ich lasse das ganze in einem sep.Thread laufen, damit zwinge ich auch den Benutzer Word zu schliessen, aber nur für diese Doku.
So ist man in der Lage mehrere Doku zu verarbeiten, weil jedem so zu sagen ein Word gehört.
Was ich aber noch nicht finde, wie ich wordexe schliessen kann, wenn mal solch einen Fehler Auftritt. Damit hätte ich die möglichkeit wenn ich Prg schliesse abzufragen, ob Word noch offen ist.
Gruss Thomas
Neue Vorlage, funktioniert.
Das wegen dem Absturz:
- Ich lasse das ganze in einem sep.Thread laufen, damit zwinge ich auch den Benutzer Word zu schliessen, aber nur für diese Doku.
So ist man in der Lage mehrere Doku zu verarbeiten, weil jedem so zu sagen ein Word gehört.
Was ich aber noch nicht finde, wie ich wordexe schliessen kann, wenn mal solch einen Fehler Auftritt. Damit hätte ich die möglichkeit wenn ich Prg schliesse abzufragen, ob Word noch offen ist.
Gruss Thomas
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9357
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 101 Mal
- Danksagung erhalten: 361 Mal
- Kontaktdaten:
Hallo, Andreas.
Ich habe lange damit herumoperiert, es geht mit Find() und Zusatzmethoden, aber ich muß Dich warnen - es ist sehr langsam!
Code ist - vermutlich, wir nutzen diese Funktionalität nicht mehr - überarbeitungsbedürftig. oWord ist das ActiveX-Objekt.
Ich habe lange damit herumoperiert, es geht mit Find() und Zusatzmethoden, aber ich muß Dich warnen - es ist sehr langsam!
Code: Alles auswählen
Function ReplaceInWord(oWord,cFindText,cRepText)
local lFound
oWord:Selection:Find:ClearFormatting()
oWord:Selection:Find:Text := cFindText
oWord:Selection:Find:Replacement:ClearFormatting()
oWord:Selection:Find:Replacement:Text := cRepText
oWord:Selection:Find:Forward := .T.
oWord:Selection:Find:Wrap := 1 // FindContinue ??
oWord:Selection:Find:Format := .F.
oWord:Selection:Find:MatchCase := .F.
oWord:Selection:Find:MatchWildcards := .F.
oWord:Selection:Find:MatchAllWordForms := .F.
oWord:Selection:Find:MatchWholeWord := .F.
lFound := .T.
do while lFound
lFound := oWord:Selection:Find:Execute()
if lFound # NIL .and. lFound
oWord:Selection:Text := cRepText
oWord:Selection:Find:ClearFormatting()
endif
if lFound = nil
lFound := .F.
endif
enddo
return nil
Herzlich,
Tom
Tom
- andreas
- Der Entwickler von "Deep Thought"
- Beiträge: 1902
- Registriert: Mi, 28. Sep 2005 10:53
- Wohnort: Osnabrück
- Hat sich bedankt: 4 Mal
- Kontaktdaten:
Hallo Tom,
Danke für die Lösung.
Diese hat allerdings nur den ersten Wert gefunden und ersetzt. Ich habe die etwas geändert. Jetzt funktioniert es.
Wieso benutzt ihr diese Funktion nicht mehr? Habt ihr eine andere Lösung dafür?
Danke für die Lösung.
Diese hat allerdings nur den ersten Wert gefunden und ersetzt. Ich habe die etwas geändert. Jetzt funktioniert es.
Code: Alles auswählen
Function ReplaceInWord(oWord,cFindText,cRepText)
local lFound
lFound := .T.
do while lFound
oWord:Selection:Find:ClearFormatting()
oWord:Selection:Find:Text := cFindText
oWord:Selection:Find:Replacement:ClearFormatting()
oWord:Selection:Find:Replacement:Text := cRepText
oWord:Selection:Find:Forward := .T.
oWord:Selection:Find:Wrap := 1 // FindContinue ??
oWord:Selection:Find:Format := .F.
oWord:Selection:Find:MatchCase := .F.
oWord:Selection:Find:MatchWildcards := .F.
oWord:Selection:Find:MatchAllWordForms := .F.
oWord:Selection:Find:MatchWholeWord := .F.
lFound := oWord:Selection:Find:Execute()
if lFound # NIL .and. lFound
oWord:Selection:Text := cRepText
oWord:Selection:Find:ClearFormatting()
endif
if lFound = nil
lFound := .F.
endif
enddo
return nil
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9357
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 101 Mal
- Danksagung erhalten: 361 Mal
- Kontaktdaten:
Hallo, Andreas.
Ich habe ja geschrieben, daß der Code möglicherweise überarbeitungsbedürftig ist. Schön, daß es jetzt funzt. Geschwindigkeit?
Ich habe ja geschrieben, daß der Code möglicherweise überarbeitungsbedürftig ist. Schön, daß es jetzt funzt. Geschwindigkeit?
Wir haben mit "TX Text Control" ( http://www.textcontrol.com ) eine komplette und umfangreiche Textverarbeitung (die auch alle möglichen Formate beherrscht und sehr mächtig ist) per ActiveX in unsere Software integriert, sowohl als Replacement für die meisten MLEs, als auch für klassische Textverarbeitung. Die hierfür benötigten Methoden, etwa für Search/Replace, sind sehr viel schneller und auch übersichtlicher als das Objektewirrwar von Word. Zudem sind die verschiedenen Word-Versionen, als ActiveX angesteuert, sehr unterschiedlich performant. Ein komplexes Dokument kann bei der Nutzung von Search und Replace sogar auf einem sehr schnellen Rechner für fünf Minuten alles blockieren.Wieso benutzt ihr diese Funktion nicht mehr? Habt ihr eine andere Lösung dafür?
Herzlich,
Tom
Tom