Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

Markierungsprobleme bei der TextBox1
#1
Hallo liebes Forum,

ich habe ein Programm geschrieben, mit dem ich per Doppelklick in einem in einer Textbox stehenden Satz einen Punkt einfügen oder löschen kann. Ist bei der Cursorposition in dem Satz kein Punkt vorhanden,
wird dort einer eingefügt. Ist ein Punkt innerhalb des Satzes vorhanden,  kann der Cursor links oder rechts von diesen Punkt per Doppelklick ihn wieder löschen. Das klappt alles wunderbar.

Leider musste ich in die Userform ein zweites Textfeld TextBox2 einbauen. Diese TextBox2 hat nur die Aufgabe den Focus zu übernehmen, damit in der Textbox1 nach dem Doppelklick die Markierung aufgehoben wird.
Das kann es nicht sein!  Ich will nach dem Doppelklick in der TextBox1 keine Markierung haben. Aber wie bekomme ich das hin?

Zur Veranschaulichung der Problematik habe ich euch mein kleines Programm als Attachment hochgeladen.



Code:
Sub TextBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Dim intA As Integer
Dim vbstr As String

With TextBox1
TextBox1.SetFocus
intA = .SelStart
vbstr = .Text
End With

If InStr(Mid(vbstr, intA - 1, 3), ".") = 0 Then
'Punkt setzen
vbstr = Mid(vbstr, 1, intA) & "." & Mid(vbstr, intA + 1, Len(vbstr) - intA + 1)
Else
Debug.Print "Rechts:  " & InStr(Mid(vbstr, intA - 1, 3), ".")
If InStr(Mid(vbstr, intA - 1, 3), ".") = 2 Then
'Punkt löschen rechts vom Cursor
vbstr = Mid(vbstr, 1, intA - 1) & Application.Substitute(Mid(vbstr, intA, 3), ".", "", 1) & Mid(vbstr, intA + 3, Len(vbstr) - intA - 3 + 1)
Else
'Punkt löschen links vom Cursor
vbstr = Mid(vbstr, 1, intA) & Application.Substitute(Mid(vbstr, intA + 1, 3), ".", "", 1) & Mid(vbstr, intA + 4, Len(vbstr) - intA - 4 + 1)
End If
End If
Debug.Print vbstr


'Problemstelle
With TextBox1
.SetFocus
.Text = vbstr
End With

'Markierung Aufheben geht nur mit TextBox2.SetFocus
TextBox2.SetFocus

End Sub

Sub UserForm_Initialize()
Dim vbstr
vbstr = "Per Doppelklick kann innerhalb dieses Satzes ein Punkt gesetzt oder gelöscht werden."
TextBox1 = vbstr
TextBox1.Font.Size = 15
End Sub


Angehängte Dateien
.xls   Punkt_rein_und_raus.xls (Größe: 33,5 KB / Downloads: 5)
Antwortento top
#2
Hallo,

im VBA-Editor findest Du, gewöhnlich ist das links unten, ein Eigenschaftenfenster.
Dort kannst Du get Fokus on Klick oder so ähnlich ein oder ausschalten.
Dann kannst Du getrost die zweite Box wieder in Rente schicken.
________________________________________________________________________
wer aufgibt, ohne es versucht zu haben, gibt einfach nur auf!

[Bild: schulbild3.jpg]
Antwortento top
#3
Also diese Einstellung kann ich leider nirgendwo finden.
Antwortento top
#4
Moin!
Mal quick & dirty:
Ich habe die Größe der TextBox2 auf Null gesetzt, Hintergrund transparent und ohne Rahmen.
(manche würden sagen: unsichtbar)
21

Gruß Ralf


Angehängte Dateien
.xls   Punkt_rein_und_raus_RPP.xls (Größe: 34 KB / Downloads: 1)
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
Antwortento top
#5
Hallo Anne,

Zitat:Mal quick & dirty:
Ich habe die Größe der TextBox2 auf Null gesetzt, Hintergrund transparent und ohne Rahmen.
(manche würden sagen: unsichtbar)


Zitat:Also diese Einstellung kann ich leider nirgendwo finden.
... wenn der Ralf das so gemacht hat, dann gehe ich mal getrost davon aus, daß die von mir
vorgeschlagene Möglichkeit bei Textboxen nicht greift weil nicht vorhanden.
Ich konnte das nicht testen, das war also mein Gedankenfehler.

Also gräme Dich nicht mehr. Ich entschuldige mich auch ganz artig bei Dir.
________________________________________________________________________
wer aufgibt, ohne es versucht zu haben, gibt einfach nur auf!

[Bild: schulbild3.jpg]
Antwortento top
#6
Hallo Leute,
anbei meine eigene (Schnell-) Lösung des Problems zum Download und Ausprobieren. Das Makro funktioniert perfekt, aber gut möglich, dass es Codemäßig  eine bessere Lösung gibt.

Werde mir morgen das Ganze nochmal anschauen.


Angehängte Dateien
.xls   Punkt_rein_und_raus.xls (Größe: 36,5 KB / Downloads: 3)
Antwortento top
#7
Moin!
Ist aber mindestens genau so "dreckig" wie meine Lösung.  19
Das Problem liegt beim Doppelklick, der Windowskonform eine Markierung auslöst, die hier nicht erwünscht ist.
Viel besser ist hier der einfache Klick.
Sinnvoll in Verbindung mit Umschalt, Strg und/oder Alt.
(ich habe erst mal nur einen einfachen Klick ohne Zusatztaste verwendet)
Das Ereignis findest Du hier erklärt:
https://msdn.microsoft.com/de-de/library...78486.aspx
Dann braucht es auch diese Trickserei nicht mehr.

Ich habe also den CommandButton wieder herausgeworfen,
alles jetzt Überflüssige aus dem Code geworfen,
das Initialize durch manuelles Setzen der Eigenschaften überflüssig gemacht
und unseren Code mal vernünftig strukturiert, damit er auch lesbar ist.  21

Der gesamte Code aus UserForm1:
Dialog UserForm1
 
Private Sub TextBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) 
On Error Resume Next 
Dim intA As Integer 
Dim vbstr As String 
 
With TextBox1 
   intA = .SelStart 
   vbstr = .Text 
End With 
 
If InStr(Mid(vbstr, intA - 1, 3), ".") = 0 Then 
   'Punkt setzen 
   vbstr = Mid(vbstr, 1, intA) & "." & Mid(vbstr, intA + 1, Len(vbstr) - intA + 1) 
Else 
   If InStr(Mid(vbstr, intA - 1, 3), ".") = 2 Then 
      'Punkt löschen rechts vom Cursor 
      vbstr = Mid(vbstr, 1, intA - 1) & _
         Application.Substitute(Mid(vbstr, intA, 3), ".", "", 1) & _
         Mid(vbstr, intA + 3, Len(vbstr) - intA - 3 + 1) 
   Else 
      'Punkt löschen links vom Cursor 
      vbstr = Mid(vbstr, 1, intA) & _
         Application.Substitute(Mid(vbstr, intA + 1, 3), ".", "", 1) & _
         Mid(vbstr, intA + 4, Len(vbstr) - intA - 4 + 1) 
   End If 
End If 
 
With TextBox1 
   .Text = "" 
   .Text = vbstr 
End With 
End Sub 
 
TypNameEigenschaften
TextBoxTextBox1
AutoWordSelect:Falsch
Height:78
Left:18
TabIndex:0
Text:Per Doppelklick kann innerhalb dieses Satzes ein Punkt gesetzt oder gelöscht werden.
Top:18
Value:Per Doppelklick kann innerhalb dieses Satzes ein Punkt gesetzt oder gelöscht werden.
Width:858
WordWrap:Falsch

Datei im Anhang.

Gruß Ralf


Angehängte Dateien
.xls   Punkt_rein_und_raus RPP.xls (Größe: 34,5 KB / Downloads: 3)
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
Antwortento top
#8
Diese Code reicht:


Code:
Private Sub TextBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
  Cancel = True
     
  If Asc(Mid(TextBox1, TextBox1.SelStart, 1)) = 46 Then
    TextBox1 = Left(TextBox1, TextBox1.SelStart - 1) & Mid(TextBox1, TextBox1.SelStart + 1)
  ElseIf Asc(Mid(TextBox1, TextBox1.SelStart + 1, 1)) = 46 Then
    TextBox1 = Left(TextBox1, TextBox1.SelStart) & Mid(TextBox1, TextBox1.SelStart + 2)
  Else
    TextBox1 = Left(TextBox1, TextBox1.SelStart) & "." & Mid(TextBox1, TextBox1.SelStart + 1)
  End If
End Sub
Antwortento top
#9
Hallo Ralf,
vielen Dank für deine außerordentlich große Mühe. Auch ich hatte recherchiert und herausgefunden, dass die Markierungen typisches Verhalten der Textboxen sind,
konnte aber keine Microsoftquelle angeben. Inzwischen habe ich den etwas schnell hingeschriebenen Code auch nochmal verbessert. Vor allem bei der Toleranzprogrammierung,
ob der Cursor links oder rechts vom Punkt seht.

Und dann, ach ja SNB...

You've made my day!!! Besser als das Netz.
Im Upload befindet sich auch dein Code, natürlich mit deutlicher Kennzeichnung der Urheberschaft.


Angehängte Dateien
.xls   Punkte_rein_raus-Version 2 + 3.xls (Größe: 53,5 KB / Downloads: 3)
Antwortento top
#10
Codeverbesserung. Per Doppelklick können der Reihe nach alle vorgegebenen Satzzeichen durch das Arrays vbF  durchgelickt werden. 



Code:
Sub TextBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Cancel = True
Dim vbF
With TextBox1

vbF = Array(".", "!", "?", ",", ";", "")

For i = 0 To UBound(vbF)
If Not InStr(Mid(.Text, .SelStart - 1, 3), vbF(i)) = 0 Then
i = i + 1
Exit For
End If
Next i

If UBound(vbF) + 1 = i Then
'Punkt setzen
.Text = Mid(.Text, 1, .SelStart) & vbF(0) & Mid(.Text, .SelStart + 1, Len(.Text) - .SelStart + 1)
Else
If Mid(.Text, .SelStart + 1, 1) = vbF(i - 1) Then
.Text = Left(.Text, .SelStart) & Replace(Mid(.Text, .SelStart + 1, 1), vbF(i - 1), vbF(i)) & Right(.Text, Len(.Text) - .SelStart - 1)
Else
.Text = Left(.Text, .SelStart - 1) & Replace(Mid(.Text, .SelStart, 1), vbF(i - 1), vbF(i)) & Right(.Text, Len(.Text) - .SelStart)
End If
End If

End With

End Sub
Sub UserForm_Initialize()
Dim vbstr
vbstr = "Per Doppelklick kann innerhalb dieses Satzes nacheinander verschiedene Satzzeichen gesetzt oder gelöscht werden."
TextBox1 = vbstr
TextBox1.Font.Size = 15
End Sub
Antwortento top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste