Sel Text etc

Hallo

ich verwende folgende Function in meinem Project.

Public Function GetText(Up As Boolean, t As TextBox) As Long 
On Error GoTo fehler
Static Pos As Integer
GetText = -1
 If Up Then
 Pos = Pos - 1
 Else
 Pos = Pos + 1
 End If
 If Pos = -1 Then Pos = UBound(OldText)
 If Pos \> UBound(OldText) Then Pos = 0
 t.Text = OldText(Pos)
 t.SetFocus
 t.SelStart = 0
 t.SelLength = Len(t.Text)
 GetText = 0
 Exit Function
fehler:
 Exit Function
End Function

Die Function tut fast das was sie sollte. Es wird in der Textbox der geünschte Text eingetragen. Doch dann soll er noch makiert werden und das macht er nicht.
Weiss jemand wo hier der Fehler liegt?

Liebe Gruesse Alex

PS: Rainer auf den anderen Thread melde ich mich nachher noch einmal :smile:

Hi Alex,

t.SelStart = 0

das könnte der Fehler sein. Ein Zeichen 0 hat ein String nicht, da beginnt das Zählen mir der Eins.

Gruß, Rainer

Hallo Rainer,

also ich habe mal die Zuweisung

t.selstart von 0 auf 1 geaendert. Es wird trotzdem nichts makiert :frowning:
Ein Laufzeitfehler trat weder bei der Zuweisung von 0 und von 1 NICHT auf :-/

Auch steht in der Hilfe folgendes

Zahl Ein numerischer Ausdruck, der die Anzahl der ausgewählten Zeichen angibt. Für die Eigenschaften SelLength und SelStart reicht der zulässige Bereich von 0 bis zur Textlänge - der Gesamtanzahl der Zeichen im Bearbeitungsbereich eines Kombinationsfeld- oder Textfeld-Steuerelements (ComboBox bzw. TextBox).

So langsam binsch mit mein Latein am Ende *grml*

Hast du noch eine Idee?

LG Alex

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi Alex,

t.selstart von 0 auf 1 geaendert. Es wird trotzdem nichts
makiert :frowning:
Ein Laufzeitfehler trat weder bei der Zuweisung von 0 und von
1 NICHT auf :-/

OK, Du hast Recht. Sorry. Ich hab’s gerade getestet, bei ‚Selstart‘ beginnt der wirklich bei 1 zu zählen.

Option Explicit

Private Sub Command1\_Click()
 Text1.Text = "Teststring"
 Text1.SetFocus
 Text1.SelStart = 0
 Text1.SelLength = 3
End Sub

funktioniert … hmmm.

So langsam binsch mit mein Latein am Ende *grml*

Hast du noch eine Idee?

noch nicht, ich such noch mal. Wenn ich etwas finde, melde ich mich.

Gruß, Rainer

Hi Alex,

Hast du noch eine Idee?

t.Text = OldText(Pos) ist ein Stringarray, richtig? Setze doch mal einen Stoppunkt uns sieh Dir an, was da drin steht. Wenn nichts markiert wird, schieint das „“ zu sein, also Länge =0. Ohne testen zu können bleibt das bei mir beim Raten. Codeschnipsel, die nicht lauffähig sind, sind ohne den restlichen Code schwer bis gar nicht zu debuggen.

Gruß, Rainer

Hallo Rainer,

hmm, nungut. Also um was es in den vorhergehenden Thema bei mir ging weisst du ja. Sinn ist es jetzt das wenn die textzeile leer ist und man die Pfeil Taste nach oben oder unten drueckt, das dann der vorhergehende Text angezeigt wird. Gespeichert werden bis zu 10 Eingaben
Wenn nun eine Eingabe geschehen ist und man die Enter Taste betaetigt, so werden die Daten verarbeitet und automatisch der alte Wert der in der textbox stand gespeichert

Hier nun der Codeschnipsel

Die procedure zum speichern !
Die Variable OldText ist als Variant im Modul als Private declariert
Die Proceduren Savewert und Getwert befinden sich beide in dem selben Modul.

'Modul 1 
Dim OldText As Variant 'Alte Texteingaben!

Public Sub SaveText(ByVal t As TextBox) 'Speichert den Text im Array
On Error Resume Next
Dim i As Integer
 If IsArray(OldText) Then
 If UBound(OldText) UBound(OldText) Then pos = 0
 t.Text = OldText(pos)
 t.SetFocus
 t.SelStart = 0
 t.SelLength = Len(t.Text)
 GetText = 0
 Exit Function
fehler:
 Exit Function
End Function

Public Sub Vervollständige(l As ListEx, t As TextBox) 'trägt automatisch den Usernamen in die Liste ein!
On Error Resume Next
Dim i As Integer, z As Integer
Dim Search As String
Static count As Integer
Dim found As Boolean
Dim pos As Integer, pos1
 If l.ListCount = 0 Then Exit Sub 'Keine Einträge
 pos = t.SelStart
 For i = pos To 1 Step -1
 If Mid(t.Text, i, 1) = " " Then Exit For
 Search = Mid(t.Text, i, 1) & Search
 Next i
 pos1 = i
 For i = 0 To l.ListCount - 1
 If InStr(1, LCase(l.Items(i).Text), LCase(Search), 1) = 1 Then
 z = z + 1
 If z \> count Then
 t.Text = Mid(t.Text, 1, pos1) & l.Items(i).Text
 count = count + 1
 found = True
 Exit For
 Else
 found = False
 End If
 End If
 Next i
 If Not (found) Then
 For i = 0 To l.ListCount - 1
 If InStr(1, LCase(l.Items(i).Text), Search, 1) = 1 Then
 count = 1
 t.Text = Mid(t.Text, 1, pos1) & l.Items(i).Text
 t.SelStart = pos
 t.SelLength = Len(t.Text) - pos
 Exit For
 End If
 Next i
 Else
 t.SelStart = pos
 t.SelLength = Len(t.Text) - pos
 End If
End Sub

Die textbox und die Listbox, befindet sich auf der Form 1

Der Codeschnipsel davon lautet:

 'Form1
Private Sub Text1\_KeyDown(KeyCode As Integer, Shift As Integer)
On Error Resume Next
Dim Retval As Long
Select Case KeyCode
 Case vbKeyUp
 Retval = GetText(True, Text1)
 Case vbKeyDown
 Retval = GetText(False, Text1)
End Select
End Sub

Private Sub Text1\_KeyPress(KeyAscii As Integer)
On Error Resume Next
 Select Case KeyAscii
 Case vbKeyTab 'Tabulator
 Call Vervollständige(ListEx1, Text1) 
 Case vbKeyF1 'Hilfe
 Case vbKeyF2 'Text speichern
 Case vbKeyF12 'Minimieren
 End Select
End Sub

So nun solltest du alle dazugehörigen Codeschnipsel sehen :smile:
Was ich aber nicht verstehe, ist das das selektieren in der Sub Vervollstaendige funktioniert :-/
In der Sub GetWert bekomme ich nur die aktuellen Daten eingetragen, aber sie werden wie gesagt nicht selektiert :frowning:

LG Alex

Hallo Rainer,

nungut dann poste ich dir mal die ganzen Codeschnipsel

Also auf der Form1 ist die Listbox und die textbox
Wenn der Enter gedrueckt wird und die daten somit verarbeitet werden dann wird automatisch die SUB SaveWert aufgerufen.

Was mich wundert ist, das das selektieren in der sub Vervollstaendige klappt aber net in der GetWert Sub :frowning:
Die Daten werden zwar akkurat in die textbox eingetragen aber nicht selektiert :frowning:

'Modul
Dim OldText As Variant 'Alte Texteingaben!

