VB6: Schleifenbedingung erfüllt sich nicht

Hallo

das ist mein erster Artikel auf Wer-Weiss-Was und gleich habe ich ein Problem. Ich versuche es mal zu schildern:

Mein Programm ist ein Vokabeltrainer. Es liest Vokabeln aus einer CSV-Datei ein und fragt diese dann ab. Der User muss die korrekte Übersetzung eingeben und dann gibt’s die nächste Vokabel. So weit, so gut. Jetzt sind aber irgendwann mal keine Vokabeln mehr im Array und das Programm soll auslaufen oder halt was anderes machen. Nun kommt es aber wohl gelegendlich vor, dass a welchem Grundauch immer eine Endlosschleife entsteht und sich wärend der Ausführung der ganze Rechner aufhängt. Ich mache mal folgendes:
Ich poste jetzt mal meinen Quellcode hier rein und dann wär ich sowas von glücklich, wenn jemand von euch meinen logischen Fehler finden würde. Ach nochwas: Entschuldigt mangelnde Einrückungen. Ich bin nämlich blind, arbeite zur Zeit am Computer mit einer Sprachausgabe, die liest dn Bildschirminhalt vor, und damit ist es schwierig, beim proggen auf Einrückungenzu achten. Also hier mal der Quellcode, ich glaube der Fehler liegt in der cmdWeiter:

Option Explicit
' Der deklarationsteil
' Funktion zur Soundwiedergabe
Private Declare Function PlaySound Lib "winmm.dll" Alias "PlaySoundA" \_
(ByVal lpszName As String, ByVal hModule As Long, \_
ByVal dwFlags As Long) As Long
Public play As Variant
Public SoundNumber As Integer
' Die Anzahl von Vokabeln im Array
Public anzVocabeln As Variant
' Einzelne Vokabel aus dem Array
Public vocabel As Variant
' Variablen für den Punktestand
Public scorePos As Integer
Public scoreNeg As Integer
' Das Vokabelarray und das Hilfsarray für die Prüfung, ob die Vokabel schon mal abgefragt wurde
Dim myArray() As String
Dim myHelpArray() As String
' Die Zufallszahl für die Vokabelauswahl
Dim randomvalue As Integer
' Die Ober- und Untergrenzen des Vokabelarrays
Dim upperbound As Integer
Dim lowerbound As Integer

' Aktionen für das Drücken des beenden Schalters festlegen
Private Sub cmdBeenden\_Click()
' Zufallsgenerator inizialisieren
Randomize
 ' Verabschiedungsdatei abspielen
 SoundNumber = CInt(Int((3 - 1 + 1) \* Rnd() + 1))
 play = PlaySound(App.Path & "\sounds\tschoe" & SoundNumber & ".wav", 0, 0)
' Programm beenden
Unload Me
End Sub

'Aktionen für den Fall festlegen, dass der User
' eine Datei gewählt hat, die Anzahl von abzufragenden Vokabeln angegeben hat
' und auf den Startknopf gedrückt hat.
Private Sub cmdStarten\_Click()
' Prüfen, ob eine Datei angegeben wurde
If tbxDatei.Text = "" Then
' Zufallsgenerator anwerfen
Randomize
 ' Fehlerdatei abspielen
 SoundNumber = CInt(Int((3 - 1 + 1) \* Rnd() + 1))
 play = PlaySound(App.Path & "\sounds\keinedatei" & SoundNumber & ".wav", 0, 1)
MsgBox "Keine oder ungültige Datei angegeben!"
Else
If tbxAnzVocabeln.Text = "" Then
' Zufallsgenerator anwerfen
Randomize
 ' Fehlerdatei abspielen
 SoundNumber = CInt(Int((3 - 1 + 1) \* Rnd() + 1))
 play = PlaySound(App.Path & "\sounds\keineanzahl" & SoundNumber & ".wav", 0, 1)
