Announcement

Collapse

Forum Guidelines

This forum is for finished source code that is working properly. If you have questions about this or any other source code, please post it in one of the Discussion Forums, not here.
See more
See less

Word COM Spell Check

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • Word COM Spell Check

    Maybe this will be useful. I certainly have a hard time spelling
    some words. All comments welcome. I have a nice ABC block icon
    PBR if anyone wants it.

    Code:
    #PBFORMS Created
    '--------------------------------------------------------------------------------
    ' The first line in this file is a PBForms metastatement.
    ' It should ALWAYS be the first line of the file. Other
    ' PBForms metastatements are placed at the beginning and
    ' ending of blocks of code that should be edited using
    ' PBForms only. Do not edit or delete these
    ' metastatements or PBForms will not be able to reread
    ' the file correctly. See the PBForms documentation for
    ' more information.
    ' Beginning blocks begin like this: #PBForms Begin ...
    ' Ending blocks begin like this:    #PBForms End ...
    ' Other PBForms metastatements such as:
    '     #PBForms Declarations
    ' are used to tell PBForms where to insert additional
    ' code. Feel free to make changes anywhere else in the file.
    '--------------------------------------------------------------------------------
    '
    '***************************Word dependent spell check***************************
    'This will work with at least Word 97 & 2000.
    'oword9.inc if you haven't done it yet is created by Com browser.
    'Easy to select all interfaces and save to file.
    'My Word.Application.9 will not work with .8. I have 97 and 2000.
    'You should probably make *.inc for your version.
    'App works with 3 PC's all running Win98SE. For some reason I have not discovered
    'there is a bug that shows up in my fourth, wife's machine. Word does not always
    'open first time for her. It does always open second try. No idea...tried every
    'PB trick I could find. That includes everything you can see in OBJACTIVE Function
    'Help plus links. If anyone has ideas I should like to hear from you.
    #COMPILE EXE
    #DIM ALL
    #INCLUDE "oword9.inc"
    
    '--------------------------------------------------------------------------------
    '   ** Includes **
    '--------------------------------------------------------------------------------
    #PBFORMS Begin Includes
    #RESOURCE "SpellCheck.pbr"
    #IF NOT %DEF(%WINAPI)
        #INCLUDE "WIN32API.INC"
    #ENDIF
    #PBFORMS End Includes
    '--------------------------------------------------------------------------------
    
    '--------------------------------------------------------------------------------
    '   ** Constants **
    '--------------------------------------------------------------------------------
    #PBFORMS Begin Constants
    %IDD_SPELLCHECK     = 101
    %IDR_IMGFILE1       = 102
    %IDC_CHECKSPELLING  = 1001
    %IDC_QUIT           = 1002
    %IDC_LABEL1         = 1003
    %IDC_SPELLCHECKBOX  = 1004
    #PBFORMS End Constants
    $AppTitle = "Spell Check"
    
    GLOBAL DialogWindow AS DWORD 'If you use PBForms this is an easy way to use handle.
    '--------------------------------------------------------------------------------
    
    '--------------------------------------------------------------------------------
    '   ** Declarations **
    '--------------------------------------------------------------------------------
    DECLARE CALLBACK FUNCTION ShowSPELLCHECKProc()
    DECLARE FUNCTION SampleListBox(BYVAL hDlg AS DWORD, BYVAL lID AS LONG, BYVAL _
        lCount AS LONG) AS LONG
    DECLARE FUNCTION ShowSPELLCHECK(BYVAL hParent AS DWORD) AS LONG
    DECLARE SUB DisplayResult(msg AS STRING)
    #PBFORMS Declarations
    '--------------------------------------------------------------------------------
    'Function provided by Lance. This function is more helpful than a bunch of numbers.
    '***Highly recommended***
    FUNCTION ObjErr(BYVAL pbError AS LONG, BYVAL dError AS DWORD) AS STRING
        LOCAL pBuffer   AS ASCIIZ PTR
        LOCAL ncbBuffer AS DWORD
        LOCAL a$
    
        ncbBuffer = FormatMessage(%FORMAT_MESSAGE_ALLOCATE_BUFFER OR _
            %FORMAT_MESSAGE_FROM_SYSTEM OR %FORMAT_MESSAGE_IGNORE_INSERTS, _
            BYVAL %NULL, dError, BYVAL MAKELANGID(%LANG_NEUTRAL, %SUBLANG_DEFAULT), _
            BYVAL VARPTR(pBuffer), 0, BYVAL %NULL)
    
        IF pbError THEN a$ = "(PB Error =" & STR$(pbError) & ")"
    
        IF ncbBuffer THEN
            a$ = " " & @pBuffer & " (&H" & HEX$(dError, 8) & ") " + a$
            REPLACE $CRLF WITH "" IN a$
            FUNCTION = a$
            LocalFree pBuffer
        ELSE
            FUNCTION = " Unknown error (&H" & HEX$(dError, 8) & ") " + a$
        END IF
    END FUNCTION
    
    FUNCTION CheckSpelling(BYVAL hDlg AS DWORD) AS LONG
        DIM oWordApp AS WordApplication 'Object or Dispatch variables
        DIM oWordDocs AS WordDocuments
        DIM oWordSel AS WordSelection
        DIM oWordDiag AS WordDialog
    
        DIM vVnt AS VARIANT      'Everything coming or going has to be Variant.
        DIM vText AS VARIANT
        DIM vBool AS VARIANT
        DIM vDiag AS VARIANT
        DIM vCorrect AS VARIANT
        DIM lOrigTop AS VARIANT
    
        LOCAL SpellWord AS STRING
        LOCAL SpaceFind AS LONG
    
    
        CONTROL GET TEXT DialogWindow, %IDC_SPELLCHECKBOX TO SpellWord
        IF SpellWord = "" THEN EXIT FUNCTION
        SpaceFind = INSTR(SpellWord, " ")
        'Should check for all manner of illegal charactors here but I havn't yet
        IF SpaceFind > 0 THEN
            MSGBOX "Please enter only one word without spaces.", %MB_ICONINFORMATION, $AppTitle
            EXIT FUNCTION
        END IF
    
        ' Open an instance of MSWORD *Copy and paste from OWord.bas Lots of that here.
        SET oWordApp = WordApplication IN "Word.Application"
        IF ISFALSE ISOBJECT(oWordApp) THEN _
            SET oWordApp = NEW WordApplication IN "Word.Application"
    
        'Could MSWORD be opened? If not, terminate this app
        IF ISFALSE ISOBJECT(oWordApp) THEN
            MSGBOX "Unable to open Word."  '***This is where my wifes machine ends up.***
            EXIT FUNCTION
        END IF
    
        LET vVnt = 0
        OBJECT CALL oWordApp.Documents.Add TO vVnt
        IF OBJRESULT OR ERR THEN
            MSGBOX "oWordApp.Documents.Add:  " & ObjErr(ERRCLEAR, OBJRESULT) & STR$(VARIANT#(vVnt)), %MB_ICONEXCLAMATION
            EXIT FUNCTION
        END IF
        SET oWordDocs = vVnt
    
        OBJECT GET oWordApp.Selection TO vVnt
        IF OBJRESULT OR ERR THEN
            MSGBOX "oWordApp.Selection:  " & ObjErr(ERRCLEAR, OBJRESULT) & STR$(VARIANT#(vVnt)), %MB_ICONEXCLAMATION
            EXIT FUNCTION
        END IF
        SET oWordSel = vVnt
    
        LET vText = SpellWord
        OBJECT LET oWordSel.Text = vText 'Puts in and selects word to spell
    
        LET vDiag = %wdDialogToolsSpellingAndGrammar   'Got this from Microsoft.
        OBJECT CALL oWordApp.Dialogs.Item(vDiag) TO vVnt  'Gets interface to spell check dialog
        IF OBJRESULT OR ERR THEN
            MSGBOX "oWordDiag.Dialogs.Item(vDiag):  " & ObjErr(ERRCLEAR, OBJRESULT) & STR$(VARIANT#(vVnt)), %MB_ICONEXCLAMATION
            EXIT FUNCTION
        END IF
        SET oWordDiag = vVnt
    
        ' Make MSWORD visible
        LET vBool = 1
        OBJECT LET oWordApp.Visible = vBool  'Make word visible so you can hide it.
        IF OBJRESULT OR ERR THEN
            MSGBOX "oWordApp.Visible = vBool:  " & ObjErr(ERRCLEAR, OBJRESULT) & STR$(VARIANT#(vVnt)), %MB_ICONEXCLAMATION
            EXIT FUNCTION
        END IF
    
        OBJECT GET oWordApp.Top TO lOrigTop  'This from Microsoft also
        IF OBJRESULT OR ERR THEN
            MSGBOX "oWordApp.Top TO lOrigTop:  " & ObjErr(ERRCLEAR, OBJRESULT) & STR$(VARIANT#(vVnt)), %MB_ICONEXCLAMATION
            EXIT FUNCTION
        END IF
    
        LET vVnt = 0
        OBJECT LET oWordApp.WindowState = vVnt 'Ditto
        IF OBJRESULT OR ERR THEN
            MSGBOX "oWordApp.WindowState = vVnt:  " & ObjErr(ERRCLEAR, OBJRESULT) & STR$(VARIANT#(vVnt)), %MB_ICONEXCLAMATION
            EXIT FUNCTION
        END IF
    
        LET vVnt= -3000                  'And more from Bill
        OBJECT LET oWordApp.Top = vVnt
        IF OBJRESULT OR ERR THEN
            MSGBOX "oWordApp.Top = vVnt:  " & ObjErr(ERRCLEAR, OBJRESULT) & STR$(VARIANT#(vVnt)), %MB_ICONEXCLAMATION
            EXIT FUNCTION
        END IF
    
        OBJECT CALL oWordDiag.Show TO vBool 'Makes visible %wdDialogToolsSpellingAndGrammar
        IF OBJRESULT OR ERR THEN
            MSGBOX "oWordDiag.Show:  " & ObjErr(ERRCLEAR, OBJRESULT) & STR$(VARIANT#(vVnt)), %MB_ICONEXCLAMATION
            EXIT FUNCTION
        END IF
    
        LET vVnt = 0
        OBJECT LET oWordApp.Selection.Start = vVnt 'Puts at start and selects correctly spelled word
        IF OBJRESULT OR ERR THEN
            MSGBOX "oWordApp.Selection.Start:  " & ObjErr(ERRCLEAR, OBJRESULT) & STR$(VARIANT#(vVnt)), %MB_ICONEXCLAMATION
            EXIT FUNCTION
        END IF
    
        OBJECT GET oWordApp.Selection.Text TO vCorrect 'Get selected correctly spelled word
        IF OBJRESULT OR ERR THEN
            MSGBOX "oWordApp.Selection.Copy:  " & ObjErr(ERRCLEAR, OBJRESULT) & STR$(VARIANT#(vVnt)), %MB_ICONEXCLAMATION
            EXIT FUNCTION
        END IF
    
        'Dialog returns true if word is changed, false if no change.
        IF ISTRUE VARIANT#(vBool) = -1 THEN CONTROL SET TEXT DialogWindow, %IDC_SPELLCHECKBOX, VARIANT$(vCorrect)
    
        '
        IF SpellWord = VARIANT$(vCorrect) AND ISTRUE VARIANT#(vBool) = -1 THEN _
            CONTROL SET TEXT DialogWindow, %IDC_SPELLCHECKBOX, SpellWord + " ...is spelled correctly."
    
    
        Terminate:
            LET vVnt = %wdDoNotSaveChanges  'Another tidbit from Microsoft
            OBJECT CALL oWordApp.Documents.Close(vVnt) 'Close without saving changes
            IF OBJRESULT OR ERR THEN
                MSGBOX "oWordApp.Documents.Close(vVnt):  " & ObjErr(ERRCLEAR, OBJRESULT) & STR$(VARIANT#(vVnt)), %MB_ICONEXCLAMATION
                EXIT FUNCTION
            END IF
    
            LET vVnt= 0
            OBJECT LET oWordApp.Top = vVnt 'My machine with Word 97 developed a profound desire to stay minimized without this.
            IF OBJRESULT OR ERR THEN
                MSGBOX "oWordApp.Top = vVnt:  " & ObjErr(ERRCLEAR, OBJRESULT) & STR$(VARIANT#(vVnt)), %MB_ICONEXCLAMATION
                EXIT FUNCTION
            END IF
    
            OBJECT CALL oWordApp.Quit 'Close Word.
            ' Close all of the Interfaces
            SET oWordSel  = NOTHING
            SET oWordDocs  = NOTHING
            SET oWordApp  = NOTHING
            SET oWordDiag = NOTHING
    
        FUNCTION = %TRUE
    END FUNCTION
    
    
    FUNCTION PBMAIN()
    
        ShowSPELLCHECK %HWND_DESKTOP
    
        FUNCTION = %TRUE
    END FUNCTION
    '--------------------------------------------------------------------------------
    
    '--------------------------------------------------------------------------------
    '   ** CallBacks **
    '--------------------------------------------------------------------------------
    CALLBACK FUNCTION ShowSPELLCHECKProc()
        LOCAL SetSelection AS LONG
        LOCAL SpellCheck AS STRING
        SELECT CASE CBMSG
            CASE %WM_INITDIALOG  'Select opening string so you will not have to.
                CONTROL SEND CBHNDL, %IDC_SPELLCHECKBOX, %EM_SETSEL, 0, 71
                CONTROL SET FOCUS CBHNDL, %IDC_SPELLCHECKBOX
            CASE %WM_COMMAND
                SELECT CASE CBCTL
                    CASE %IDC_CHECKSPELLING
                        IF CBCTLMSG = %BN_CLICKED OR CBCTLMSG = 1 THEN
                            CALL CheckSpelling(CBHNDL)
                        END IF
                    CASE %IDC_QUIT
                        IF CBCTLMSG = %BN_CLICKED OR CBCTLMSG = 1 THEN
                            DIALOG END CBHNDL, 0
                        END IF
                    CASE %IDC_LABEL1
                    CASE %IDC_SPELLCHECKBOX
    
                END SELECT
        END SELECT
    
    END FUNCTION
    
    '--------------------------------------------------------------------------------
    '   ** Dialogs **
    '--------------------------------------------------------------------------------
    FUNCTION ShowSPELLCHECK(BYVAL hParent AS DWORD) AS LONG
        LOCAL lRslt AS LONG
    #PBFORMS Begin Dialog %IDD_SPELLCHECK->->
        LOCAL hDlg AS DWORD
    
        DIALOG NEW hParent, "Spell Check", 206, 127, 302, 59, %WS_POPUP OR _
            %WS_BORDER OR %WS_DLGFRAME OR %WS_CAPTION OR %WS_SYSMENU OR _
            %WS_CLIPSIBLINGS OR %WS_VISIBLE OR %DS_MODALFRAME OR %DS_3DLOOK OR _
            %DS_NOFAILCREATE OR %DS_SETFONT, %WS_EX_WINDOWEDGE OR _
            %WS_EX_CONTROLPARENT OR %WS_EX_LEFT OR %WS_EX_LTRREADING OR _
            %WS_EX_RIGHTSCROLLBAR, TO hDlg
        DIALOG SET ICON hDlg, "#" + FORMAT$(%IDR_IMGFILE1)
        CONTROL ADD BUTTON, hDlg, %IDC_CHECKSPELLING, "Check Spelling", 5, 40, 55, _
            15, %WS_CHILD OR %WS_VISIBLE OR %WS_TABSTOP OR %BS_TEXT OR _
            %BS_PUSHBUTTON OR %BS_DEFPUSHBUTTON OR %BS_CENTER OR %BS_VCENTER, _
            %WS_EX_LEFT OR %WS_EX_LTRREADING
        CONTROL ADD BUTTON, hDlg, %IDC_QUIT, "Quit", 245, 40, 50, 15
        CONTROL ADD LABEL, hDlg, %IDC_LABEL1, "Spelling Checked by Microsoft Word", _
            90, 5, 120, 10
        CONTROL ADD TEXTBOX, hDlg, %IDC_SPELLCHECKBOX, "Type word to check here...", _
            5, 15, 290, 13, %WS_CHILD OR %WS_VISIBLE OR %WS_TABSTOP OR %ES_LEFT OR _
            %ES_AUTOVSCROLL, %WS_EX_CLIENTEDGE OR %WS_EX_LEFT OR %WS_EX_LTRREADING _
            OR %WS_EX_RIGHTSCROLLBAR
    
    #PBFORMS End Dialog
    
        DialogWindow = hDlg
    
        DIALOG SHOW MODAL hDlg, CALL ShowSPELLCHECKProc TO lRslt
    
        FUNCTION = lRslt
    END FUNCTION
    Thanks to Tom for telling me about that UBB [ Code] thing.

    ------------------
Working...
X