Zur Hauptseite ... Zum Onlinearchiv ... Zum Abonnement ... Zum Newsletter ... Zu den Tools ... Zum Impressum ... Zum Login ...

Gedrucktes Heft

Diesen Beitrag finden Sie in Ausgabe 2/2016.

Unser Angebot für Sie!

Lesen Sie diesen Beitrag und 500 andere sofort im Onlinearchiv, und erhalten Sie alle zwei Monate brandheißes Access-Know-how auf 72 gedruckten Seiten! Plus attraktive Präsente, zum Beispiel das bald erscheinende Buch 'Access 2010 - Das Grundlagenbuch für Entwickler'!

Diesen Beitrag twittern

Markierung automatisch kopieren

Manchmal möchten Sie vielleicht schnell den kompletten Inhalt oder auch Ausschnitte von einem Textfeld in ein anderes übernehmen. Dann markieren Sie diesen, kopieren ihn, beispielsweise mit der Tastenkombinatino Strg + C, und fügen ihn mit Strg + V in das Zieltextfeld ein. Das ist für den Alltag schnell genug, so Sie denn die Tastenkombinationen aus dem Stegreif beherrschen (das ist längst nicht immer der Fall!). Wenn Sie jedoch häufiger Inhalte von Textfeld A nach Textfeld B übertragen wollen, gibt es einen viel eleganteren Weg. Schauen Sie selbst!

Mit dem Beispiel des vorliegenden Beitrags wollen wir zeigen, wie einfach es ist, den in einem ersten Textfeld markierten Text in ein zweites Textfeld zu kopieren. Dabei soll es zwei auslösende Ereignisse geben. Das erste und einfachere ist die Markierung mit der Maus. Diese beginnt, indem der Benutzer den Start der Markierung durch Herunterdrücken der Maustaste an der entsprechenden Stelle selektiert. Dann bewegt er den Mauszeiger bei gedrückter Maustaste zu der Stelle, die das Ende der Markierung festlegt. Um den Inhalt in das andere Textfeld zu kopieren, muss der Benutzer nun nur noch die Maustaste loslassen. Natürlich gelingt dies auch andersherum: Man kann auch zuerst das Ende der Markierung auswählen und dann weiter vorn an der Startposition die Maustaste loslassen.

Die zweite Variante soll die Markierung mit der Tastatur ermöglichen. Hier positionert der Benutzer die Einfügemarke vor die erste Position des zu markierenden Textes – sei es mit der Maus oder mit den Cursortasten.

Dann erweitert er die Markierung durch Bewegung der Cursortasten bei gedrückter Umschalttaste (für zeichenweisen Vorschub) oder bei zusätzlich gedrückter Strg-Taste (um gleich ganze Wörter zur Auswahl hinzuzufügen). Wenn die gewünschte Auswahl erreicht wurde, lässt er einfach die Umschalttaste los und der markierte Text wird kopiert.

Dies sieht beispielsweise wie in Bild 1 aus. Hier haben wir zunächst den vierten Abschnitt des Quelltextes markiert und so zum Zielfeld hinzugefügt. Dann haben wir den dritten Absatz markiert. Dadurch, dass die Option Neue Zeile ausgewählt ist, landet der markierte Text in der nächsten Zeile hinter dem bereits im Zielfeld vorhandenen Text.

Kopieren von einem Textfeld zum nächsten

Bild 1: Kopieren von einem Textfeld zum nächsten

Aufbau des Formulars

Der Versuchsaufbau sieht in der Entwurfsansicht wie in Bild 2 aus. Das Formular enthält hauptsächlich zwei Textfelder namens txtQuelle und txtZiel, von denen das Textfeld txtQuelle beim Laden Text anzeigen soll, der durch verschiedene Aktionen in das zweite Textfeld txtZiel kopiert werden soll.

Entwurf des Formulars zum Kopieren von Inhalten per einfacher Markierung

Bild 2: Entwurf des Formulars zum Kopieren von Inhalten per einfacher Markierung

Um genauer festzulegen, wie der Text an den bereits in txtZiel enthaltenen Text angefügt werden soll, gibt es noch eine Optionsgruppe namens ogrModus. Diese bietet zwei mögliche Werte an: Hinten anfügen oder Neue Zeile.

Damit unser Beispielformular beim Öffnen einige Beispielsätze anzeigt, füllen wir dieses in der Ereignisprozedur, die durch das Ereignis Beim Laden des Formulars ausgelöst wird, mit etwas Platzhaltertext.

Dann setzen wir den Fokus auf das Textfeld txtQuelle und heben eine eventuell durch die Einstellung für den Eintritt in das Textfeld vorgesehene Markierung auf, indem wir die Eigenschaft SelLength auf den Wert 0 einstellen:

Private Sub Form_Load()
     Dim strTemp As String
     strTemp = "Et et aut ..." & vbCrLf & vbCrLf 
     strTemp = strTemp & "Diate inus ..." & vbCrLf & vbCrLf
     strTemp = strTemp & "Erehent, c..." & vbCrLf & vbCrLf
     strTemp = strTemp & "Ro etur aut..." & vbCrLf & vbCrLf
     strTemp = strTemp & "consed maio..."
     Me!txtQuelle = strTemp
     Me!txtQuelle.SetFocus
     Me!txtQuelle.SelLength = 0
End Sub

Kopieren per Tastatur

Das Kopieren nach der Markierung eines Bereichs unter Zuhilfenahme der Umschalttaste (zur Markierung einzelner Buchstaben) beziehungsweise der Umschalttaste plus der Strg-Taste (zur Markierung kompletter Wörter) erfolgt nach dem Loslassen der zuvor betätigten Tasten.

Dies löst das Ereignis Bei Taste auf des Textfeldes txtQuelle aus (s. Listing 1).

Private Sub txtQuelle_KeyUp(KeyCode As Integer, Shift As Integer)
     Dim strTemp As String
     If (Shift = acShiftMask Or Shift = acShiftMask And acCtrlMask) And KeyCode = vbKeyShift And Me!txtQuelle.SelLength _
             > 0 Then
         strTemp = Mid(Me!txtQuelle, Me!txtQuelle.SelStart + 1, Me!txtQuelle.SelLength)
         If Not Len(Me!txtZiel) = 0 Then
             If Me!ogrModus = 1 Then
                 Me!txtZiel = Me!txtZiel & " "
             Else
                 Me!txtZiel = Me!txtZiel & vbCrLf
             End If
         End If
         Me!txtZiel = Me!txtZiel & strTemp
     End If
End Sub

Listing 1: Diese Ereignisprozedur kopiert beim Loslassen der Umschalt/Strg-Taste den markierten Inhalt in ein weiteres Textfeld.

Die Prozedur prüft zunächst, ob soeben die Kombination aus Umschalttaste oder Umschalt plus Strg-Taste (ermittelt aus dem Parameter Shift, acShiftMask entspricht Umschalttaste, acShiftMask + acCtrlMask entspricht Umschalttaste und Strg-Taste) und der Umschalttaste (ermittelt aus dem Parameter Key mit dem Wert vbKeyShift) losgelassen wurde. Außerdem sollte die Länge der aktuellen Markierung (ermittelt mit der Eigenschaft SelLength des Steuerelements txtQuelle) größer als 0 sein, da sonst offensichtlich keine Markierung vorliegt.

In diesem Fall ermittelt die Prozedur den Inhalt der aktuelle Markierung. Dazu nutzt sie die Mid-Funktion, deren erster Parameter den zu untersuchenden Text erwartet. Mit dem zweiten Parameter geben Sie die Startposition der zu ermittelnden Zeichenkette an.

Hier verwenden wir dazu die Eigenschaft SelStart des Textfeldes txtQuelle plus 1, da SelStart nullbasiert ist, Mid aber für das erste Zeichen den Index 1 verwendet. Die Länge der zu extrahierenden Zeichenkette liefert die Eigenschaft SelLength des Textfeldes. Der markierte Inhalt landet schließlich in der Variablen strTemp.

Nun schaut sich die Prozedur den aktuellen Zustand des Zieltextfeldes an sowie den mit der Optionsgruppe festgelegten Modus. Wenn das Textfeld txtZiel noch keinen Inhalt aufweist (Len(Me!txtZiel) = 0), sind keine Maßnahmen erforderlich, bevor der markierte Text an den vorhandenen Text angehängt wird.