MsgBox "Gib erst an, wieviele Vokabeln du abgefragt werden möchtest"
Else
' wenn der Weiter-Schalter nicht mehr verfügbar ist, soll er wieder anwählbar sein
If cmdWeiter.Enabled = False Then
cmdWeiter.Enabled = True
End If
' Den Richtig-Falsch-Zähler nullen
scoreNeg = 0
scorePos = 0
' Setzt die Untergrenze der Arrays auf 0
lowerbound = 0
' Holt sich die gewünschte Anzahl von Vokabeln aus dem Eingabefeld
anzVocabeln = tbxAnzVocabeln.Text
' Jetzt wird die Vokabeldatei geladen und in ein 2dimensionales Array umgewandelt
Dim f As Integer
 Dim TextZeile As String
 Dim mytmpArray() As String
 Dim Rows As Long
 Dim Fields As Integer
 Dim tmpString() As String
 Dim i As Long
 Dim j As Long
 Dim k As Long


 f = FreeFile
' Holt sich den Dateinamen aus dem Eingabefeld und öffnet die Datei
 Open tbxDatei.Text For Input As f
 ' Arbeitet so lange das Ende der Datei noch nicht erreicht wurde
 Do While Not EOF(f)
 ' Speichert die aktuelle Zeile
 Line Input #f, TextZeile
 ' fügt dem Arraykonstrukt eine Zeile hinzu
 Rows = Rows + 1
 Loop
 Close f
Fields = 1
 ReDim myArray(Rows, Fields)


 f = FreeFile

 Open tbxDatei.Text For Input As f
 Do While Not EOF(f)
 Line Input #f, TextZeile

 mytmpArray() = Split(TextZeile, "=", , vbTextCompare)
 i = UBound(mytmpArray())
 For j = 0 To i
 myArray(k, j) = mytmpArray(j)
 Next j
 k = k + 1
 Loop
 Close f
' Prüfen, ob der User nicht mehr Vokabeln gefragt werden will, als in der Datei vorhanden sind
 If anzVocabeln 0 Then
' Hier laden wir nochmal unseren Zufallsgenerator
' Es soll später zufällig eine Sounddatei abgespielt werden
' Je nach dem, ob die Vokabel richtig war oder nicht
Randomize
'Jetzt prüfen wir, ob der User die Richtige Übersätzung eingegeben hat
If tbxFranzoesisch.Text = myArray(vocabel, 1) Then
' Wir zählen die Variable für richtige Vokabeln hoch,
' geben einen entsprechenden Sound aus
' und Zeigen den neuen Zählerstand am Bildschirm an
scorePos = scorePos + 1
 SoundNumber = CInt(Int((3 - 1 + 1) \* Rnd() + 1))
 play = PlaySound(App.Path & "\sounds\richtig" & SoundNumber & ".wav", 0, 1)
MsgBox "richtig!"
tbxScorePos.Text = scorePos
' In diesen Zweig gehen wir, wenn die Übersätzung falsch war,
' Der Zähler für falsche Vokabeln wird hochgezählt und ein entsprechender Sound ausgegeben,
' Das Ergebnis wird sofort am Bildschirm angezeigt.
Else
scoreNeg = scoreNeg + 1
 SoundNumber = CInt(Int((3 - 1 + 1) \* Rnd() + 1))
 play = PlaySound(App.Path & "\sounds\falsch" & SoundNumber & ".wav", 0, 1)
MsgBox "leider Falsch" & vbCrLf & "Richtig wäre gewesen: " & myArray(vocabel, 1)
tbxScoreNeg.Text = scoreNeg
End If
' Jetzt suchen wir nach einer neuen Vokabel zum abfragen
Do
' Zufallsgenerator laden, neue Vokabel an hand der Zufallszahl aussuchen
Randomize
randomvalue = CInt(Int((upperbound - lowerbound + 1) \* Rnd() + lowerbound))
vocabel = randomvalue
' Die neue Vokabel anzeigen
tbxDeutsch.Text = myArray(vocabel, 0)
' Das Übersätzungseingabefeld leeren
tbxFranzoesisch.Text = ""
' Jetzt kommt der Schleifenfuß
' Die schleife soll laufen,
' bis die ermittelte Vokabel im Hilfsarray nicht als bereits benutzt markiert festgestellt wurde,
' und bis überhaupt eine Vokabel ermittelt wurde.
Loop Until myHelpArray(vocabel, 1) "set" And myHelpArray(vocabel, 0) "" Or anzVocabeln 

