Delphi-PRAXiS
Seite 1 von 11  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Elemente aus TStringList in Laufzeit entfernen (https://www.delphipraxis.net/198592-elemente-aus-tstringlist-laufzeit-entfernen.html)

KetchUp 16. Nov 2018 16:21

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:
    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.

Dalai 16. Nov 2018 16:44

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

DieDolly 16. Nov 2018 16:52

AW: Elemente aus TStringList in Laufzeit entfernen
 
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

DP-Maintenance 16. Nov 2018 16: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 16. Nov 2018 17:11

AW: Elemente aus TStringList in Laufzeit entfernen
 
Zitat:

Zitat von Dalai (Beitrag 1418253)
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. :thumb:

DieDolly 16. Nov 2018 17:13

AW: Elemente aus TStringList in Laufzeit entfernen
 
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.

Delphi.Narium 16. Nov 2018 17:54

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:
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.

KetchUp 16. Nov 2018 18:13

AW: Elemente aus TStringList in Laufzeit entfernen
 
Zitat:

Zitat von DieDolly (Beitrag 1418258)
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 :-D

Zitat:

Zitat von Delphi.Narium (Beitrag 1418260)
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?

DieDolly 16. Nov 2018 18:21

AW: Elemente aus TStringList in Laufzeit entfernen
 
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 =.

Delphi.Narium 16. Nov 2018 18:51

AW: Elemente aus TStringList in Laufzeit entfernen
 
Zitat:

Zitat von KetchUp (Beitrag 1418261)
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 ;-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:25 Uhr.
Seite 1 von 11  1 23     Letzte »    

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