Clipboard wordt niet ververst?

Status
Niet open voor verdere reacties.

JeHaJe

Gebruiker
Lid geworden
1 okt 2005
Berichten
10
Bij een stukje VB-code voor de zgn. Kleurenmixer (bekend uit diverse lesboeken) loop ik tegen het volgende probleem aan.
Als ik het programma voor het eerst run, dan werkt het goed. Aan de hand van de gemaakte "kleurenmix" worden de RGB waardes gekopieerd als tekst naar het clipoard.
Als ik dezelfde handeling nog een keer doe, blijven de oude waarden op het clipboard staan. M.a.w: de nieuwe waarden worden blijkbaar niet meer gekopieerd.

Als workaround heb ik een command toegevoegd die eerst het clipboard leeg maakt. Als je deze gebruikt en daarna dan kleurenwaardes kopieert, komen ze weer wel op het clipboard. Waarom werkt het programma alleen als het clipbord leeg is? De bedoeling van deze les was juist om de melding te krijgen dat er al iets stond op het clipboard.


Zie de code (ook als bijlage):

Private Sub Form_Load()
Dim intT As Integer
'initialisaties
lblRood.BackColor = RGB(255, 0, 0)
lblGroen.BackColor = RGB(0, 255, 0)
lblBlauw.BackColor = RGB(0, 0, 255)
For intT = 0 To 2
vslKleur(intT).Value = 125
Next intT


End Sub

Private Sub mnuExit_Click()
Unload Me
End Sub

Private Sub mnuKopieer_Click()
'Aanvulling programma om te controleren
'of klembord leeg is voordat er iets naar
'toe wordt gekopieerd

'Declaratie lokale variabelen
Dim strInfo As String
Dim strTitel As String
Dim intIconEnKnop As Integer

'Staat er iets op het klembord ?
intIconEnKnop = vbCritical Or vbOKCancel
strTitel = "Pas Op !"
With Clipboard
If .GetFormat(vbCFText) Then
strInfo = " tekst "
ElseIf .GetFormat(vbCFBitmap) Then
strInfo = " een Bitmap "
ElseIf .GetFormat(vbCFMetafile) Then
strInfo = " een Metafile "
ElseIf .GetFormat(vbCFDIB) Then
strInfo = " een device independent Bitmap "
ElseIf .GetFormat(vbCFPalette) Then
strInfo = " een kleurenpalet "
ElseIf .GetFormat(vbCFLink) Then
strInfo = " een DDE informatie "

Else
strInfo = ""
End If
End With

'Staat er iets op het klembord dan boodschap geven

If strInfo <> "" Then
If MsgBox("Er staat" & strInfo & "op het klembord," & _
"vervangen?", intIconEnKnop, Titel) <> vbOK Then
Exit Sub
End If
End If


'RGB functie naar klembord
Clipboard.SetText "RGB(" & CStr(vslKleur(0).Value) & "," & _
CStr(vslKleur(1).Value) & "," & CStr(vslKleur(2).Value) & ")"


End Sub

Private Sub mnuOver_Click()
'Declaratie lokale variabelen
Dim strInfo As String
strInfo = "Dit programma maakt onderdeel uit van" & vbCrLf & vbCrLf
strInfo = strInfo & "Progammer's Delight versie 6" & vbCrLf & vbCrLf
strInfo = strInfo & "Copyright 2002, IPAA Service" & vbCrLf
MsgBox strInfo, vbInformation, "PD! Kleurenmixer"

End Sub

Private Sub mnuWerking_Click()
'Declaratie lokale variabelen
Dim Info As String, Titel As String
Info = "Meng de gewenste kleur" & vbCrLf
Info = Info & "en klik op Kopieer." & vbCrLf
Info = Info & "Ga naar uw Visual Basic-programma" & vbCrLf
Info = Info & "en plak de RGB-functie in uw code" & vbCrLf
MsgBox Info, vbInformation, "PD! Kleurenmixer"
End Sub

Private Sub vslKleur_Change(Index As Integer)
'handel aanpassingen in één van de schuiven af
lblMixer.BackColor = RGB(vslKleur(0).Value, vslKleur(1).Value, vslKleur(2).Value)
lblRood = Format((vslKleur(0).Value / 2.55), "0.0") & "%"
lblGroen = Format((vslKleur(1).Value / 2.55), "0.0") & "%"
lblBlauw = Format((vslKleur(2).Value / 2.55), "0.0") & "%"
End Sub


Groet,
JHBekijk bijlage KleurenMixer.rar
 
Als ik je vrag goed begrijp:

als je wilt weten wat er op het clipboard staat (dus ook of er IETS op het clipboard staat) is de code daarvoor:
Code:
Dim text As String
text = Clipboard.GetText
MsgBox Len(text)
de msgbox geeft (als je bijvoorbeeld 15 tekens hebt op je clipboard) "15".

Op deze manier zou je dus een routine kunnen inbouwen om eerst te vragen of iemand het clipboard wilt legen.

Code:
Dim text as string
text = Clipboard.getText
if len(text) > 0 then
msgbox "Er staat al iets op het Clipboard! Deze text is: " & text
[COLOR="SeaGreen"]'Doe hier iets (de gebruiker laten kiezen om het clipboard leeg te maken bijvoorbeeld)[/COLOR]
elseif len(text) < 0 then
clipboard.SetText
end if

Dit is maar een voorbeeld maar je kan het uitbreiden zoals je wilt.


Succes, V! :thumb:
 
Vegras,
Dank je voor de tip. Het pobleem is hier nog niet mee opgelost, maar uiteraard
is de info altijd welkom.

Ik zal nog een poging doen om het probleem te beschrijven:

Het betreft de zgn. Kleurenmixer (zie EXE). Hiermee kun je via scrollbars een bepaalde kleurenmix samenstellen, waarbij de mix getoond wordt. Door de menu-optie "kopieer" kun je de kleurenmix als RGB waarden (in textvorm) kopieren naar het windows clipboard (om vervolgens ergens anders te plakken).

Vanwege het probleem heb ik zelf een "clear clipboard" button toegevoegd aan het progje en heb ik een leeg textveld toegevoegd (met als doel om de verschillende
uitkomsten te kunnen plakken).


De routine controleert eerst of er al iets op het clipboard staat. Zo ja; dan komt melding met vraag of je deze wilt overschrijven.

Het volgende vreemde fenomeen doet zich voor;

- start het programma
- start notepad
- maak clipboard leeg via Clear Clipboard (om met een leeg clipboard te kunnen beginnen).
- kies een bepaalde kleuren combinatie dmv scrollbars
- klik op "kopieer" en plak daarna de tekst in het witte text venster van het form => de RGB waarden worden getoond.
- kopieer ook de tekst in notepad => dezelfde RGB waarden worden getoond.
- kies nu een andere kleurencombinatie met de scrollbars
- klik op "kopieer" en bevestig de vraag voor het mogen overschrijven van het clipboard.
- plak de tekst in het text venster van het form => de gewijzigde RGB waarden worden getoond.
- ga nu weer naar notepad
- kopieer de tekst => de oude(!) RGB waarden worden getoond!

Het lijkt er dus op dat het clipboard binnen de VB-applicatie wel goed wordt ververst, maar buiten VB lukt dat alleen als er geen data in staat. De oude data wordt niet ververst/overschreven.

Rara, hoe kan dat?

JH
 

Bijlagen

ha, ik heb (volgens mij) de oplossing gevonden
het punt was, dat als je vroeg of de gebruiker het clipboard wilde overschrijven, je in de code alleen had neergezet dat als de gebruiker dat NIET deed, er niets moest gebeuren. Er moest dus nug bij dat het het clipboard eerst wisde en WEL overschreef.

mischien een beetje verwarrend, hier de code:
Code:
[COLOR="Green"] 'Staat er iets op het klembord dan boodschap geven[/COLOR]
   
    If strInfo <> "" Then
        If MsgBox("Er staat" & strInfo & "op het klembord," & _
             "vervangen?", intIconEnKnop, Titel) <> vbOK Then
            Exit Sub
        End If
    End If
Dit moet je vervangen door:
Code:
  [COLOR="green"] 'Staat er iets op het klembord dan boodschap geven[/COLOR]
    If strInfo <> "" Then
        If MsgBox("Er staat" & strInfo & "op het klembord," & _
             "vervangen?", intIconEnKnop, Titel) <> vbOK Then
            Exit Sub
[COLOR="Green"]'Als de gebruiker op "ja" klikt, moet het clipboard gewist worden voordat verder gegaan kan:[/COLOR]
        Else
        Clipboard.Clear
        End If
    End If


Bij mij werkt het zo wel, dus als het goed is is hier je antwoord.
V :thumb:
 
Laatst bewerkt:
.....Bij mij werkt het zo wel, dus als het goed is is hier je antwoord.
V :thumb:

Bedankt. Het werkt nu helemaal goed.

Ik snap alleen nog steeds niet waarom het met mijn code wel goed gaat binnen de VB-applicatie. (De copy/past acties kun je telkens uitvoeren in de textbox
en iedere keer krijg je andere RGB waardes te zien(als je tenminste telken de kleurenmix aanpast).

Waarom gaat dit niet goed als je de copy/past uitvoert naar notepad?
JH
 
ik weet het niet, maar heb zelf (wel) last van dit "probleem":

Ik kopier een stuk text vanaf een (bijvoorbeeld) website.
Ik open vb en maak een textbox op een form,
als ik in runtime dan ctrl+v druk is het clipboard opeens leeg
(ook met clipboard. in een textbox in de form_load ook: niets)

Ik denk dat bij het laden van vb je clipboard leeggemaakt word, maar waarom/altijd weet ik niet. Iemand anders?
Ik weet verder ook niet waarom vb het met clipboard wel in vb zelf wel werkt, maar daarbuiten niet.


V :thumb:
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan