Zwischenablage

Handhabung von Texten | Handhabung von Grafik(en)

Handhabung von Texten

Die Zwischenablage ist oft eine große Hilfe bei der Arbeit am Rechner. Es ist wünschenswert, sie in eigenen Programmen mit zu nutzen.
Zunächst die gute Nachricht, Texte in Visual-Basic-Programmen, probieren Sie es, sind für die Nutzung der Zwischenablage mit der rechten Maustaste zugänglich, wenn es sich um TextBoxen handelt. Labels, die man ja gelegentlich auch für Ausgaben nutzt, gehen so nicht.
Möchte man diese Möglichkeiten im Menü anbieten, geht das mit geringem Aufwand. In der TextBox wird die Arbeit der Textmarkierung, die ja einer sinnvollen Arbeit mit der Zwischenablage vorangeht, von Windows übernommen. Man muß lediglich den Text in der TextBox selber verwalten.
Bei Labels, wenn es denn sein muß, geht natürlich auch etwas. Da dasLabel_Click()-Ereignis ausgewertet wird, kann man mühelos bei Anlaß eines Klickens auch den Label-Text, der Caption heißt, in die Zwischenablage befördern. Allerdings wird man bei einer Markierung nicht unterstützt, es wird beim Klicken immer der ganze Text übernommen. Wer Labels wie normale TextBoxen "handlen" will, muß eine Markierungsroutine programmieren, die etwas kompliziert werden wird. Der Caption-Text ist allerdings ein normaler Textstring und kann beliebig manipuliert werden.

Es folgt ein Codebeispiel für eine TextBox mit dem Namen Text1. Die drei Menüeinträge haben, erkennbar im Codebeispiel,  die Namen mnuKopie, mnuAusschneid, mnuEinfueg erhalten. Was hier in einzelnen geschieht, ist leicht zu durchschauen.
Es werden für die Zwischenablage, die Clipboard heißt, die Methoden .SetText und .GetText genutzt. Wie man sich leicht überzeugt, indem man im Codebereich auf das Wort Clipboard einen Punkt folgen läßt, gibt es überhaupt nur 5 Methoden, nämlich außer den genannten noch .Clear und das Paar .SetData und .GetData. Man ahnt, letztere werden für den Grafiktransport genutzt.
Der Rest hat mit der Verwaltung des Textes im Textfeld zu tun. Hier geht es um schlichte Stringmanipulation.
 
Private Sub mnuKopie_Click()
Clipboard.SetText Text1.SelText, vbCFText
End Sub
Private Sub mnuAusschneid_Click()
Clipboard.SetText Text1.SelText, vbCFText
Text1.SelText = ""
End Sub
Private Sub mnuEinfueg_Click()
Dim Pos As Integer
Pos = Text1.SelStart
Text1.Text = Left(Text1.Text, Pos) & Clipboard.GetText(vbCFText) & Right(Text1.Text, Len(Text1.Text) - Pos)
End Sub
Private Sub mnuLoesch_Click()
Text1.SelText = ""
End Sub

Eine Erweiterung ist noch vorzuschlagen: Die Zwischenablage wird von Windows immer nur dann angeboten, wenn es Sinn hat, Kopieren nur, wenn etwas markiert ist, Einfügen nur, wenn die Zwischenablage etwas enthält und ein möglicher Einfügeort mit der Maus gewählt ist. Hier in Visual Basic muß man das extra programmieren.
Dazu wird man die Menüeinträge in Abhängigkeit von diesen Bedingungen aktivieren oder deaktivieren (mnuTuWas.Enabled=True/False) bzw. die Einträge sichtbar oder unsichtbar (mnuTuWas.Visible=True/False) machen.
Nehmen wir wieder das obige Beispiel: Wie erfragt man, wann es so weit ist?

Kopieren und Ausschneiden
If Text1.SelText<>"" then ...
Einfügen
If Clipboard.GetFormat(vbCFText) ...
bleibt aber zu fragen, steht der Cursor an zugelassener Stelle? Das erledigt besser der Aufruf, deshalb nun die
Komplettlösung
Voreinstellung aller Menüpunkte im Menüeditor muß sein:
mnuTuWas.Enabled = False

Private Sub Text1_Click()
If Clipboard.GetFormat(vbCFText) Then mnuEinfueg.Enabled = True
If Text1.SelText<>"" Then
mnuKopie.Enabled = True
mnuAusschneid.Enabled = True
Else
mnuKopie.Enabled = False
mnuAusschneid.Enabled = False
End If
End Sub
Private Sub Text1_LostFocus()
mnuKopie.Enabled = False
mnuAusschneid.Enabled = False
mnuEinfueg.Enabled = False
End Sub

Handhabung von Grafik(en)

Interessant ist für den programmierenden Datenauswerter, daß er sein Ergebnisdiagramme auch ordentlich vermarkten kann. Wie man eigene Diagramme druckt, ist klar, wie man sie etwa in einen Text einbaut, noch nicht.
Ginge etwa die Zwischenablage? Schaun mer mal.

Zunächst der weniger wichtige aber einfache Fall: Mit Clipboard.setData kann man ein Bild, das in ein Image oder eine PictureBox geladen ist, in die Zwischenablage laden und weiterverwenden. Allerdings, anders als beim Text, muß zuerst die Zwischenablage mit Clear gelöscht werden. Da man das Bild nicht ohne weiteres aktivieren kann, kann man entweder das Bild durch einfachen Klick in die Zwischenablage übernehmen, was einen entsprechenden Hinweis im Programm erfordert, oder man nutzt einen Menüeintrag, der etwa "Bild kopieren" heißt.

Private Sub Picture1_Click()
Clipboard.Clear
Clipboard.SetData Picture1.Picture, 0
End Sub

Die SetData-Methode verlangt die Angabe einer Konstanten, die den Bildtyp kennzeichnet. Die Null bedeutet so etwas wie "ich suchs mir aus". Das Einfügen sollte analog mit GetData funktionieren. Unser Pech, wenn es um ein selbstgemaltes Bild geht, funtioniert das nicht, es wird aber nicht viel komplizierter: 2 Schritte sind nötig.
Schritt 1: Man muß für diePictureBox, die man zum Malen benutzt, die Eigenschaft "AutoRedraw" auf True setzen. Das geht im Eigenschaften-Fenster oder auch im Code.
Schritt 2: Der Aufruf ändert sich geringfügig. Gespeichert wird die Image-Eigenschaft, der Bildtyp ist in diesem Falle 2 (Bitmap-Grafik).

Private Sub mnuKopier_Click()
Clipboard.Clear
Clipboard.SetData Picture1.Image, 2
End Sub

Gespeichert wird in diesem Falle fast alles, was die PictureBox enthält.
Wieso fast?
Gespeichert werden Hintergrundfarbe, ggf. geladenes Hintergrundbild, alles, was mit Graphikmethoden gezeichnet wurde aber nicht aufsitzende Shapes und Lines (Gemeint ist das Line-Steuerelement, nicht zu verwechseln mit der gleichnamigen Graphikmethode!). Das hat zwar eine gewisse Logik, aber was logisch ist, muß man ja nicht gut finden. Ich gestehe, ich weiß nicht, wie man sie in das Bild integrieren kann. Hilft erst mal nur, sie bei zu kopierenden Bildern zu vermeiden.


© R. Hirte * 2002