Anderenfalls prüft die Prozedur den Wert der Optionsgruppe ogrModus. Im Falle des Optionswertes 1, was der Option Hinten anfügen entspricht, soll vor dem Hinzufügen des markierten Textes aus dem Textfeld txtQuelle noch ein Leerzeichen an den bereits vorhandenen Text angehängt werden. Ist hingegen die Option 2 eingestellt (Neue Zeile), dann soll der einzufügende Text in einer neuen Zeile erscheinen. Daher fügt die Prozedur zuvor noch einen Zeilenumbruch hinzu (vbCrLf). Schließlich weist die Prozedur dem Inhalt des Textfeldes txtZiel den bisherigen Inhalt plus den in der Variablen strTemp zwischengespeicherten markierten Inhalt aus dem Textfeld txtQuelle hinzu.

Kopieren per Maus

Das Kopieren eines Textes per Mauszeiger gestaltet sich noch ein wenig einfacher. Die Prüfung, welche Taste gedrückt wurde, fällt hier deutlich einfacher aus, weil uns lediglich interessiert, ob der Benutzer die linke oder die rechte Maustaste verwendet hat. Wir wollen nur beim Betätigen der linken Maustaste aktiv werden, also schließen wir den gesamten Code in eine If...Then-Bedingung ein, die den Wert der Variablen Button auf den Wert der Konstanten acButtonLeft prüft.

Innerhalb der Bedingung ermittelt die erste Anweisung wieder mithilfe der Mid-Funktion den Inhalt der aktuellen Markierung. Sie prüft, ob es überhaupt eine Markierung gibt und ob der markierte Text hinten an die letzte Zeile angehängt oder in einer neuen Zeile eingefügt werden soll. Schließlich landet der Inhalt der Variablen strTemp an der gewünschten Stelle im Textfeld txtZiel.

Wort per Doppelklick markieren

Was aber geschieht, wenn wir ein einzelnes Wort schnell per Doppelklick markieren und kopieren wollen? Dass es gelingt, das angeklickte Wort so schnell zu markieren, haben Sie sicher schon einmal ausprobiert. Aber benötigen wir eine weitere Prozedur, die beispielsweise auf das Ereignis Beim Doppelklicken des Steuerelements reagiert? Dies ist nicht der Fall: Beim zweiten Loslassen der Maustaste beim Doppelklick wird automatisch die Ereignisprozedur txtQuelle_MouseUp ausgelöst (s. Listing 2).

Private Sub txtQuelle_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
     Dim strTemp As String
     If Button = acButtonLeft Then
         strTemp = Mid(Me!txtQuelle, Me!txtQuelle.SelStart + 1, Me!txtQuelle.SelLength)
         If Not Len(Me!txtZiel) = 0 Then
             If Me!ogrModus = 1 Then
                 Me!txtZiel = Me!txtZiel & " "
             Else
                 Me!txtZiel = Me!txtZiel & vbCrLf
             End If
         End If
         Me!txtZiel = Me!txtZiel & strTemp
     End If
End Sub

Listing 2: Diese Ereignisprozedur kopiert den mit der Maus markierten Inhalt beim Loslassen in ein weiteres Textfeld.

Dies sorgt dafür, dass das angeklickte Wort in das Textfeld txtZiel kopiert wird (s. Bild 3).

Kopieren per Doppelklick

Bild 3: Kopieren per Doppelklick

Zusammenfassung und Ausblick

Dieser Beitrag zeigt, wie Sie schnell Texte von einem Steuerelement in ein anderes kopieren können. Früher oder später laufen Sie einem Anwendungsfall über den Weg, bei dem Sie die hier vorgestellte Technik nutzen können. Man könnte noch weitere Features hinzufügen – beispielsweise eines, bei dem der markierte Inhalt an einer zuvor markierten Stelle im Zieltextfeld eingefügt wird. Dies hätte jedoch den Rahmen dieses Beitrags gesprengt.

Einen Anwendungsfall finden Sie etwa in der Lösung des Beitrags Ticketverwaltung (www.access-im-unternehmen.de/1033).

Kompletten Artikel lesen?

Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

E-Mail:

Download

Download

Die .zip-Datei enthält folgende Dateien:

VonTextfeldZuTextfeld.accdb

Beispieldateien downloaden

© 2003-2015 André Minhorst Alle Rechte vorbehalten.