Solved

Bug + Clipboard Problems

Posted on 2001-07-11
14
417 Views
Last Modified: 2013-11-25
Hello.

I have, in my current project a Form with a RichTextBox control placed on it. A user is able to open a new document and type into it, or open a text file and have the text placed into another instance of this RichTextBox control.

Once this happens, the user may select a menu or click on a button which invokes a function named CheckSpelling() which is coded in the General declaration of the Form which contains this control.

Here are the problems:

In the frmMDIMain's Option Explicit section, the following is declared:

Private actCtl As Control

The spell checker part of the program works. It starts Word and takes the text within the control and copies it into Word and then invokes the spell checker of Word(97).

When it exits, the program crashes. It crashes two different ways.

1st, within the mnuEditPaste_Click event it crashes with this -
 "object doesn't support property or method"

OR 2nd, it crashes with this -

 "Can't open Clipboard"
   
    actCtl.SelText Clipboard.GetText


I understand the first error, because what is being attempted here is to determine what the active control here is and SelText is only a method of a TextBox, ComboBox, ImageBox or a RichTextBox.

I changed this variable declaration to -

Private actCtl As RichTextBox

This worked. For the very first time, I could type something into a new document, invoke the CheckSpelling() function, make corrections and have those corrections pasted back into the original document.

Then I tried it again; and again.

Then it crashed with other, less occuring run-time error -

"Can't open Clipboard."



Any thoughs on this actCtl variable and is there some sort of code management needed to be applied here for the Clipboard? My version of MSDN help showed that there were some VB constants for determining what type of data was to be sent (copied) to the Clipboard, vbCFText, but I couldn't find any more info on it. The Object Browser didn't include any info on these constants.

With actCtl As RichTextBox,

what is the problem with...
actCtl.SelText Clipboard.GetText
???

Jim
0
Comment
Question by:jnowlin
  • 4
  • 4
  • 2
  • +3
14 Comments
 
LVL 6

Expert Comment

by:JonFish85
ID: 6273762
I vote for using the API:

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Const WM_PASTE = &H302
Private Const WM_COPY = &H301
Private Const WM_CUT = &H300


then:

Private Sub cmdCopy_Click()
  SendMessage txtTextBoxName.hWnd, WM_COPY, 0, 0
End Sub

Private Sub cmdCut_Click()
  SendMessage txtTextBoxName.hWnd, WM_CUT, 0, 0
End Sub

Private Sub cmdPaste_Click()
  SendMessage txtTextBoxName.hWnd, WM_PASTE, 0, 0
End Sub


try this if you dont want to use the API:

actCtl.SelText = Clipboard.GetData
or
actCtl.SelText = Clipboard.GetText
0
 
LVL 8

Expert Comment

by:Dave_Greene
ID: 6273813
I would try loading the text into the RTB, then selecting it

with actCtl
  .Text = Clipboard.GetText
  .selstart = 0
  .sellength = len(actCrl.text)
end with
0
 
LVL 17

Expert Comment

by:inthedark
ID: 6274513
Why? > Private actCtl As Control

I think Private means only you can access it. What happens if you change as follows?

Public actCtl As Control
0
 
LVL 16

Expert Comment

by:Richie_Simonetti
ID: 6274984
hearing...
0
 
LVL 8

Expert Comment

by:glass_cookie
ID: 6275470
How about doing this:

actCtl.SelText = Clipboard.GetText, vbRichtext 'Can't remember which one.
'Just check out the clipboard formats and choose the one that's richtext format.

just a note: Make sure that MS Word, excel and powerpoint is NOT running that that time as those programs would like to dominate the clipboard (don't know why there's such a need) and it would deny all accesses from many other VB programs.

On the other hand, you may want to try this:

Dim MyString as String
MyString = Clipboard.GetText
actctl.SelText = My String

Yet on the other hand, if you're quite sure the user doesn't have text (check using the instr method) thaqt's { } or + then use sendkeys to send the stuff:

actctl.SetFocus (if there's such a property)
sendkeys Clipboard.gettext

That's it!

glass cookie : )
0
 

Author Comment