Wie gesagt liest das Programm csv-Datein ein, die das = als Trennzeichen verwenden.

die csv sieht ungefähr so aus:

Tisch=table
Möbel=furniture
Augenbraue=eyebrow

So, das wars. Bitte helft mir, das Programm wird ein Geschenk für meine Freundin.

Gruß

Tschapajew



[MOD] - Pre-Tag eingefügt

Hallo,

das ist mein erster Artikel auf Wer-Weiss-Was und gleich habe
ich ein Problem.

dafür ist w-w-w da. :smile:

dann wär ich sowas von glücklich, wenn jemand von euch
meinen logischen Fehler finden würde.

Du füllst ein Array mit Vokabeln.
Dann ziehst Du daraus zufällig einen Wert, markierst den und versuchst das beim nächsten Mal wieder.

Wenn Du viele Vokabeln hast, wird es gegen Ende der Übung immer schwerer, die verbleibenden Vokabeln zu finden, im schlimmsten Fall sucht das Programm ewig und findet die letzte Vokabel nicht.

Lade die Vokabeln in das Array, mische dann, ohne doppelt zu lesen mit einer einfachen Zählschleife, (Mein Beispiel dazu weiter unten) und arbeite die Übung auch mit einer einfachen Zählschleife ab, das vermeidet das Problem.

Das Beispiel für Mischen:

Option Explicit

Dim Arr() As String

Private Sub Form\_Load()
 Dim i As Integer
 ReDim Arr(100)
 Randomize Timer
 'Array füllen
 For i = 0 To 100
 Arr(i) = CStr(i)
 Next
 Mix
End Sub

Private Sub Mix()
 Dim i As Integer, r As Integer
 For i = UBound(Arr) To LBound(Arr) + 1 Step -1
 r = Int(Rnd(1) \* i)
 Swap r, i
 Next
End Sub

Private Sub Swap(ByVal a As Integer, ByVal b As Integer)
 Dim m As String
 m = Arr(a)
 Arr(a) = Arr(b)
 Arr(b) = m
End Sub

Gru0 Rainer

Hallo

Erst mal danke für die Anregung. Leider müsste ich dafür meinen gesamten Quellcode umstrukturieren um es richtig anwenden zu können. Das Programm macht ja folgendes:

Es füllt das Vokabelarray zweispaltig mit vokabeln und deren Übersetzung. Das quasi, folgendes im Array enthalten ist:

MyArray(0,0) = Tisch
myArray(0,1) = table
myArray(1,0) = Tür
myArray(1,1) = door

Dann spiegel ich das myArray() in ein Hilfsarray myHelpArray(). Dann benutze ich die zweite Spalte des Arrays myHelpArray() dazu um festzulegen und später auch wieder festzustellen, ob die Vokabel schon mal benutzt wurde, in dem ich „set“ in die Spalte mit der Übersetzung schreibe. Später Frage ich dann ja ab, ob in der Übersetzungsspalte von myHelpArray „set“ drinsteht und wenn das der Fall ist, soll meine Suchschleife weiterlaufen, bis eine Vokabel gefunden wird, bei der halt nicht mehr „set“ dabeisteht. Gibt es denn keine Möglichkeit einfach schnell was an meinem Quellcode zu ändern oder einzufügen, dass es funktioniert?

Lieben Gruß

Tschapajew

Hallo Tschapajew,

Erst mal danke für die Anregung. Leider müsste ich dafür
meinen gesamten Quellcode umstrukturieren um es richtig
anwenden zu können.

ganz so schlimm ist das gar nicht.

