Fehler mit Bookmarks in Word

Nutzung, Komponenten, .NET

Moderator: Moderatoren

Benutzeravatar
Muecke
1000 working lines a day
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

Beitrag von Muecke »

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
Benutzeravatar
andreas
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1902
Registriert: Mi, 28. Sep 2005 10:53
Wohnort: Osnabrück
Hat sich bedankt: 4 Mal
Kontaktdaten:

Beitrag von andreas »

Hallo Thomas,

kann es vielleicht sein, dass du mit deinem Programm zufällig die Normal.dot überschreibst?
Gruß,

Andreas
VIP der XUG Osnabrück
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

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:

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 )
Benutzeravatar
Muecke
1000 working lines a day
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:

Beitrag von Muecke »

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
Benutzeravatar
Muecke
1000 working lines a day
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:

Beitrag von Muecke »

Hallo Lewi,

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
Muss ich das Doku nochmals speichern beim beenden des Word.
In der Schlaufe wo while?


Gruss Thomas
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

Statt

Code: Alles auswählen

oWord:documents:open( oEigner:aFile[1,2] )  
muß die :add()-Methode genommen werden:

Code: Alles auswählen

oWord:documents:ADD( oEigner:aFile[1,2] )  
Den Code:

Code: Alles auswählen

// Speichern des Ergebnisses
   IF(ValType(cSaveAs)=="C")
     oDoc:saveas(cSaveAs)
   ENDIF
brauchst Du nicht und kannst ihn ersatzlos streichen.

Dann sollte es eigentlich funktionieren.

Gruß, Olaf
Benutzeravatar
Muecke
1000 working lines a day
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:

Beitrag von Muecke »

Hallo Olaf,

den Code

Code: Alles auswählen

// Speichern des Ergebnisses 
   IF(ValType(cSaveAs)=="C") 
     oDoc:saveas(cSaveAs) 
   ENDIF 
-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
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

Ok, das war mir nicht bewußt. Aber das Entscheidene ist die von mir dargestellte :ADD() Methode.
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
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:

Beitrag von Koverhage »

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
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
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:

Beitrag von Koverhage »

Thomas,

was passiert wenn Du den Code von meinem Beitrag Drucker und Anzahl kopien hier im ActiveX forum nimmst ?
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

Hallo Klaus,

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 )
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
Benutzeravatar
Muecke
1000 working lines a day
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:

Beitrag von Muecke »

Hallo Olaf,

ja jetzt klapt es.
Habe open mit add ersetzt und diese Zeile rausgenommen.

Code: Alles auswählen

oWord := CreateObject("openDocument.WriterDocument.1") 
Nun sieht dies so aus

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
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
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

Der Vollständigkeit halber:

Code: Alles auswählen

IF Empty( oWord )
   MsgBox( "Microsoft Word ist nicht installiert" )
   RETURN
ENDIF 
Wie sieht eigentlich Deine Funktion "ReplaceBookmark" aus?

Gruß, Oaf
Benutzeravatar
Muecke
1000 working lines a day
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:

Beitrag von Muecke »

Oh danke, hab ich übersehen.Profis sehen dies.

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)
Gruss Thomas
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

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:

Code: Alles auswählen

aWerte := {;
               {"COMPANY",  aData[1}  ,;
               {"TO"       , aData[2] ,;
               {"FAX"      , aData[3] ,;
               {"FROM"     , aData[4]  ;
               }
Darauf aufbauend ergibt sich folgende Routine:

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
Benutzeravatar
Muecke
1000 working lines a day
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:

Beitrag von Muecke »

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
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

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?
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

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
Benutzeravatar
Muecke
1000 working lines a day
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:

Beitrag von Muecke »

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
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

Wenn Du einen AxtiveX-Fehler abfangen willst um Word aus dem Speicher zu entfernen und um die angeforderten Ressourcen freizugeben, müßte m.E. ein entprechender Error-Exception Code implementiert werden.
Benutzeravatar
Muecke
1000 working lines a day
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:

Beitrag von Muecke »

Ist mir zu hoch.
Versteh nur Bahnhof
Error-Exception Code implementiert
Gruss Thomas
Benutzeravatar
andreas
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1902
Registriert: Mi, 28. Sep 2005 10:53
Wohnort: Osnabrück
Hat sich bedankt: 4 Mal
Kontaktdaten:

Beitrag von andreas »

Hallo Leute,

ich möchte im Worddokument nach einem Schlüsselwort suchen und diesen ersetzen lassen. Der Schlüssel darf mehrmals vorkommen, deswegen passt es mir mit Bookmarks nicht.
Hat vielleicht schon jemand eine Lösung dafür?
Gruß,

Andreas
VIP der XUG Osnabrück
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
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:

Beitrag von Tom »

Hallo, Andreas.

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
Code ist - vermutlich, wir nutzen diese Funktionalität nicht mehr - überarbeitungsbedürftig. oWord ist das ActiveX-Objekt.
Herzlich,
Tom
Benutzeravatar
andreas
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1902
Registriert: Mi, 28. Sep 2005 10:53
Wohnort: Osnabrück
Hat sich bedankt: 4 Mal
Kontaktdaten:

Beitrag von andreas »

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.

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
Wieso benutzt ihr diese Funktion nicht mehr? Habt ihr eine andere Lösung dafür?
Gruß,

Andreas
VIP der XUG Osnabrück
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
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:

Beitrag von Tom »

Hallo, Andreas.

Ich habe ja geschrieben, daß der Code möglicherweise überarbeitungsbedürftig ist. Schön, daß es jetzt funzt. Geschwindigkeit?
Wieso benutzt ihr diese Funktion nicht mehr? Habt ihr eine andere Lösung dafür?
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.
Herzlich,
Tom
Antworten