Public Sub Vervollständige(l As ListEx, t As TextBox) 'trägt automatisch den Usernamen in die Liste ein!
On Error Resume Next
Dim i As Integer, z As Integer
Dim Search As String
Static count As Integer
Dim found As Boolean
Dim pos As Integer, pos1
 If l.ListCount = 0 Then Exit Sub 'Keine Einträge
 pos = t.SelStart
 For i = pos To 1 Step -1
 If Mid(t.Text, i, 1) = " " Then Exit For
 Search = Mid(t.Text, i, 1) & Search
 Next i
 pos1 = i
 For i = 0 To l.ListCount - 1
 If InStr(1, LCase(l.Items(i).Text), LCase(Search), 1) = 1 Then
 z = z + 1
 If z \> count Then
 t.Text = Mid(t.Text, 1, pos1) & l.Items(i).Text
 count = count + 1
 found = True
 Exit For
 Else
 found = False
 End If
 End If
 Next i
 If Not (found) Then
 For i = 0 To l.ListCount - 1
 If InStr(1, LCase(l.Items(i).Text), Search, 1) = 1 Then
 count = 1
 t.Text = Mid(t.Text, 1, pos1) & l.Items(i).Text
 t.SelStart = pos
 t.SelLength = Len(t.Text) - pos
 Exit For
 End If
 Next i
 Else
 t.SelStart = pos
 t.SelLength = Len(t.Text) - pos
 End If
End Sub

Public Sub SaveText(ByVal t As TextBox) 'Speichert den Text im Array
On Error Resume Next
Dim i As Integer
 If IsArray(OldText) Then
 If UBound(OldText) UBound(OldText) Then pos = 0
 t.Text = OldText(pos)
 t.SetFocus
 t.SelStart = 0
 t.SelLength = Len(t.Text)
 GetText = 0
 Exit Function
fehler:
 Exit Function
End Function

und noch die Form :smile:

'Form1
Private Sub Text1\_KeyDown(KeyCode As Integer, Shift As Integer)
On Error Resume Next
Dim Retval As Long
Select Case KeyCode
 Case vbKeyUp
 Retval = GetText(True, Text1)
 Case vbKeyDown
 Retval = GetText(False, Text1)
End Select
End Sub

Private Sub Text1\_KeyPress(KeyAscii As Integer)
On Error Resume Next
 Select Case KeyAscii
 Case vbKeyTab 'Tabulator
 Call Vervollständige(ListEx1, Text1)
 Case vbKeyF1 'Hilfe
 Case vbKeyF2 'Text speichern
 Case vbKeyF12 'Minimieren
 End Select
End Sub

Hast du noch ne Idee?

LG Alex

Hi Alex,

tasten wir uns erst mal ran. :smile: Ich bekomme die Fehlermeldung:

Benutzerdefinierter Typ nicht definiert.
Was soll …

ListEx

heißen?

Public Sub Vervollständige(l As ListEx, t As TextBox) 'trägt automatisch den Usernamen in die Liste ein!

das versteht mein VB nicht.

Gruß, Rainer

Hallo Rainer,

das Steuerelement auf der Form nennt sich ListEx. Sie fungiert genauso wie eine normale Listbox und auch deren Zugriff. Nur mit dem Unterschied das du dort zusaetzlich Bilder einpflegen kannst :smile:
Wenn du eine Normale Liste nimmst, so musst du aus Listex Listbox machen :smile:

LG Alex

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi Alex,

Hast du noch ne Idee?

eine Kleinigkeit ist mir noch aufgefallen, in Deinem Code steht nirgends ‚Option Explicit‘. Das begünstigt Tippfehler. Dein Code läuft ja bei mir nicht. Kannst du Dich vertippt haben und merkst es nicht? Ein l. eione 1 und ein I sind im Code fast nicht zu unterscheiden … ‚Option explicit‘ ist ein Luxus, den ich mir immer leiste. :smile:

Gruß, Rainer

Hi Alex,

das Steuerelement auf der Form nennt sich ListEx. Sie fungiert
genauso wie eine normale Listbox und auch deren Zugriff. Nur
mit dem Unterschied das du dort zusaetzlich Bilder einpflegen
kannst :smile:
Wenn du eine Normale Liste nimmst, so musst du aus Listex
Listbox machen :smile:

ahhh, die hab ich nicht. :smile: Ist das ein UC? … OK, änder ich.
Bis gleich.

Gruß, Rainer

Hallo Rainer,

ich glaub ich muss mich schaemen :-/
Ich habs hinbekommen *wahnsinn*

in der folgenden Sub hing der Fehler

Private Sub Text1\_KeyDown(KeyCode As Integer, Shift As Integer)
On Error Resume Next
Dim Retval As Long
Select Case KeyCode
 Case vbKeyUp
 Retval = GetText(True, Text1)
 Case vbKeyDown
 Retval = GetText(False, Text1)
End Select
End Sub

wenn nur den Eintrag keyCode=0 machst, dann klappt es!
Also:

Private Sub Text1\_KeyDown(KeyCode As Integer, Shift As Integer)
On Error Resume Next
Dim Retval As Long
Select Case KeyCode
 Case vbKeyUp
 Retval = GetText(True, Text1)
 Case vbKeyDown
 Retval = GetText(False, Text1)
End Select
keycode=0
End Sub

Es wurde alles akkurat makiert. Nur dann kam ja noch die Pfeil Taste nach oben . Ergo der text wurde wieder Deselktiert.

Nunja, jetzt bin ich wenigstens um einiges schlauer.
Trotzdem Danke für deine Bemuehungen :smile:

LG Alex

Hi Alex,

läuft jetzt. Steigt aber bei Ubound(OldText) aus, weil Savetext nie aufgerufen wird und Redim Oldtext … nie abgearbeitet wird. Dabei ist mr noch etwas aufgefallen.

Dim OldText As Variant 'Alte Texteingaben!

das muß doch

Dim OldText() As Variant 'Alte Texteingaben!

heißen. Sonst steigt er Dir schon beim Redim aus. Laß mal OnError weg und verändere die Einstellungen Deiner IDE, Du unterdrückst die Fehlermeldungen! Deshalb wird der Code gar nicht erst abgearbeitet, die Prozedur wird wegen On Error verlassen und Du wunderst Dich, daß nichts passiert.

Gruß, Rainer

Hi Alex,

Ich habs hinbekommen *wahnsinn*

OK, bei mir tut er’s so nicht. Liegt wohl an den Einstellungen meiner IDE, die läßt das nicht zu.

Gut wenn’s geht !!! :smile:

Gruß, Rainer

Hi Rainer,

Nein mit Dim OldText as Variant geht es da diese Variable auch alles annehmen kann. ergo auch ein Array werden.
Schreibe mal ein Text in die textbox und mache mal ein Button daneben.
In dem Procedure vom Button schreibe dann mal folgendes.

Call SaveText(ByVal Text1)
text1.text=""

Dann schaue dir das alles mal im Debug Modus an. Das funzt allet :wink:
Aber den Fehler habe ich nun nach ueber 8 Stunden endlich gefunden *grml*

Aber was meintest du mit IDE anders einstellen?
Ich verwenden On Error resume next sehr oft, denn wenn später mal ein unvorhersehbarer Fehler auftritt, nicht gleich das ganze Prog abschmiert und man so die Chance hat vlt. noch etwas zu retten :smile:

LG Alex

Hi alex,

Nein mit Dim OldText as Variant geht es da diese Variable auch
alles annehmen kann. ergo auch ein Array werden.

Das muß ich gleich mal testen. OK, Variant lasse ich meine Variablen eigentlich nie, das verbraucht mir zu viele Resourcen.

Aber was meintest du mit IDE anders einstellen?

Bei mir steht ‚Bei jedem Fehler unterbrechen‘. Dann entwischen mir keine Fehler, die mich später in der exe überraschen.

Ich verwenden On Error resume next sehr oft, denn wenn später
mal ein unvorhersehbarer Fehler auftritt, nicht gleich das
ganze Prog abschmiert und man so die Chance hat vlt. noch
etwas zu retten :smile:

Ich verwende es gar nicht und meine IDE zeigt mir die Fehler, damit ich sie vermeiden kann. On Error ist IMHO unsauber, ein Relikt, das eigentlich überflüssig ist. :smile:

Gruß, Rainer