Description:
I wrote this to demonstrate how to take full advantage of MS Word's built in Spelling and Grammar checker. There
are a few other code examples that show how to do spell checking with Word but they are all using the same technique that
seems to have a few issues like showing the spell dialog behind your app, messing up the line breaks so you need to
apply a code fix to restore them, flashing window, etc.
What makes my spell checker different is that I use the actual spell/grammar checking dialog window and not invoking it by
coding the usual - "Document.CheckSpelling" which seems to cause the mentioned issues.
Since I use the dialog window I preset the type of spelling I wish to perform. Now you can make it dynamic by having a
spell options form in your app to allow the user to preset it to either Ignore words in UPPERCASE, urls, mixed words and
numbers, check grammer, and whether to show spelling suggestions, etc.
Requirements:
Microsoft Word
Versions 10.0 - 11.0 (2002 - 2003)
Note: I converted my VB6 version to VB.NET 2003. The VB6 version can be located here.
Re: Advanced VB/Office Guru™ Word SpellChecker™.NET
what Refrences Are used? I Have Office 2003 Installed, and I Tried Refrencing Microsoft.Office 11, Microsoft.Office 10, Office, and these Errors Still Stood the Test of Time. Please Submit an Example, in .NET
(1): Namespace or type 'Interop' for the Imports 'Microsoft.Office.Interop' cannot be found.
(2): Namespace or type 'of' for the Imports 'System.Runtime.InteropServices.of' cannot be found.
(48): Type 'Word.Application' is not defined.
(64): Type 'Word.Application' is not defined.
(67): Type 'Word.Application' is not defined.
(78): Type 'Word.Document' is not defined.
(112): Name 'hSpelling' is not declared.
(112): Name 'Word' is not declared.
(113): Name 'Corrections' is not declared.
(113): Name 'Word' is not declared.
(114): Name 'Word' is not declared.
(115): Name 'ndFileAddresses' is not declared.
(115): Name 'Word' is not declared.
(116): Name 'ts' is not declared.
(116): Name 'Word' is not declared.
(117): Name 'Statistics' is not declared.
(117): Name 'Word' is not declared.
(122): Name 'Word' is not declared.
Re: Advanced VB/Office Guru™ Word SpellChecker™.NET
You need to add a reference to Word. I would submit an example but I already have found one person trying to claim my code being copyrighted as his and published on his website just about 2 weeks ago. It was a member that I helped with this. I had to submit a claim to his forum's software provider. Needless to say, he had to take it down.
Your errors are easy to fix. You need a reference to Word and it looks like you do not have the Primary Interop Assemblies installed for Office. Check the link in my signature on Office PIAs. This will give you the .Office.Interop.
VB/Office Guru™ (AKA: Gangsta Yoda™ ®)
I dont answer coding questions via PM. Please post a thread in the appropriate forum.
Re: Advanced VB/Office Guru™ Word SpellChecker™.NET
Latest Errors:
(115): Name 'Statistics' is not declared.
(110): 'CheckGrammarWit' is not a member of 'Microsoft.Office.Interop.Word.Options'.
(110): Name 'hSpelling' is not declared.
(111): 'SuggestSpelling' is not a member of 'Microsoft.Office.Interop.Word.Options'.
(111): Name 'Corrections' is not declared.
(113): 'IgnoreInternetA' is not a member of 'Microsoft.Office.Interop.Word.Options'.
(113): Name 'ndFileAddresses' is not declared.
(114): 'IgnoreMixedDigi' is not a member of 'Microsoft.Office.Interop.Word.Options'.
(114): Name 'ts' is not declared.
(115): 'ShowReadability' is not a member of 'Microsoft.Office.Interop.Word.Options'.
Re: Advanced VB/Office Guru™ Word SpellChecker™.NET
I'm running the same MDE but SP1 on the framework version and SP1 on XP Pro. Also, Office 2003 but its just a shortcut as when I type the parenthesis after the Dialogs I get intellisense popup for the constants.
VB Code:
'Original way with intellisense.
moApp.Dialogs(Word.WdWordDialog...
'Works for me too.
moApp.Dialogs.Item(Word.WdWordDialog...
VB/Office Guru™ (AKA: Gangsta Yoda™ ®)
I dont answer coding questions via PM. Please post a thread in the appropriate forum.
Re: Advanced VB/Office Guru™ Word SpellChecker™.NET
Mr Dog,
I'm having problems with focus using your .Net spellchecker mate. Apart from this its working cool, really cool.
I have around 10 user controls that use this, I am running in a terminal services / Citrix environment and the users have a TS desktop session running that they don't see, so it just looks like a seamless app to them. Anyway, I am creating an instance of Word on the first use of Spellchecker, then leaving it for subsequent calls.
Sometimes, not always, the subsequent calls don't bring the spellcheck window to the front/focus so I get a hung app. Because the users can't see the citrix desktop, and never will, they're unable to do a Ctrl - Tab to switch apps/focus. Trying to get them to do something that simple normally would be difficult anyways.
So, any suggestions Sir ?
Thanks in advance, just holler if you need to see my current code / app.
Bob
"I dislike 7 am. If 7 am were a person, I would punch 7 am in the biscuits." - Paul Ryan, DailyRamblings
Re: Advanced VB/Office Guru™ Word SpellChecker™.NET
Hiya RobDog, really great forum, I've added this to my list of resources. And really great work on this spellchceck class, it's fabulous! I'm playing around with it in VS2005 and all seems well in order. Learned a lot from it just about MSWord alone :-) I'm having difficulties with one thing, and that is when I set killme() to 'true', it likes to kill *all* instances of Word... even previously opened, mutually exclusive, documents. Now there's a fun trick to play on the enduser! lol. I wonder if anyone else has this issue and what they have done about it... I have a feeling I'm going to have to set the .doc to visible=false rather than the app itself, regardless, if I figure it out I'll post here.
Last edited by RobDog888; Jun 1st, 2006 at 06:13 AM.
Re: Advanced VB/Office Guru™ Word SpellChecker™.NET
Thanks for the props
Sounds like the KillMe property is not finding the instance of Word already open so when it closes it kills the Word application object even though you have child documents in it.
You should only be executing the killme if your closing your program or you dont anticipate performing any more spellchecks. If you do another then it takes time for word to start again.
I'm off to bed right now but what version of Word are you running? Can you test it a bit more and post the findings for me tomorrow (actually today. Its 4 am). I'll take a look at it in a few.
Thanks
VB/Office Guru™ (AKA: Gangsta Yoda™ ®)
I dont answer coding questions via PM. Please post a thread in the appropriate forum.
Re: Advanced VB/Office Guru™ Word SpellChecker™.NET
Sure thing, can do. I'm using Office 2003 on my development machine. I did a quick build and tried to run it on a machine that has Office 2002 and ran into an entirely different snag.. stdole version needs an upgrade in the global assembly cache... I think this means I need a reference to the older office objects as it can't load the office interop for version 11 on the machie with Office 2002 (duh). I'm not in any hurry so it may take me a couple of days... sleep well... 4am eh? bit of a workaholic? lol.
Re: Advanced VB/Office Guru™ Word SpellChecker™.NET
lol yup
If your creating a setup package and have the PIAs then you shouldnt have an issue but then again I havent had any other version other then 2003 so...
Its supossed to be that when you use the PIAs you dont have to worry about versioning. You can always use late binding and remove the references to Office and Word. Then you would have to go and cast all your types correctly so you can use Option Strict still.
Man, I got to stop posting and get some sleep. Should be up in a few hours though as I have to be up before 9am. 4.5 hours sleep should be good for a while.
VB/Office Guru™ (AKA: Gangsta Yoda™ ®)
I dont answer coding questions via PM. Please post a thread in the appropriate forum.
Re: Advanced VB/Office Guru™ Word SpellChecker™.NET
Ok, Bare with me... late binding has created a load of fun for me. I can see where this is going to solve my compatibility issues, but yeesh, VS2005 likes to complain about everything. Also, since I'm not familiar with working with MSWord this way, this is a bit of a learning curve --and to do it.. option stric has to be off.. late binding is not allowed otherwise... so no intellisense... AH!
Anyways... I've gotten this far with this challenge...
1. when I declare the moApp and oDoc as objects, it likes to complain about all the references to word.wsWindowState (says 'word' is not delared)
2. also complains about moApp.Dialogs(word.aWdWordDialog... (says 'word' is not declared)
3. It doesn't like the Direct Cast statement (says 'word.application' is not defined)
if I replace the word. with moApp., and I sub in object for word.application in the direct cast statement, it builds fine, but it throws errors on the btn_click event saying that Public member 'WdWindowState' on type 'ApplicationClass' not found.
I'm finding I don't know enough about how to talk to Word. I think. Oi.
If you develop on a machine with VS2005 and Office 2003 but you want this code to work on a PC with Office XP
Hey again Robdog, and others... sorry for taking a long time to get back, I've been playing with the PIA's and learning the ins and outs, and how to get this code to work on an Office XP machine when compiling in a VS2005 environment with Office 2003 installed.
I found the best way to get this to work is to simply to get the XP PIAs and reference them instead.. the idea being building from the lowest common denominator will ensure backward compatibility.
So, for people doing what I'm doing here's an idea...
1) download the XP PIA's available from Microsoft. http://www.microsoft.com/downloads/d...displaylang=en
2) Extract them to some folder in your project dir (anywhere is ok, but for this example I'm saying extract to a folder named XP_PIA_COMs)
3) In visual studio...drop the project's reference to the version 11 (Office 2003) Microsoft.Office.Interop.Word.dll
4) Finally, Add a new reference to the OFFICE XP COM library by browsing to the XP_PIA_COMs directory chosing Microsoft.Office.Interop.Word.dll.
Now it will build properly using Early binding, it will run on a machine with Office 2003 and will also be backwards compatible to Office XP machines.
KEEP IN MIND, if you already develop on a machine with Office XP, you will by default have the XP (2002) PIAs, *and* you have less chance of encountering any issues.
A note re Late Binding: I believe even if you were to do this using a late binding reference, you would still have to have the XP PIAs. Late binding is a pain in VS2005 and this is by far an easier out... in my humble opinion.
Re: Advanced VB/Office Guru™ Word SpellChecker™.NET
Glad to see that you got it working now. Like I posted in #25, using the PIAs is a big advantage and makes life easier.
When needing to Late bind, you should add the reference like your early binding so you can get all the intellisense. Then when finished you can remove the reference and convert to late binding.
VB/Office Guru™ (AKA: Gangsta Yoda™ ®)
I dont answer coding questions via PM. Please post a thread in the appropriate forum.
Re: Advanced VB/Office Guru™ Word SpellChecker™.NET
There is no built in property or support for disabling the textbox but perhaps by subclassing the dialog window and sending a disable message it will work but allot of work for a small feature. Couldnt you just check after the dialog is dismissed?
VB/Office Guru™ (AKA: Gangsta Yoda™ ®)
I dont answer coding questions via PM. Please post a thread in the appropriate forum.
Re: Advanced VB/Office Guru™ Word SpellChecker™.NET
Warning 1 Function 'SpellMe' doesn't return a value on all code paths. A null reference exception could occur at run time when the result is used. 37 40 Programmers_Editor_v1 I keep getting this warning, and I can't fix it. Also, When I run it, everything runs fine, exept for when I want to check the spelling and I press the button, it doesn't do anything. Do you know what names I should give my text box and button? Here is my code.
Re: Advanced VB/Office Guru™ Word SpellChecker™.NET
thanks for the code. I'm using it in office 2003 + vb .net 2005 express. I found, sometimes, the word window will not close after the spell checker finish the work. is it normal? or, something I missed?
I noticed that if I only do spell check, it is ok. the problem always happens when I do grammer check.
Re: Advanced VB/Office Guru™ Word SpellChecker™.NET
I checked it. It doesn't matter doing grammer check only or with spell check, or spell check only. There is no WORD running at the background. When I do the check (grammer or spell) in the first time, it is always ok. WORD disappeared. But, in the background, there is a WORD process. So when you check it in the second time, if the text has error (grammer or spell), the WORD will show up and do the check, but it will not become disappear when the check finished. There is a WORD window (no doc in it) at the bottom. Sometimes, this focus will not come back to the program which calls the checker class. This WORD window gets the focus (although it is minimized).
I think the problem is: the checker class didn't quit WORD correctly.
I changed the code:
[vb]
If KillMe = True Then
moApp.Visible = False
End If
[/vb]
to
[vb]
Dim Ret As Boolean = KillMe ' just use the property's Get
moApp.Visible = False
[/vb]
The WORD window won't show up (of course, ), but the WORD process is still there, didn't quit. And sometimes, the spell checker window shows at below the current forum although it got focus.
I'm using winxp pro, vb express 2005 and XP_PIA_COMs (explained in #27).
I'll check more.
thanks
bear
Originally Posted by RobDog888
Thanks.
Doing a grammer check only or together with a spell check?
Re: Advanced VB/Office Guru™ Word SpellChecker™.NET
I noticed that in debug mode, this happens 1 out of 3 times, but if I run the program in release mode, this does not happen very often, but it happens.
Right now, what I do is:
when spell checker is launched, I check the process, if WinWord existed, then I ask users save and quit it. Then, in program, I use
' ''If KillMe = True Then
' '' moApp.Visible = False
' ''End If
Code:
Try
moApp.Quit(False, Nothing, Nothing)
Catch ex As Exception
gcLog.LogInfo("WORD Quit Error!")
Finally
moApp = Nothing
End Try
instead of
Code:
If KillMe = True Then
moApp.Visible = False
End If
This way, the spell checker dlg always gets focus and stays at the top when it is called. The cons are:
users have to save & quit word before launch spell checker;
But I do have a question. When the spell checker is launched in the first time, it takes some time, since it needs lauch WORD. In the program I quit WORD. SO, I think when I launch spell checker in the second (or later) time (without quiting the program which launch spell checker), it SHOULD take some time too since it will launch WORD again. However, I found in the second time, it is very fast, just like WORD is launched already although I can't see the process WinWord.
Actually, fast is good, just feel weird. Maybe it has certain relation with the OS? I guess,
Re: Advanced VB/Office Guru™ Word SpellChecker™.NET
No, if its not properly disposed of it will retain it in memory which is why the second run will be fast just like other second or subsequent runs. This is only for when there is an issue quitting word.
If you have it set so Word is destroyed each time with the KillMe = True, cause no running instance of Word was detected, then it will start up a new instance off Word and be slow. You can get over this by starting Word hidden when your app starts. Then it will just add docs and close docs as you spell check and be fast all the time. Then upon the app closing you kill that instance of Word.
VB/Office Guru™ (AKA: Gangsta Yoda™ ®)
I dont answer coding questions via PM. Please post a thread in the appropriate forum.
Re: Advanced VB/Office Guru™ Word SpellChecker™.NET
does it mean if the PC installed office 2007, then we have to use PIA for 2007 and recompile the program? if a PC installed PIA2007, and word 2002, will it work? how about on vista? anyone knows?