Das Programm macht ja folgendes:

Es füllt das Vokabelarray zweispaltig mit vokabeln und deren
Übersetzung. Das quasi, folgendes im Array enthalten ist:

MyArray(0,0) = Tisch
myArray(0,1) = table
myArray(1,0) = Tür
myArray(1,1) = door

Ja, aber vorher liest Du die Daten als Text ein und splittest bei ‚=‘.
Vor dem Splitten kannst Du schon mischen.

Dann spiegel ich das myArray() in ein Hilfsarray
myHelpArray(). Dann benutze ich die zweite Spalte des Arrays
myHelpArray() dazu um festzulegen und später auch wieder
festzustellen, ob die Vokabel schon mal benutzt wurde, in dem
ich „set“ in die Spalte mit der Übersetzung schreibe.

Die Prüfung, ob die Vokabel schon benutzt wurde, brauchst Du ja nicht, wenn Du nicht ‚würfelst‘, welche Vokabel als nächstes kommt.

Später
Frage ich dann ja ab, ob in der Übersetzungsspalte von
myHelpArray „set“ drinsteht und wenn das der Fall ist, soll
meine Suchschleife weiterlaufen, bis eine Vokabel gefunden
wird, bei der halt nicht mehr „set“ dabeisteht.

Und das ist das Problem, da hängt der Computer in der Schleife und sucht die verbliebene Vokabel. Nimm nur mal an Du wählst die Zahlen von 1 bis 6 und einen Würfel. Beim ersten Wurf bekommst Du eine vier, dann eine Zwei, dann eine Drei … Übrig bleibt die Sechs.

Nun bist Du gezwungen so lange zu würfeln, bis wirklich die Sechs fällt, bevor Du auf die Frage zugreifen kannst. Wenn Dein Würfel dann von 1 bis 10 000 geht und Du genau eine 333 würfeln musst, weil alle anderen Fragen schon gestellt wurden, würfelt der Computer einige Millionen mal.

Gibt es denn
keine Möglichkeit einfach schnell was an meinem Quellcode zu
ändern oder einzufügen, dass es funktioniert?

Mische das Array schon vor dem Splitten, lass beim Stellen der Fragen das Würfeln weg und ersetze die ‚Do‘-Schleife durch eine Zählschleife. Die Prüfung, ob die Frage schon gestellt wurde kannst Du dann einfach weg lassen, Du kannst sie auch im Programm lassen, sie hat keine weitere Auswirkung.

Du musst nur das Mischen nach dem Laden einfügen und ‚Do … Loop Until …‘ durch eine Zählschleife ersetzen. Der Rest kann bleiben wie er ist.

Gruß Rainer

Hallo

ok, dann änder ich das dementsprechend, danke auf jeden Fall für die Hilfe.

Nur noch ein Problem gibt es:

Entstehen durch deine Tauschmetode in meinem Array denn jetzt keine Doppelten Einträge oder es werden sogar Einträge durch neuere einfach überschrieben? Das denke ich nämlich. Wie kann ich dem denn jetzt noch entgegenwirken. Sorry für die viele Fragerei, ich bin aber noch totaler VB-Anfänger. Deswegen wäre ein auf meinen Quellcode zugeschnittenes Codebeispiel sehr wünschenswert.

Danke im Voraus und Gruß

Tschapajew

Hallo Tschapajew,

Entstehen durch deine Tauschmetode in meinem Array denn jetzt
keine Doppelten Einträge oder es werden sogar Einträge durch
neuere einfach überschrieben?

nein, es werden nur die vorhandenen Einträge getauscht.

Ein Beispiel, was konkret passiert:

Du hat in einem Array die Zahlwörter ‚Eins‘ bis ‚Sechs‘ stehen.

Der Index steht auf UBound(Array), als auf sechs.
ich würfle eine Zahl, z.B. die Vier.
Nun werden die Wörter in Arr(4) und Arr(6) ausgetauscht, im Array steht jetzt:

Eins
Zwei
Drei
Sechs
Fünf
Vier

