Lösungsansatz gesucht

Hallo,

ich sitze hier und hab irgendwo ne denkschwaeche.
Ich möchte folgendes realisieren.

Auf einer Form ist eine Listbox und eine Textbox

Der Tabstop aller Controls ist auf false gesetzt.
In der Liste stehen Daten wie zum bsp

Alex
Alexander
Alexandra
Bernd
Peter
Petra
etc…

wenn nun die Textbox selektiert ist und Tab wird gedrueckt so soll aus der Liste der eintrag genommen werden, der mit den Anfangsbuchstaben des Textes was in der textbox steht beginnen. Soweit kein Problem. Aber wenn man dann erneut ein zweites mal tab betaetigt so soll der naechste wert der mit den Buchstaben anfängt genommen werden und so weiter

Bsp:

Eingabe in Textbox = Al
Tab --> Alex
Tab -->Alexander
Tab --> Alexandra
Tab --> Alex
etc.

Eingabe in Textbox =Alexa
Tab --> Alexander
Tab --> Alexandra
Tab --> Alexander
etc.

Eingabe in Textbox =xyz
Tab --> Nichts passiert

Wenn nichts in der textbox steht, so soll der 1 Eintrag in der Liste eingetragen werden.

Desweiteren geht es weiter. Nehmen wir nun einmal an in der textbox steht Müller Al und es wird TAB gedrueckt.
So sollte dann ja vorerst in der textbox „Müller Alex“ stehen.
Nun soll noch zusaetzlich, die neu hinzugekommen Buchstaben, ergo das „ex“ makiert werden und dies sollte beim erneuten drücken von Tab vernachlässigt werden.

Bsp:
Eingabe in textbox „Müller Al“
Tab --> Müller Alex
Tab --> Müller Alexander
Tab --> Müller Alexandra

Hat jemand eine Idee, wie ich das am besten Lösen koennte ohne arg resourcen zu verbrauchen. Desweiteren sollte die Sache binnen paar ms geschehen.
Derzeit stehe ich ein wenig auf dem Schlauch was da angeht und schaetzungsweise mit 100 Zeilen Code würde ich das hinbekommen. Aber das ist zuviel und würde zulange dauern :-/

LG Alex

Hallo Alex,

ich muß noch mal zurück fragen, ob ich alles verstanden habe.

Du hast eine Lisze und eine Textbox auf der Form. Du tippst in der Textbox einen Text und die Listbox soll in die erste Zeile springen, die dem Text der Textbox enthält, wie in der Hilfe von VB. Richtig? Nun die Frage, wozu TAB? Damit verläßt Du die textbox und mußt sie erst wieder neu anklicken. Warum überhaupt eine zusätzliche Taste? Warum soll die Listbox nicht gleich auf die Änderungen des Textes reagieren? Dafür ist das Change Ereignis der Textbox da.

Also noch mal die Frage, warum Tab? Was habe ich fasch verstanden?

Gruß, Rainer

Lösung
Hallo Alex,

(noch mal überarbeitet)

Wenn ich Dich richtig verstanden habe, suchst Du das hier:

Option Explicit

Private Sub Text1\_Change()
 Dim i As Integer
 Dim n As Integer
 Dim m As Integer
 Dim v As Integer
 Dim t As Integer
 Dim txt As String
 Dim su As String
 For n = 1 To Len(Text1.Text)
 For i = 0 To List1.ListCount - 1
 txt = List1.List(i)
 su = Left(Text1.Text, n)
 If InStr(txt, su) Then
 List1.ListIndex = i
 t = i
 m = n
 Exit For
 End If
 Next
 Next
 Text1.Text = List1.List(t)
 If m 

Gruß, Rainer

Hallo Rainer :smile:

danke erst einmal für deine Antwort.

Zu meinem Problem:
Also auf der Form existiert EINE Listbox und Eine Textbox und eine Richtext Box.

So nun kann der User in die Textbox eine Eingabe machen und erst wenn er die Taste „TAB“ betaetigt soll die Vervollstaendigung stattfinden.
Ich habe bei allen Controls mittels

on error resume next
dim c as control
For each c in Me
c.tabstop=false
next

Den Tabstop auf False gesetzt. Dies bedeutet das man nun ueber das KeyPress Ereigniss die Tabtaste abfragen kann.

Select case Keyascii
case 9
call Vervollstaendige(List1,Text1)
end select

private Sub Vervollständige(l as Listbox, T as Textbox)
'Hier dann der Quelltext zu vervollstaendigung
end sub

Da auch auf Eingaben in der Textbox vonF1, F2 und F12 reagiert werden muss, so nahm ich die Variante!

Nun ein kleines Demo:

In der Listbox steht

Alex
Alexander
Alexandra
Bernd
Klaus
Dieter

Eingabe im Text ist Müller A.
Nun wir die „TAB“ Taste gedrueckt.
Es wird die Sub Vervollständige angesprungen!
Dort soll nun aus der Liste der 1 Eintrag gewaehlt werden der mit A anfaengt! Dieser soll dann an Text1 angehaengt werden und die ersetzten Zeichen sollen makiert werden.
Bsp.

Text1 = Müller Alex --> lex sollte makiert sein.
Wenn der Benutzer nun erneut auf „TAB“ drueckt soll der naechste Eintrag aus der Liste gewählt werden

Bsp. Text1 = Müller Alex --> lex ist makiert und wird dadurch vernachlässigt!
Nach der Sub Vervollständige muesste dann Müller Alexander dastehen wobei lexander makiert ist!

Wenn nun in der Text bsp. Müller Z ist und er nichts mit dem Z in der Liste findet, so sollte der 1 Eintrag eingetragen werden und makiert werden. Beim erneuten TAB sollte dann der 2 Eintrag aus der Liste gewählt werden. Wenn das Listende erreicht ist, so sollte dann wieder der erste Eintrag gewählt werden.

Weisst du nun wie ich das meine?

Ich werde mich nachher mal hinsetzen und selbst was probieren und dir das dann mal posten. Es wird aber viel Source werden und vielleicht erkennst du, wo ich da was optimieren koennte.

LG Alex

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

Hallo Rainer,

man sollte es doch net auf Krampf versuchen, sondern mal ne Nacht drüber schlafen :-S

Mache mal folgendes:

Erstelle eine Form. Setze darauf eine Listbox (List1) darauf dann eine Textbox (Text1).
Setze die Tabstop Eigenschaft von der Listbox und der Textbox auf False!

nun kopiere mal folgenden Code in das Project

Option Explicit

Private Sub Form\_Load()
 List1.AddItem "Alex"
 List1.AddItem "Alexander"
 List1.AddItem "Alexandra"
 List1.AddItem "Bernd"
 List1.AddItem "Klaus"
 List1.AddItem "Kathrin"
 List1.AddItem "Susanne"
 List1.AddItem "Annegret"
End Sub


Private Sub Text1\_KeyPress(KeyAscii As Integer)
Select Case KeyAscii
 Case 9
 Call Vervollständige(List1, Text1)
 Text1.SetFocus
End Select
End Sub


Private Sub Vervollständige(l As ListBox, t As TextBox)
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.List(i)), LCase(Search), 1) = 1 Then
 z = z + 1
 If z \> count Then
 t.Text = Mid(t.Text, 1, pos1) & l.List(i)
 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.List(i)), Search, 1) = 1 Then
 count = 1
 t.Text = Mid(t.Text, 1, pos1) & l.List(i)
 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

Schreibe nun mal ein A und druecke mehrmals hintereinander die Taste „TAB“ du kannst auch mal ein al oder k schreiben und dann TAB druecken :smile:

Siehst du eine Möglichkeit wie man das noch optimieren kann?

LG Alex

Hallo Alex,

hast Du Dir den Beispielcode von mir schon mal angesehen? Mal ausprobiert, was der macht?

Gruß, Rainer

Hallo Rainer,

sicherlich habe ich mir deinen Code angeschaut. Jedoch macht er nicht das was er sollte :-/ Du hast mich da in der Sache falsch verstanden :-/
Wenn du mal mein Demo testest dann siehst du was ich meine!
Aber dein Demo wies ein kleinen Bug auf. Die Backspace Taste funktioniert nun nicht mehr :confused:

Aber hast du eine Variante gefunden, wie man meinen Code noch optimieren koennte?

Liebe Gruesse Alex

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

Hi Anno,

sicherlich habe ich mir deinen Code angeschaut. Jedoch macht
er nicht das was er sollte :-/ Du hast mich da in der Sache
falsch verstanden :-/

offensichtlich.

Wenn du mal mein Demo testest dann siehst du was ich meine!

Leider nein, Dein Programm macht bei mir beim drücken auf Tab, was meins ohne drücken auf Tab macht, nur daß ich mit Tab nicht mehr zur Liste komme um dort mit den Cursortasten zu scrollen.

Aber dein Demo wies ein kleinen Bug auf. Die Backspace Taste
funktioniert nun nicht mehr :confused:

Aber hast du eine Variante gefunden, wie man meinen Code noch
optimieren koennte?

Nein, ich habe ja noch nicht verstanden, was der Code tun soll, warum Du den Vorgang unbedingt mit TAB auslösen willst.

Gruß, Rainer

Hallo Rainer,

erst einmal danke für deine Gedult. Nochmal zu der Tab Geschichte.

Sobald Text1 selektiert ist, so werden die Tasten TAB, F1, F2, F12, STRG+R aktiv. Das bedeutet. Sobald du eine von den Tasten drueckst, soll je nach Taste eine unterschiedliche Aktion ausgefuehrt werden :smile:

Das die Tab Taste zum selektieren eines anderen Steuerelementes genutzt wird, das will ich unterbinden :smile:

Was aber noch der Unterschied ist, das man einen beliebigen Text eingeben kann und durch druecken der Tab Taste der Eintrag gesucht wird.

Du koenntest also eingeben

0815 Musterhausen, Musterweg 08, Mueller Al --> und dann Tab
Nun sollen die Einträge gesucht werden die mit Al beginnen.
Stehen nun mehrere Einträge in der Liste die mit wie in diesem Bsp. mit Al anfangen, so wird beim druecken der Tab Taste der 1 gefunden Eintrag eingetragen und das neu hinzugefügte wird selektiert. Drueckst du nun erneut die Tab Taste so wird der naechste gefunde Eintrag selektiert etc.
Auch muss in der Anwendung gegeben sein das man in der Textbox den Cursor an eine andere Stelle setzt und dort ein oder mehrere Zeichen ändert, ohne das die Sub zum suchen in der Liste aufgerufen wird.

Liebe Gruesse Alex

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

Hi Alex,

also noch mal ohne Code, ich hab’s immer noch nicht verstanden. :smile:
Du beschreibst mir immer, wie Du das machen willst, aber nicht was.

Sobald Text1 selektiert ist, so werden die Tasten TAB, F1, F2,
F12, STRG+R aktiv. Das bedeutet. Sobald du eine von den Tasten
drueckst, soll je nach Taste eine unterschiedliche Aktion
ausgefuehrt werden :smile:

OK, das kann ja kein Problem sein. Warum Du dazu unbedingt die TAB-Taste verwenden willst, die eine Sonderstellung hat, hast Du noch nicht verraten.

Das die Tab Taste zum selektieren eines anderen
Steuerelementes genutzt wird, das will ich unterbinden :smile:

Das habe ich verstanden, nur warum Du das willst nicht. :smile: Die Tabstopps hast Du ja schon aus, das ist gelöst.

Was aber noch der Unterschied ist, das man einen beliebigen
Text eingeben kann und durch druecken der Tab Taste der
Eintrag gesucht wird.

Hmmm, OK ich mach das dann mal so, auch wenn es nicht einleuchtet …

Du koenntest also eingeben

0815 Musterhausen, Musterweg 08, Mueller Al --> und dann
Tab
Nun sollen die Einträge gesucht werden die mit Al beginnen.

Ahhhh, das ist etwas anderes! Wie erfährt der Computer, wonach er suchen soll? Das geht IMHO nur, wenn Du das mit der Maus markierst.

Stehen nun mehrere Einträge in der Liste die mit wie in diesem
Bsp. mit Al anfangen, so wird beim druecken der Tab Taste der
1 gefunden Eintrag eingetragen und das neu hinzugefügte wird
selektiert. Drueckst du nun erneut die Tab Taste so wird der
naechste gefunde Eintrag selektiert etc.

OK.

Auch muss in der Anwendung gegeben sein das man in der Textbox
den Cursor an eine andere Stelle setzt und dort ein oder
mehrere Zeichen ändert, ohne das die Sub zum suchen in der
Liste aufgerufen wird.

Ja, ist OK, so wie ich das geschrieben habe kann man nur Beiträge aus der Liste suchen.

Gruß, Rainer

Hi Alex,

OK, wie wär’s dann hiermit. Du mußt den Teil, der in der Liste gesucht werden soll mit der Maus markieren.

Option Explicit


Private Sub Form\_Load()
 List1.AddItem "Alex"
 List1.AddItem "Alexander"
 List1.AddItem "Alexandra"
 List1.AddItem "Bernd"
 List1.AddItem "Klaus"
 List1.AddItem "Kathrin"
 List1.AddItem "Susanne"
 List1.AddItem "Annegret"
End Sub

Private Sub Text1\_KeyDown(KeyCode As Integer, Shift As Integer)
 Dim i As Integer
 Dim n As Integer
 Dim su As String
 If KeyCode = 9 Then
 If Text1.SelLength \> 0 Then
 su = Mid(Text1.Text, Text1.SelStart + 1, Text1.SelLength)
 n = List1.ListIndex
 If n List1.ListCount - 1 Then n = 0
 List1.ListIndex = n
 i = n + 1
 While i n
 If i \> List1.ListCount - 1 Then i = 0
 'If InStr(List1.List(i), su) = 1 Then 'wenn die Zeile mit den Suchstring anfangen soll
 If InStr(List1.List(i), su) Then 'wenn die Zeile den Suchtext beinhalten soll
 List1.ListIndex = i
 Exit Sub
 End If
 i = i + 1
 If i \> List1.ListCount - 1 Then i = 0
 Wend
 End If
 End If
End Sub

Gruß, Rainer