Ärgern Sie sich auch immer darüber, dass Anwendungen ohne Ihr
Zutun den Inhalt der Zwischenablage ändern oder überschreiben?
Beste Beispiele, nein - halt, bestens abschreckende Beispiele sind
Add-Ins für die VB-Entwicklungsumgebung oder
Microsoft-Office-Anwendungen - Sie kopieren beispielsweise ein
Code-Stück in die Zwischenablage, starten die VB-IDE mit Add-Ins -
und der kopierte Inhalt ist weg...
Es gibt leider keinen anderen Weg für diese Add-Ins, ein Symbol
in einen Button der CommandBars zu bugsieren, als über die
Zwischenablage. Damit sich die Anwender nicht genauso über Ihre
Anwendungen - und noch weniger über die Add-Ins aus Ihrer Feder -
ärgern müssen, sollten Sie wenigstens minimale Vorsorge treffen
und den angetroffenen Inhalt der Zwischenablage sichern, bevor Sie
ihn kurzzeitig mit eigenem Inhalt überschreiben, und anschließend
wieder herstellen.
Leider bietet Visual Basic nur den Zugriff auf die wichtigsten
Zwischenablage-Formate an, von anwendungsspezifischen Formaten ganz
zu schweigen. Aber zeigen Sie doch bitte guten Willen und sichern
Sie eben die Inhalte der möglichen Formate.
Die Klasse clsClipboardStack hängt beim Aufruf der Methode Push
den Inhalt der Zwischenablage als kleines Array aus dem jeweiligen
Inhalt und der Format-Konstante (vbCF...) an die
interne Collection mStack an, wenn das Format erkannt wurde. Die
Methode Push gibt den Wert True zurück, wenn das Format nicht
erkannt worden ist oder die Zwischenablage leer ist. Dann können
Sie entscheiden, ob Sie auf die Verwendung der Zwischenablage
verzichten. Oder Sie fragen den Anwender, ob der Inhalt
überschrieben werden kann und bieten ihm damit Gelegenheit, den
Inhalt gegebenenfalls anderweitig zu sichern.
Ansonsten können Sie mit Clipboard.Clear den Inhalt löschen und
die Zwischenablage für Ihre Anwendung verwenden. Anschließend
sollten Sie natürlich den gesicherten Inhalt mit einem Aufruf der
Methode Pop wieder in die Zwischenablage zurückschreiben und vom
Stapel entfernen. Übergeben Sie beim Aufruf der Methode Pop den
Wert True im optionalen Parameter RemoveOnly, wird der zuletzt
abgelegte Zwischenablage einfach nur vom Stapel entfernt, ohne ihn
wieder ein die Zwischenablage zu schreiben.
Die Eigenschaft Count informiert Sie über die Größe des
Stapels. Ein beliebiges Element aus dem Stapel können Sie über die
Standard-Eigenschaft Item auslesen oder Sie können über die
Eigenschaft ItemInfo erfahren, welches Zwischenablage-Format ein
bestimmtes Element auf dem Stapel hat. Mit der Methode Clear
löschen Sie den Stapel auf einen Schlag.
Private mStack As Collection
Public Property Get Count() As Long
Count = mStack.Count
End Property
Public Property Get Item(ByVal Index As Long, _
Optional ByVal FullInfo As Boolean) As Variant
Dim nItem As Variant
Select Case Index
Case 1 To mStack.Count
nItem = mStack(Index)
If FullInfo Then
Item = nItem
Else
Select Case nItem(1)
Case vbCFBitmap, vbCFDIB, vbCFEMetafile, vbCFFiles, _
vbCFLink, vbCFMetafile, vbCFPalette
Set Item = nItem(0)
Case vbCFRTF, vbCFText
Item = nItem(0)
End Select
End If
End Select
End Property
Public Property Get ItemInfo(ByVal Index As Long) As Integer
Dim nItem As Variant
Select Case Index
Case 1 To mStack.Count
nItem = mStack(Index)
ItemInfo = nItem(1)
End Select
End Property
Public Sub Clear()
Set mStack = New Collection
End Sub
Public Function Push() As Boolean
With Clipboard
Select Case True
Case .GetFormat(vbCFBitmap)
mStack.Add Array(.GetData(vbCFBitmap), vbCFBitmap)
Case .GetFormat(vbCFDIB)
mStack.Add Array(.GetData(vbCFDIB), vbCFDIB)
Case .GetFormat(vbCFEMetafile)
mStack.Add Array(.GetData(vbCFEMetafile), vbCFEMetafile)
Case .GetFormat(vbCFMetafile)
mStack.Add Array(.GetData(vbCFMetafile), vbCFMetafile)
Case .GetFormat(vbCFPalette)
mStack.Add Array(.GetData(vbCFPalette), vbCFPalette)
Case .GetFormat(vbCFRTF)
mStack.Add Array(.GetText(vbCFRTF), vbCFRTF)
Case .GetFormat(vbCFText)
mStack.Add Array(.GetText(vbCFText), vbCFText)
Case Else
Push = True
End Select
End With
End Function
Public Function Pop(Optional ByVal RemoveOnly As Boolean) _
As Boolean
Dim nItem As Variant
With mStack
If .Count Then
nItem = mStack(.Count)
If Not RemoveOnly Then
Select Case nItem(1)
Case vbCFBitmap, vbCFDIB, vbCFEMetafile, vbCFFiles, _
vbCFLink, vbCFMetafile, vbCFPalette
Clipboard.SetData nItem(0), nItem(1)
Case vbCFRTF, vbCFText
Clipboard.SetText nItem(0), nItem(1)
End Select
End If
.Remove .Count
Else
Pop = True
End If
End With
End Function
Public Function NewEnum() As IUnknown
Set NewEnum = mStack.[_NewEnum]
End Function
Private Sub Class_Initialize()
Set mStack = New Collection
End Sub
Private Sub Class_Terminate()
Set mStack = Nothing
End Sub
Eine vereinfachte Version zur Sicherung des
Zwischenablage-Inhalts finden Sie unter Rettungsring
fürs Clipboard - das dort vorgestellte Modul sichert lediglich
den jeweils letzten Inhalt der Zwischenablage.
|