Der Index wird verringert, steht jetzt auf 5.
Die nächste Zahl wird gewürfelt, ich erhalte zufällig die 1.
Nun werden also Arr(1) und Arr(5) getauscht.
In Arr(1) Stand noch ‚Eins‘ in Arr(5) noch ‚Fünf‘, die werden getauscht, im array steht nun:

Fünf
Zwei
Drei
Sechs
Eins
Vier

Der Index wird wieder verringert, steht nun auf 4, da steht inzwischen ‚Sechs‘.
Ich würfle wieder eine 1 …
Im Array steht nun

Sechs
Zwei
Drei
Fünf
Eins
Vier

Und so weiter.
Du siehst, ich hantiere nur mit dem Index, es kommen keine neuen Strings hinzu und es gehen keine verloren.
Ich muss nicht prüfen, was schon bearbeitet wurde, das ist nur eine Zählschleife, deshalb kann es auch im schlimmsten Fall nicht zu Endlosschleifen kommen.

Gruß Rainer

Hallo, ich nochmal

Jetzt habe ich deinen Code in mein Programm eingebaut. Nun erhalte ich bei drücken des Weiter-Schalters folgende Fehlermeldung:

Run-time error ‚9‘:
Subscript out of range

Laut Debug passiert dieser Fehler in der Zeile:

m = myArray(a)

Was kann das sein?

Klappt deine Funktion denn auch, wenn mein Array zweidimensional ist? Also es ist ja ungefähr so aufgebaut:

myArray(0,0) = „Tastatur“
myArray(0,1) = „keyboard“
myArray(1,0) = „Schleife“
myArray(1,1) = „loop“

Kommt deine Funktion damit zurecht?

Gruß

Tschapajew

Hallo,

Jetzt habe ich deinen Code in mein Programm eingebaut. Nun
erhalte ich bei drücken des Weiter-Schalters folgende
Fehlermeldung:

Run-time error ‚9‘:
Subscript out of range

Laut Debug passiert dieser Fehler in der Zeile:

m = myArray(a)

Was kann das sein?

In a steht eine Zahl, die nicht im Bereich des Arrays liegt, also entweder kleiner als LBound(myArray) ist oder größer als UBound(myArray).

Klappt deine Funktion denn auch, wenn mein Array
zweidimensional ist? Also es ist ja ungefähr so aufgebaut:

myArray(0,0) = „Tastatur“
myArray(0,1) = „keyboard“
myArray(1,0) = „Schleife“
myArray(1,1) = „loop“

Kommt deine Funktion damit zurecht?

Dann müsste sie so aussehen:

Private Sub Swap(ByVal a As Long, ByVal b As Long)
 Dim m0 As String, m1 As String
 m0 = myArray(a, 0)
 m1 = myArray(a, 1)
 myArray(a, 0) = myArray(b, 0)
 myArray(a, 1) = myArray(b, 1)
 myArray(b, 0) = m0
 myArray(b, 1) = m1
End Sub

Mit dem Aufruf:

Swap i, r

wird der Inhalt von i, dem Index der Zählschleife an a übergeben und der gewürfelte Wert r an b.

Wenn die Schleife eine Zählschleife ist:

For i = LBound(Array) To UBound(Array)
 r = Int(Rnd(1)\*i) + LBound(Array)
 Swap i, r
Next

Dann sehe ich keine Chance für einen Fehler.
Wenn Dein Array bei Null anfängt, kannst Du ‚+ LBound(Array)‘ weg lassen. Das habe ich nur jetzt dazugeschrieben, weil das auch anders sein kann.

Gruß Rainer

Hallo Rainer

ich peil das einfach nicht. Habe mich mittlerweile so in meinem Code verstrickt, und ihn mehr zerlegt als berichtigt. Wenn ich dich jetzt darum bitten würde, die nötigen Änderungen vorzunehmen und mir das Ergebnis wieder ins Forum zu posten, würdest du das dann machen? Bekommst dann auch wenns fertig ist einen Copyrighthinweis mit rein, wenn du magst *g*.

Gruß

Tschapajew

Hallo Tschapajew,

ich peil das einfach nicht. Habe mich mittlerweile so in
meinem Code verstrickt, und ihn mehr zerlegt als berichtigt.
Wenn ich dich jetzt darum bitten würde, die nötigen Änderungen
vorzunehmen und mir das Ergebnis wieder ins Forum zu posten,
würdest du das dann machen?

Ja, natürlich. :smile: Das geht dann aber nicht ganz so schnell.
Ich fahre gleich nach Hause, esse etwas …

Bekommst dann auch wenns fertig
ist einen Copyrighthinweis mit rein, wenn du magst *g*.

Nein, das dann doch nicht. Ich ändere ja nur drei Zeilen, das Programm ist immer noch von Dir.

Gruß Rainer

Halt!!!

Brauchst dir keine Arbeit zu machen, ich habe es hinbekommen. Vielen lieben Dank für deine Hilfe und Sorry für meine Begriffsstutzigkeit.

Lieben Gruß

Tschapajew

Hallo Tschapajew,

Brauchst dir keine Arbeit zu machen, ich habe es hinbekommen.

na prima! :smile:

Dann erzähl mal nach dem Testen, wie es jetzt läuft.

Gruß Rainer

Guten Abend

nach einigen Tests scheint das Programm jetzt innerhalb normaler Parameter zu arbeiten. Nochmal vielen Dank für die Hilfe. Nun müsste ich aber noch was anderes wissen:

Ich möchte dem User gerne die Möglichkeit geben zu wählen, in welche Richtung er denn jetzt übersetzen möchte. Dazu brauche ich eine Art auswahlschalter, den der User nach belieben umschalten kann. Der Schalter soll drei Schaltzustände ermöglichen:

Deutsch zu Französisch
Französisch zu Deutsch
gemischt

Das Problem ist jetzt, dass ich mit diversen Typen von Schaltern rumexperimentiert habe, doch nicht zum gewünschten Ergebnis komme. Da mein Fenster durch andere Elemente schon relativ voll ist, kann ich oder möchte ich keine Ausklappliste nehmen, weil die sich über die anderen Elemente klappen würde. Es soll also jeweils immer nur eine Option sichtbar sein, damit alles in einer Zeile abgewickelt werden kann. Kannst du mir noch bitte sagen, wie ich das realisiere und wie ich die jeweils gewählte Option dann ermitteln kann?

Gruß

Tschapajew

Hallo Tschapajew,

Es soll also jeweils immer nur eine Option sichtbar sein,

damit hast Du schon das richtige Stchwort: Option
Es gibt einen OptionButton. Legst Du mehrere davon auf die Form, dann kann immer nur einer davon aktiv sein. Klickst Du einen anderen an, wird der aktiviert (Option1.Value = True) und die anderen werden automatisch deaktiviert.

Willst Du mehrere Gruppen haben, z.b. um einmal die Sprache einzustellen und um andererseits so einen Schwierigkeitsgrad zu wählen, dann musst Du die Gruppen in einen Frame legen.

In der Werkzeugsammlung ist das der weiße Kreis mit dem schwarzen Punkt in der Mitte. Verwende nach Möglichkeit ein Steuerelementefeld, dann wird der Code einfacher.

Falls Du Steuerelementefelder noch nicht kennst …
Lege einen Option Button auf die Form oder in einen Frame.
Klick den Option Button mit rechts an und dann auf kopieren.
Dann klicke mit rechts auf die Form und dann einfügen.
VB wird Dich fragen, ob Du ein Steuerelementefeld verwenden willst, klick Ja. Dann noch mal mir rechts auf die Form und wieder einfügen.
Nun musst Du die Button nur noch positionieren.

Nun brauchst Du nur noch eine Variable, ich habe sie mal Variante genannt, in die Du schreibst, welcher Button geklickt wurde.

Private Sub Option1\_Click(Index As Integer)
 Variante = Index
End Sub

Die verschiedenen Zweige im Programm, abhängig von der Variante würde ich mit Select Case schreiben.

Beispiel wie das in etwa aussehen könnte …

Private Sub Anzeige()
 Select Case Variante
 Case 1
 Text1(0).Text = DeutscheVokabel
 Case 2
 Text1(0).Text = FranzösischeVokabel
 Case 3
 r = Int(Rnd(1) \* 2)
 If r = 0 Then
 Text1(0).Text = DeutscheVokabel
 Else
 Text1(0).Text = FranzösischeVokabel
 Case Else
 MsgBox "Fehler, es ist kein OptionButton aktiviert", vbCritical
 End Select
End Sub

Gruß Rainer

Gruß Rainer

Hallo Rainer

ich habe es jetzt etwas anders gemacht:

Ich habe ein Element namens Listbox in die Form eingefügt und deren Style auf Checkbox eingestellt. Dann habe ich drei Listeneinträge unter List eingetragen:

D zu F
F zu D
zufall

Die erscheint jetzt auch orgnungsgemäß in der Form und ich kann die Drei möglichkeiten auch selektieren. Nun möchte ich eine Schaltervariable erschaffen die 1 2 oder 3 werden kann, abhängig davon, welche Möglichkeit aktuell in der Listbox ausgewählt worden ist. Ich kann aber irgendwie nicht darauf zugreifen, welche Option gerade gewählt ist. Mein code dazu ist bis her folgender:

If libModus.ListCount = 1 Then
modusschalter = 1
Debug.Print modusschalter
End If

Modusschalter nimmt aber einfach keinen Wert an, egal was gewählt ist. Wie nennt sich denn die Eigenschaft, nach der ich bei libModus… fragen muss?

Gruß

Tschapajew

PS: Kreise mit Punkten? Ich bin blind.

Hallo Tschapajew,

Ich habe ein Element namens Listbox in die Form eingefügt und
deren Style auf Checkbox eingestellt. Dann habe ich drei
Listeneinträge unter List eingetragen:

D zu F
F zu D
zufall

Die erscheint jetzt auch orgnungsgemäß in der Form und ich
kann die Drei möglichkeiten auch selektieren.

Ja, aber eben auch alle drei gleichzeitig. Die Checkboxen nützen Dir bei Deinem Vorhaben nichts.

Nun möchte ich
eine Schaltervariable erschaffen die 1 2 oder 3 werden kann,
abhängig davon, welche Möglichkeit aktuell in der Listbox
ausgewählt worden ist. Ich kann aber irgendwie nicht darauf
zugreifen, welche Option gerade gewählt ist. Mein code dazu
ist bis her folgender:

Das sind keine Option-Button, das sind Checkboxen, die alle gleichzeitig an sein können. Die Checkboxen würde ich wieder aus machen. Dann kannst Du einfach die passende Zeile anklicken.

Was Dir das nützt?

Private Sub List1\_Click()
 Modus = List1.ListIndex
End Sub

Du musst nur beachten, daß ‚Nicht angeklickt‘ = Listindex -1 ist, die erste Zeile hat den Listindex = 0, die Zweite Zeile Listindex = 1

Gruß Rainer

Hallo noch mal,

Ich habe ein Element namens Listbox in die Form eingefügt und
deren Style auf Checkbox eingestellt.

da fällt mir noch auf: Da steht bei mir ‚Kontrollkästchen‘. Hast Du den Optionbutton deshalb nicht gefunden? Der könnte bei Dir Radiobutton heißen.

Gruß Rainer

Guten Abend

ich habe es mittlerweile geschafft eine Listbox ins Programm einzubauen, in der man die drei Modi auswählen kann. Wählt man nun einen aus, so schaltet sich die Übersetzungsrichtung um. Sieht so aus:

Private Sub libModus_Click()
modusschalter = libModus.ListIndex + 1#
Case modusschalter
Case 1:
quellfeld = „tbxDeutsch.Text“
zielfeld = „tbxFranzoesisch.Text“
richtung = 1
Case 2:
quellfeld = „tbxFranzoesisch.Text“
zielfeld = „tbxDeutsch.Text“
richtung = 0
End Sub

Scheint auch klaglos zu funktionieren.

Was ich nun machen möchte ist dies:

Zur Zeit heißt es bei mir ja noch so

vocabel = anzVocabeln
’ Die neue Vokabel anzeigen
tbxDeutsch.Text = myArray(vocabel, 0)

Und so soll es werden, damit es dynamisch angezeigt wird, je nach Modus:

vocabel = anzVocabeln
’ Die neue Vokabel anzeigen
quellfeld = myArray(vocabel, richtung)

Verstehst du, was ich vorhabe?

Was muss ich jetzt mit den Variablen Quellfeld und Zielfeld machen, damit sie nicht mit neuen Werten überschrieben werden, sondern quasi als Aliase für die jeweiligen Felder fungieren? Muss ich konstanten daraus machen oder wie?

Gruß

Tschapajew

Guten Morgen :smile:

ich habe es mittlerweile geschafft eine Listbox ins Programm
einzubauen, in der man die drei Modi auswählen kann. Wählt man
nun einen aus, so schaltet sich die Übersetzungsrichtung um.
Sieht so aus:

Private Sub libModus_Click()
modusschalter = libModus.ListIndex + 1#
Case modusschalter
Case 1:

Der Doppelpunkt ist falsch.

quellfeld = „tbxDeutsch.Text“
zielfeld = „tbxFranzoesisch.Text“
richtung = 1
Case 2:

Noch ein Doppelpunkt

quellfeld = „tbxFranzoesisch.Text“
zielfeld = „tbxDeutsch.Text“
richtung = 0

Es fehlt End Select

End Sub

Was Du mit ‚quellfeld‘ und ‚zielfeld‘ vor hast, geht so nicht.

Scheint auch klaglos zu funktionieren.

Was ich nun machen möchte ist dies:

Zur Zeit heißt es bei mir ja noch so

vocabel = anzVocabeln
’ Die neue Vokabel anzeigen
tbxDeutsch.Text = myArray(vocabel, 0)

Und so soll es werden, damit es dynamisch angezeigt wird, je
nach Modus:

vocabel = anzVocabeln
’ Die neue Vokabel anzeigen
quellfeld = myArray(vocabel, richtung)

Verstehst du, was ich vorhabe?

Ja. Dann sollte ‚vocabel‘ der Index der Zählschleife sein. Richtung setzt Du ja oben auf 0 oder 1, damit weist Du die richtige Sprache zu, das ist OK.

Was muss ich jetzt mit den Variablen Quellfeld und Zielfeld
machen, damit sie nicht mit neuen Werten überschrieben werden,
sondern quasi als Aliase für die jeweiligen Felder fungieren?
Muss ich konstanten daraus machen oder wie?

Nein, keine Konstanten. Konstanten weist Du bei der Deklaration einen Inhalt zu, der dann nicht mehr zu verändern ist.

In Quellfeld und Zielfeld willst Du aber abspeichern, in welchem Steuerelement = Control der Text angezeigt werden soll. Die Eigenschaft .Text kannst Du dabei nicht mit speichern, nur die Identifikation des Controls.

Du brauchst in der Deklaration:

Dim Quellfeld as Control
Dim Zeilfeld as Control

und beim Klick in die Listbox:

Case 1

Set quellfeld = tbxDeutsch
Set zielfeld = tbxFranzoesisch

Dei Eigenschft .Text kommt erst jetzt:

quellfeld.Text = myArray(vocabel, richtung)

Gruß Rainer

Hallo Tschapajew,

funktioniert jetzt alles wie gewünscht ?
Wenn nicht, packe mal alle Dateien des Projektes in eine zip-Datei und lade diese hoch mittels der FAQ:2861 .
Und beschreibe was nicht geht.

Gruß
Reinhard