Posts mit dem Label Word werden angezeigt. Alle Posts anzeigen
Posts mit dem Label Word werden angezeigt. Alle Posts anzeigen

Dienstag, 15. Juli 2008

Rechtschreibkorrektur über Word / Spellchecking with Word

Wenn wir dem Anwender die Möglichkeit geben, innerhalb unserer Applikation Texte zu erfassen, die über ein paar Worte hinausgehen, dann wäre es ganz praktisch, diese erfassten Daten, auf Anfrage, einer Rechtschreibprüfung zu unterziehen.

Ist auf dem Kundensystem Word installiert, so stellt sich diese Option als leicht realisierbar dar. Der folgende Beispielcode greift auf eine Funktion zu, die ich bereits in einem früheren Posting veröffentlicht habe. Dort ging es um die Prüfung der aktuellen Word Version.

Um die neue Funktion nutzen zu können, sollte der Code aus dem o.a. Posting somit ebenfalls als Funktion verfügbar sein. Sie stellt bei einer gültigen Word-Version innerhalb des _screen Objektes eine Referenz auf das erzeugte Word Objekt bereit (_screen.oWord)


* // Die Funktion SpellCheck verarbeitet entweder einen übergebenen Parameterstring       
* // oder, falls kein Wert übergeben wird, den Inhalt der Zwischenablage               
FUNCTION SpellCheck
LPARAMETERS vText as String

   LOCAL lcSource as String, loDoc AS Word.Document

   DO CASE
   CASE VARTYPE(m.vText) = [C]
       lcSource = m.vText
   CASE EMPTY(lcSource) AND !EMPTY(_CLIPTEXT)
       lcSource = _CLIPTEXT
   ENDCASE
  
   * // Wenn Source gefüllt ist und Word geladen werden konnte, dann kann es losgehen   
   IF !EMPTY(lcSource) AND LoadWord() > 0

       * // Neues leeres Worddokument erzeugen                                           
       loDoc                    = _screen.oWord.Documents.Add(,,1,.T.)
      
       * // Das neue leere Worddokument mit dem zu prüfenden Text füllen               
       loDoc.Content.Text        = lcSource
      
       * // Rechtschreibkorrektur anwerfen                                               
       * // Wenn Rechtschreibfehler vermutet werden öffnet sich das Korrekturfenster   
       loDoc.CheckSpelling()
      
       * // Jetzt steht im Worddokument der korrigierte Text, den wir unserer            
       * // Arbeitsvariablen bzw. Ziel-Property zuweisen                               
       lcSource                = loDoc.Content.Text
      
       * // Sicherstellen, das Word weiterhin unsichtbar bleibt                       
       _screen.oWord.Visible    = .F.
      
       * // Das zuvor erzeugte Worddokument schliessen,                                
       * // ohne dass eine Sicherheitsabfrage aufpoppt                                   
       loDoc.Close(.F.)
      
       * // Die nicht mehr benötigte Referenzvariable nullen                           
       loDoc                    = .NULL.
      
       * // Word schliessen ohne das eine Abfrage aufpoppt                               
       _screen.oWord.Quit(.F.)
      
       * // Referenzproperty nullen                                                   
       _screen.oWord            = .NULL.
      
       RELEASE loDoc
      
   ENDIF
  
   RETURN lcSource
  
ENDFUNC

Anmerkung: Diese Funktion wurde nicht unter der Version 2007 getestet, da mir diese derzeit nicht zur Verfügung steht.

Mittwoch, 26. März 2008

Word über Windows Scripting Host fernsteuern / Remote controlling Word with windows scripting host

Wer intensiv mit Word arbeitet weiss, dass es für fast alle Funktionen drei Möglichkeiten gibt, diese aufzurufen (OK, manchmal gibt es auch vier ;-) ).

Die drei Basiswege hierbei stellen die Menüs und Popup-Menüs, die Maus und die Tastatur dar.

An dieser Stelle soll es sich um die eingebetteten Tastaturfunktionen drehen. Die meisten dieser Schnelltasten (Shortcuts) werden im übrigen in den diversen Menüs und Untermenüs an deren rechtem Rand angezeigt.

Wer sich nicht durch die Objekthierarchien von Word zwecks OLE Automation durcharbeiten möchte, kann mit Hilfe der Schnelltasten viele Funktionen von Word aufrufen. Das folgende Codebeispiel zeigt einige der Möglichkeiten auf. Letztlich passiert nicht wirklich viel, aber wir erhalten dadurch einen Eindruck der verfügbaren Möglichkeiten.

* Starte WinWord, übergebe einen String und sortiere ihn,
* dann starte Notepad und füge ihn ein


#DEFINE CRLF chr(13)+chr(10) && Wagenvorlauf und Zeilenvorschub (Carriage Return / Linefeed)
#DEFINE WSHIDE             0 && Versteckt das Fenster und aktiviert ein anderes
#DEFINE WSNORMAL           1 && Aktiviert und zeigt das Fenster
#DEFINE WSMIN              2 && Aktiviert und zeigt das Fenster im Minimieren-Modus
#DEFINE WSMAX              3 && Aktiviert und zeigt das Fenster im Maximieren-Modus
#DEFINE WSLAST             4 && Zeigt das Fenster im zuletzt benutzten Modus in Bezug auf Größe und Position an. Das aktive Fenster bleibt aktiv.
#DEFINE WSSAME             5 && Aktiviert das Fenster und zeigt es in aktuelle Größe und Position.
#DEFINE WSMINNEXT          6 && Minimiert das spezifizierte Fenster und aktiviert das nächte Top-Level-Fenster im Z-Order Stapel.
#DEFINE WSMINSAME          7 && Zeigt das Fenster im Minimiert-Modus. Das aktive Fenster bleibt aktiv.
#DEFINE WSSAMECUR          8 && Zeigt das Fenster im aktuellen Modus. Das aktive Fenster bleibt aktiv.
#DEFINE WSORIG             9 && Aktiviert und zeigt das Fenster
#DEFINE WSSETSHOW         10 && Setzt den Anzeigemodus basierend auf der aufrufenden Applikation.

DECLARE Sleep IN WIN32API INTEGER       && Millisekunden basierender Wartezyklus
                                        && dient zur besseren Veranschaulichung

_Cliptext = [Eins Zwei Drei Vier Fünf ]    && Basisstring definieren
_cliptext = STRTRAN(_Cliptext,[ ],CRLF)    && Leerzeichen durch CR/LF ersetzen

WshShell = CreateObject([wscript.Shell])


* Winword normal startenl
WshShell.Run([WinWord],WSNORMAL)
=Sleep(1000)

* STRG+v  - Zwischenablage einfügen
WshShell.SendKeys([^v])
=Sleep(1000)

* ALT+l+s - Sortiervorgang anstossen
WshShell.SendKeys([%ls])    && Word 2003
=Sleep(1000)

* ENTER   - Abfrage bestätigen
WshShell.SendKeys([{ENTER}])
=Sleep(1000)

* STRG+a  - alles markieren
WshShell.SendKeys([^a])
=Sleep(1000)

* STRG+c  - Markierung in die Zwischenablage kopieren
WshShell.SendKeys([^c])
=Sleep(1000)

* ALT+F4  - Winword Dokument schliessen
WshShell.SendKeys([%{F4}])
=Sleep(1000)

* n-(No)  - Speichern-Abfrage verneinen
WshShell.SendKeys([n])
=Sleep(1000)

* Notepad normal starten
WshShell.Run([notepad],WSNORMAL)
=Sleep(1000)

* Notepad aktivieren
WshShell.AppActivate([notepad])
=Sleep(1000)

* STRG+v  - Zwischenablage (jetzt sortiert) einfügen
WshShell.SendKeys([^v])


Mittwoch, 21. November 2007

Welche WORD-Version liegt auf dem aktuellen System vor? / Which version of Word is installed on the current system?

Mit jeder Word-Version stehen neue Funktionen für die OLE-Automation zur Verfügung oder das Interface wurde in Kleinigkeiten modifiziert. 

Somit ist es nicht ausreichend, dem Anwender mitzuteilen, dass für bestimmte Funktionen der eigenen Software einfach nur Word installiert sein muss. 

Vielmehr sollten wir als Entwickler dafür Sorge tragen, dass unsere Software auf die verschiedenen Versionen mit individuellen Klassen reagiert. 

Zumindest muss jedoch eine Mitteilung an den Anwender erfolgen, dass u.U. eine neuere Version benötigt wird.
 
FUNCTION LoadWord
    LOCAL liVersion as Integer, lcMsg as String
    liVersion = 0

    * Für diese Demo dem _Screen-Objekt eine Property hinzufügen
    * in der anschliessend das OLE-Objekt abgelegt wird
    IF !PEMSTATUS(_screen,[oWord],5)
        _screen.AddProperty([oWord])
    ENDIF

    * Jetzt versuchen wir eine Instanziierung von Word
    TRY
        _screen.oWord = CREATEOBJECT([Word.Application])
    CATCH
        TEXT TO lcMsg TEXTMERGE NOSHOW PRETEXT 3
            Anscheinend ist Word nicht auf Ihrem Rechner installiert.
            Diese Anwendung wird jedoch benötigt um fortzufahren.
        ENDTEXT
        MESSAGEBOX(lcMsg,0+64+0,[Programminformation])
    ENDTRY

    * Wenn es das Wordobjekt gibt, dann gehts weiter mit der Versionsprüfung
    IF VARTYPE(_screen.oWord) = [O]
        WITH _screen.oWord
         
            IF INLIST(ALLTRIM(.version), [9.0], [10.0], [11.0], [12.0])
                liVersion = INT(VAL(.Version))
            ELSE
                * Office 97 und älter wird nicht mehr unterstützt
                TEXT TO lcMsg TEXTMERGE NOSHOW PRETEXT 3
                    Auf Ihrem Rechner muss Word 2000 oder höher installiert sein,
                    damit die gewünschte Funktionalität bereitgestellt werden kann.
                ENDTEXT
                MESSAGEBOX(lcMsg,0+64+0,[Programminformation])
                .Quit()
             
            ENDIF

        ENDWITH
    ENDIF

    RETURN liVersion
ENDFUNC