AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Elemente aus TStringList in Laufzeit entfernen

Ein Thema von KetchUp · begonnen am 16. Nov 2018 · letzter Beitrag vom 25. Nov 2018
Antwort Antwort
Seite 1 von 11  1 23     Letzte »    
KetchUp

Registriert seit: 16. Nov 2018
31 Beiträge
 
#1

Elemente aus TStringList in Laufzeit entfernen

  Alt 16. Nov 2018, 17:21
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:
    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;
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.

Geändert von KetchUp (16. Nov 2018 um 17:23 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.682 Beiträge
 
Delphi 5 Professional
 
#2

AW: Elemente aus TStringList in Laufzeit entfernen

  Alt 16. Nov 2018, 17:44
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
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#3

AW: Elemente aus TStringList in Laufzeit entfernen

  Alt 16. Nov 2018, 17:52
Zitat:
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.
Ich denke hier gerade spontan an eine Liste, wo DE und EN per Kommata getrennt stehen
Code:
Haus,House
Hund,Dog
Code:
var
 Vocab: TStringDynArray;
begin
 Vocab := liste.strings[i].Split([',']);
 // DE: Vocab[0]
 // EN: Vocab[1]
ungetestet
  Mit Zitat antworten Zitat
16. Nov 2018, 17:58
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.
KetchUp

Registriert seit: 16. Nov 2018
31 Beiträge
 
#5

AW: Elemente aus TStringList in Laufzeit entfernen

  Alt 16. Nov 2018, 18:11
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
Danke, ich wusste das die Liste mit 0 beginnt aber das mit dem Count-1 muss ich mir noch mal anschauen.

Danke für den Tipp @DieDolly, probier ich gleich mal aus.
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#6

AW: Elemente aus TStringList in Laufzeit entfernen

  Alt 16. Nov 2018, 18:13
Zitat:
Danke, ich wusste das die Liste mit 0 beginnt aber das mit dem Count-1 muss ich mir noch mal anschauen.
Beispieliste
Zitat:
A
B
C
D
Code:
[0] => A

Count-1 => D
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.).

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.
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 Beiträge
 
Delphi 7 Professional
 
#7

AW: Elemente aus TStringList in Laufzeit entfernen

  Alt 16. Nov 2018, 18:54
'ne Stringliste ist eigentlich schon geeignet.

Wenn man eine Datei hat, in der die Vokabeln in dieser Form stehen:
Code:
englisch=deutsch
House=Haus
Car=Auto
so kann man mit
Delphi-Quellcode:
EnglischeVokabel := VokabelStringliste.Names[RandomNumer];
DeutschVokabel := VokabelStringliste.ValueFromIndex(RandomNumber);
den Inhalt abfragen, ohne dass man dabei dann zwei Dateien parallel pflegen muss.

Die Pflege kann man im Programm recht leicht mit 'nem TValueListEditor realisieren. Der dürfte irgendwo in der Komponentenpalette zu finden sein.
  Mit Zitat antworten Zitat
KetchUp

Registriert seit: 16. Nov 2018
31 Beiträge
 
#8

AW: Elemente aus TStringList in Laufzeit entfernen

  Alt 16. Nov 2018, 19:13
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.).
Danke, jetzt hab ich das auch verstanden

so kann man mit
Delphi-Quellcode:
EnglischeVokabel := VokabelStringliste.Names[RandomNumer];
DeutschVokabel := VokabelStringliste.ValueFromIndex(RandomNumber);
Danke das funktinoniert super. Aber warum weiß Delphi bei ".Names" das ich den Text vor dem "=" haben will und bei ".ValueFromIndex" den Text dahinter?
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#9

AW: Elemente aus TStringList in Laufzeit entfernen

  Alt 16. Nov 2018, 19:21
Zitat:
Aber warum weiß Delphi bei ".Names" das ich den Text vor dem "=" haben will und bei ".ValueFromIndex" den Text dahinter?
Das sagen doch schon die Zugriffe. Mit Names greift man auf den Namen zu (das vor dem =) und Value ist das nach dem =.
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 Beiträge
 
Delphi 7 Professional
 
#10

AW: Elemente aus TStringList in Laufzeit entfernen

  Alt 16. Nov 2018, 19:51
Danke das funktinoniert super. Aber warum weiß Delphi bei ".Names" das ich den Text vor dem "=" haben will und bei ".ValueFromIndex" den Text dahinter?
Das stammt noch aus den Windowsanfangszeiten, als Konfigurationen (fast ausschließlich) in INI-Dateien gespeichert wurden.

INI-Dateien bestehen aus Bereichen und Werteparen:
Code:
[BereichMitBeliebigemEindeutigemNamen]
Name1=Wert1
Name2=Wert2
Name3=Wert3
[EnglischDeutsch]
Car=Auto
House=Haus
Delphi=Delphi
[DeutschEnglisch]
Auto=Car
Haus=House
Delphi=Delphi
[WeiterSprachpaareMoeglich]
...=...
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)).

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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 11  1 23     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:21 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz