Clipboard

25/05/2011 - 15:39 von Lothar Geyer | Report spam
Heute bekam ich zum ersten Mal den Fehler 521 "Zwischenablage kann nicht
geöffnet werden" zu Gesicht. Entsprechend der Empfehlung von Microsoft
möchte ich nun ein kleines "Sleep" mit einem Resume einbauen. Dabei ist
natürlich die Frage, wie lange das Mittagsschlàfchen dauern soll. Ich
habe aber nirgend wo etwas über die Lànge eines Timeouts gefunden.

Zum Verstàndnis: wie ist das dann, wenn ich z.B.

.SetText "ABC"
.Sleep 2000
.GetText

ausführe? Kann mit da eine andere Anwendung dazwischen funken oder gibt
es so etwas wie eine "Transaktion"?

Lothar Geyer
 

Lesen sie die antworten

#1 Wolfgang Enzinger
07/06/2011 - 00:16 | Warnen spam
Lothar Geyer wrote:

Heute bekam ich zum ersten Mal den Fehler 521 "Zwischenablage kann nicht
geöffnet werden" zu Gesicht. Entsprechend der Empfehlung von Microsoft
möchte ich nun ein kleines "Sleep" mit einem Resume einbauen.



Also der OH entnehme ich nicht, dass zu einem Sleep geraten wird, sondern
"stellen Sie ein Meldungsfeld mit den Schaltflàchen Wiederholen und Abbrechen
zur Verfügung". So handhabe ich das in der Praxis denn auch, s.u..

Dabei ist
natürlich die Frage, wie lange das Mittagsschlàfchen dauern soll. Ich
habe aber nirgend wo etwas über die Lànge eines Timeouts gefunden.

Zum Verstàndnis: wie ist das dann, wenn ich z.B.

.SetText "ABC"
.Sleep 2000
.GetText

ausführe? Kann mit da eine andere Anwendung dazwischen funken oder gibt
es so etwas wie eine "Transaktion"?



Nachdem sonst niemand antwortet, riskiere ich mal eine Antwort aus dem Bauch
(oder, wohlwollend, aus der Erfahrung), heraus - jedenfalls ohne konkrete
Belege: nein, eine solche Transaktion gibt es nicht; mal abgesehen davon, dass
wohl keine zwei Prozesse gleichzeitig in die Zwischenablage *schreiben*
können. Aber eine garantierte "Vorhaltezeit" gibt es da nicht. Das wàre IMHO
auch nicht im Sinne des Erfinders; die Zwischenablage ist primàr für den
interagierenden Benutzer gedacht, und der muss halt selber wissen, was er
darin wie lange behalten will (jaja, schon klar, ein derart
eigenverantwortlicher Nutzer erscheint heutzutage als ein recht antiquiertes
Konzept ;-). M.a.W. die Zwischenablage ist für vollautomatische Handhabung bis
hin zu Interprozesskommunikation u.à. weder gedacht noch geeignet. Also
einfach den Benutzer ehrlich darüber aufklàren, dass was schiefgegangen ist,
und ihn entscheiden lassen, ob er den Versuch wiederholen oder abbrechen will.

Die OH legt sich bei Fehler 521 recht eindeutig fest, dass "eine andere
Anwendung" an dem Fehlschlag schuld sei; meiner Erfahrung nach stimmt das
allerdings nicht bzw. nur in einem sehr weiten Sinne. Insbesondere unter
virtualisierten Betriebssystemen (der Name des Virtualisierers, unter dem man
das Problem schon fast zuverlàssig reproduzieren kann, fàllt mit gerade nicht
ein) muss man einfach damit rechnen, dass der Vorgang aus nicht
nachvollziehbaren Gründen dann und wann fehlschlàgt.

Deshalb verwende ich ClipBoard.Set* seit ein paar Jahren nur noch "gewrapped"
in folgender Funktion, die sich bisher als "bulletproof" erwiesen (d.h. keine
LZF produziert) hat:


Public Function SetClipboardText(ByVal Text As String) As Boolean
'returns True if successful
Dim l As Long, s As String
Do
On Error Resume Next
Clipboard.Clear
l = Err.Number
s = Err.Description

If l = 0 Then
Clipboard.SetText Text, vbCFText
l = Err.Number
s = Err.Description
End If

On Error GoTo 0

If l Then
If MsgBox("Fehler Nummer " & CStr(l) & ":" & vbCrLf & s, _
vbRetryCancel) = vbCancel Then
Exit Do
End If
Else
SetClipboardText = True
Exit Do
End If
Loop
End Function

Mir ist bislang kein Fall bekannt, bei dem der zweite Versuch dann ebenfalls
fehlgeschlagen wàre - das kritische Zeitfenster scheint also ein winziges zu
sein.

Viele Grüsse,
Wolfgang
http://www.enzinger.net

Ähnliche fragen