by:jnowlin
ID: 6278053
Well JonFish85,

Your API code doesn't crash the program. I substituted:

SendMessage frmRTFDisplay.rtfDisplay.hWnd, WM_PASTE, 0, 0

for the original call:
SendMessage txtTextBoxName.hWnd, WM_PASTE, 0, 0

I fire up a new frmRTFDisplay and type some characters into it and click on the spell checker. Word comes up, whether I select Cancel or Change, the only thing that happens is that I get a new instance of the Form. I close this. I close the original Form, the one that got the text entered into it, and my QueryUnload event fires and prompts me that there were changes made, although they weren't seen visually.


Dave_Green,

I tried yours. I still get the run-time error "can't open clipboard." This Clipboard thing is a real brain picker.

inthedark,

Changing the variable to Public from Private made no difference. Origianlly, the idea was to detect the active form. Dim actCtl As Control,
the Control datatype has no SelText method. So long as the app is only using RichTextBox text, actCtl *must* be defined as a RichTextBox....I think
Unless...
there's such a thing as:
If Screen.ActiveControl = RichTextBox Then......

glass_cookie,

I tried. This remains a nagging Clipboard problem.


Why cannot the Clipboard be opened sometimes and opened other times? This is a puzzler.
I tried:
Dim bData As Boolean
bData = Clipboard.SetData(vbCFText)
Or
bData = frmRTFDisplay.SetData(vbCFText)

If bData = ? Then ....

Jim
0
 
LVL 17

Expert Comment

by:inthedark
ID: 6278927
The clipboard can be locked and unlocked I suspect that there is a bug in an app which is not handling the clipboard in the best way.

Before you put data on the clipboard you must use the clear method:

Clipboard.Clear
Clipboard.Settext "My Text"


<FLAME>

The clipboard is a Microsoft Cock-up.  Nobody was realy made responsible for ths clipboard at Microsoft, (or if they were they must have been on night shift).  The Windows 95 and Outlook and VB programmers must have been living on diffenent planets.

The main problem is that Microsoft refuse to publish their internal documentation for it. And so even their own programmers don't know whats going on.

I raised an indecent with Microsoft last year chich lasted for 3 months

All I wanted to do was to drag (copy) and drop a file onto the clipboard or into an Outlook message.

In windows 95 the code they advised me to use deleted the file? And Outook just would not enable the File list (format 15).

After 3 months they begged me to clos the issue and ask my cleinst to upgrade to NT and outlook 2000.

</FLAME>




To fix your problem try calling CloseClipboard before you use it.

You will need:

Private Declare Function CloseClipboard Lib "user32" () As Long


0
What Is Threat Intelligence?

Threat intelligence is often discussed, but rarely understood. Starting with a precise definition, along with clear business goals, is essential.

 
LVL 8

Expert Comment

by:glass_cookie
ID: 6279237
Hi!

How about doing this:

using the vbCFRTF format rather than vbCFText as cvCFText is plain text like in notepad.

On the other hand, place the statement:

On Error Resume Next

Before your Clipboard.Gettext statement.

See if you are still able to get the clipboard contents or not.

The last resort would be to so this:

richtextbox.Setfocus '(if there's such a property)
Sendkeys "^V"

The above code would paste manually rather than programmatically retrieve the clipboard contents.

That's it!

glass cookie : )
0
 
LVL 16

Expert Comment

by:Richie_Simonetti
ID: 6280767
did you try with:
actCtl.SelRTF Clipboard.GetData



0
 

Author Comment

by:jnowlin
ID: 6287730
Yes Richie_Simonetti, I did try your suggestion.
Please, read on.....

But today, after going 12 rounds with this, when I put in
On Error Resume Next the program didn't crash. Just for kicks, I clicked on my Paste menu item. Guess what..
it pasted the corrected, Word spell-checked text into this RichTextBox control of mine!!

Here's the function CheckSpelling, defined on my frmRTFDisplay:

Public Sub Check_Spelling()
'must have added Word as a reference!

 
    Dim wordApp As Word.Application
    Dim wordDoc As Word.Document
    Screen.MousePointer = vbHourglass
    Set wordApp = New Word.Application
    ' this allows us to see it work
    wordApp.Visible = True
       
    Set wordDoc = wordApp.Documents.Add
     On Error Resume Next
     
    'clear the clipboard
    Clipboard.Clear
   
    'close the clipboard using function from 'inthedark'
    CloseClipboard
   
   'copy text to the clipboard
    Clipboard.SetText rtfDisplay.TextRTF, vbCFRTF
   
    'paste to word
    wordDoc.Range.Paste
   
    'check the spelling
    wordDoc.CheckSpelling
   
    ' make sure that Word is in the foreground
    wordDoc.Activate
   
    'select all of the text that was copied
     wordDoc.Select
   
    'send CTRL+C to copy to the clipboard
    SendKeys "^c", True
   
    'close Word w/o save
    wordDoc.Close False
   
    'quit MS Word
    wordApp.Quit
   
    ' put the focus on the RichTextBox control
    rtfDisplay.SetFocus
   
    'delete original text in the control
    rtfDisplay.Text = ""
   
    ' paste text from clipboard by calling the mnuEditPaste_Click event
    SendKeys "^v", True
   
    ' and clear the clipboard
    Clipboard.Clear
   
    'destroy the objects
    Set wordDoc = Nothing
    Set wordApp = Nothing

    Screen.MousePointer = vbDefault
End Sub


Now, I added a MsgBox to the mnuEditPaste_Click event as follows:

On Error Resume Next
   
    MsgBox "Click 'OK' and text will be 'pasted'.", vbOKOnly, "Microsoft Clipboard Problem"
    CloseClipboard
    actCtl.SelRTF = Clipboard.GetText
    actCtl.SetFocus
    actCtl.SelStart = 0
    Clipboard.Clear

And, you may ask? When I click on the OK button, the corrected text is there!


Was the code running too fast for Microsoft's Windows 2000's Clipboard that I needed to add a message box to slow it down in order for it to work?!?!?

Jim
0
 
LVL 17

Expert Comment

by:inthedark
ID: 6288865
I purchased the Wintertree spell checker, this works really well and didn't cost too much, (I got a customer to pay for it).

http://www.wintertree-software.com/press/sscejavasdk2.html
0
 
LVL 17

Accepted Solution

by:
inthedark earned 100 total points
ID: 6288868
The advantage with not using the MW Word spell checker is that your app wil work on systems without Microsoft Office.
0
 

Author Comment

by:jnowlin
ID: 6290197
Is that the WSpell ActiveX Control that you refer to inthedark? It sounds like *THE* solution to this problem.
Jim
0
 

Author Comment

by:jnowlin
ID: 6305330
Thanks inthedark.

I opted for the eval version of the WSpell ActiveX control to give it a try.
I had completely ignored the fact that some of us don't have and probably don't want Office95, 97, 2000, XP, etc.

So, I eagerly await the download instructions from the folks at WinterTree. In the meantime, the spell checker works, although it's horrendously choppy and sloppy.
This has been Microsoft's finest hour. Scary. Isn't it?

Jim Nowlin
0

Featured Post

Better Security Awareness With Threat Intelligence

See how one of the leading financial services organizations uses Recorded Future as part of a holistic threat intelligence program to promote security awareness and proactively and efficiently identify threats.

Join & Write a Comment

When designing a form there are several BorderStyles to choose from, all of which can be classified as either 'Fixed' or 'Sizable' and I'd guess that 'Fixed Single' or one of the other fixed types is the most popular choice. I assume it's the most p…
Enums (shorthand for ‘enumerations’) are not often used by programmers but they can be quite valuable when they are.  What are they? An Enum is just a type of variable like a string or an Integer, but in this case one that you create that contains…
Get people started with the process of using Access VBA to control Excel using automation, Microsoft Access can control other applications. An example is the ability to programmatically talk to Excel. Using automation, an Access application can laun…
Get people started with the utilization of class modules. Class modules can be a powerful tool in Microsoft Access. They allow you to create self-contained objects that encapsulate functionality. They can easily hide the complexity of a process from…

744 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

13 Experts available now in Live!

Get 1:1 Help Now