![]() |
Elemente aus TStringList in Laufzeit entfernen
Hallo, ich will als Schulprojekt einen Vokabeltrainer erstellen der Vokabeln aus einer TXT Datei liest und den Benutzer diese abfragt. Dabei sollen die Vokabeln sooft zufällig abgefragt werden bis man sie 3 mal hintereinander richtig eingegeben hat.
Funktioniert soweit auch, nur wenn ich eine Vokabel aus der TStringList entferne, gibt es einen "List index out of bounds" Error. Vermutlich löscht Delphi die Vokabel, nur ohne die verbleibenden neu zu sortieren und somit erwischt der Zufallsgenerator mal einen Wert, der im Index nicht mehr vorhanden ist. Wie kann ich das Problem beheben?
Code:
PS: Die deutschen und englischen Vokabeln liegen in 2 separaten Textdateien, da ich es noch nicht geschafft haben die Wörter aus einer Datei getrennt auszulesen.
Begin
Input:= E_UserGuess.Text; E_UserGuess.Text:= ''; Answer:=AnsiCompareStr(VocabularyEnglish[RandomNumber], Input); If Answer=0 Then Begin L_CorrectAnswer.Caption:=''; jpg:= TJpegImage.Create; jpg.LoadFromFile('True.jpg'); Img_FeedBack.Picture.Bitmap.Assign(jpg); jpg.free; End Else Begin L_CorrectAnswer.Caption:='Deine Antwort: '+(Input)+' '+'Richtige Antwort: '+(VocabularyEnglish[RandomNumber]); jpg:= TJpegImage.Create; jpg.LoadFromFile('False.jpg'); Img_FeedBack.Picture.Bitmap.Assign(jpg); jpg.free; End; RepetitionCheck:=RandomNumber; While RepetitionCheck = RandomNumber Do RandomNumber:=random(WordCount); VocabularyEnglish:= TStringList.Create; VocabularyGerman:= TStringList.Create; try VocabularyEnglish.LoadFromFile('Vocabulary.txt'); VocabularyGerman.LoadFromFile('Vocabulary2.txt'); VocabularyGerman.Delete(RandomNumber); VocabularyEnglish.Delete(RandomNumber); L_RemainingWords.Caption:= 'Verbleibende Vokabeln: '+IntToStr(VocabularyGerman.Count); L_RemainingWords.Font.Name:='Helvetica LT Std'; L_RemainingWords.Font.Size:= 16; L_RemainingWords.Font.Color:= RGB(170,220,70); finally VocabularyGerman.Free; end; |
AW: Elemente aus TStringList in Laufzeit entfernen
Stringlisten beginnen bei Index 0. Nicht nur deswegen solltest du sicherstellen, dass deine Variable RandomNumber im Bereich zwischen 0 und TStringList.Count-1 liegt, bevor du sie als Index für die Stringliste(n) benutzt (z.B. zum Löschen eines Strings aus der Liste).
Grüße Dalai |
AW: Elemente aus TStringList in Laufzeit entfernen
Zitat:
Code:
Haus,House
Hund,Dog
Code:
ungetestet
var
Vocab: TStringDynArray; begin Vocab := liste.strings[i].Split([',']); // DE: Vocab[0] // EN: Vocab[1] |
Dieses Thema wurde am "16. Nov 2018, 17:58 Uhr" von "Luckie" aus dem Forum "Algorithmen, Datenstrukturen und Klassendesign" in das Forum "Object-Pascal / Delphi-Language" verschoben.
|
AW: Elemente aus TStringList in Laufzeit entfernen
Zitat:
Danke für den Tipp @DieDolly, probier ich gleich mal aus. :thumb: |
AW: Elemente aus TStringList in Laufzeit entfernen
Zitat:
Zitat:
Code:
Count ergebe hier 4. Um auf das vierte Item zuzugreifen, muss man aber [3] nutzen (weil die Liste null-basiert ist, erstes Item 0, zweites 1 usw.).
[0] => A
Count-1 => D Tipp am Rande: wenn dein Lehrer anfängt Arrays zu deklarieren wie test: array[1 .. 19] dann ignorier das am besten. Diese verfluchten 1-basierten Deklarationen erzeugen nur Probleme früher oder später. |
AW: Elemente aus TStringList in Laufzeit entfernen
'ne Stringliste ist eigentlich schon geeignet.
Wenn man eine Datei hat, in der die Vokabeln in dieser Form stehen:
Code:
so kann man mit
englisch=deutsch
House=Haus Car=Auto
Delphi-Quellcode:
den Inhalt abfragen, ohne dass man dabei dann zwei Dateien parallel pflegen muss.
EnglischeVokabel := VokabelStringliste.Names[RandomNumer];
DeutschVokabel := VokabelStringliste.ValueFromIndex(RandomNumber); Die Pflege kann man im Programm recht leicht mit 'nem TValueListEditor realisieren. Der dürfte irgendwo in der Komponentenpalette zu finden sein. |
AW: Elemente aus TStringList in Laufzeit entfernen
Zitat:
Zitat:
|
AW: Elemente aus TStringList in Laufzeit entfernen
Zitat:
|
AW: Elemente aus TStringList in Laufzeit entfernen
Zitat:
INI-Dateien bestehen aus Bereichen und Werteparen:
Code:
Vor dem Gleichheitszeichen steht der Name (Mehrzahl = Namen -> englisch = Names) des zu konfigurierenden "Teils" und hinter dem Gleichheitszeichen sein Wert (eine mögliche Übersetzung von Wert ins Englische ist Value (Einzahl) -> Values (Mehrzahl)).
[BereichMitBeliebigemEindeutigemNamen]
Name1=Wert1 Name2=Wert2 Name3=Wert3 [EnglischDeutsch] Car=Auto House=Haus Delphi=Delphi [DeutschEnglisch] Auto=Car Haus=House Delphi=Delphi [WeiterSprachpaareMoeglich] ...=... Und das ist ein "Wissen", was man Delphi schon von Anfang an beigebracht hat und heute immernoch nutzen kann, um mit wenig Aufwand 'nen Vokabeltrainer zu schreiben ;-) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:45 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz