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
DieDolly

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

AW: Elemente aus TStringList in Laufzeit entfernen

  Alt 17. Nov 2018, 16:07
Zitat:
Woher kommt beim ersten Zugriff auf Vocabulary der Inhalt und was meinst Du passiert beim nächsten Zugriff auf Vocabulary?
Post 21 löst viele der Probleme
  Mit Zitat antworten Zitat
KetchUp

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

AW: Elemente aus TStringList in Laufzeit entfernen

  Alt 17. Nov 2018, 16:27
Post 21 löst viele der Probleme
Vielen Dank @ DieDolly für die ausführliche Erklärung.
Kann ich Vokabeln auch wieder aus der txt Datei laden, sodass man die ständig wechseln kann?


Delphi-Quellcode:
// Hier greifst Du auf Vocabulary zu. Wann wurde dort etwas reingeladen?
      Answer:=AnsiCompareStr(Vocabulary.Names[RandomNumber], Input);
Vocabulary wird in FormCreate erstellt. Aber es wird nicht an die Prozedur weitergegeben obwohl Vocabulary global deklariert ist.
Delphi-Quellcode:
     
            finally
// Hier wird Vocabulary 'weggeschmissen
            Vocabulary.Free;
          end;

    end
Oh, das wusste ich nicht. Was ist denn die genaue Funktion von ".Free" ?
  Mit Zitat antworten Zitat
DieDolly

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

AW: Elemente aus TStringList in Laufzeit entfernen

  Alt 17. Nov 2018, 16:29
Zitat:
Kann ich Vokabeln auch wieder aus der txt Datei laden, sodass man die ständig wechseln kann?
Wofür erneut aus der Textdatei laden?

Ich hab dir bei Eine zufällige englische Vokabel anzeigen doch gezeigt wie man eine Vokabel aus den Klassen lädt. Die Txt-Datei brauchst du nach Programmstart nur ein einziges mal laden. Danach nie wieder. Das ist ja der Sinn der Sache.
  Mit Zitat antworten Zitat
KetchUp

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

AW: Elemente aus TStringList in Laufzeit entfernen

  Alt 17. Nov 2018, 16:37
Zitat:
Kann ich Vokabeln auch wieder aus der txt Datei laden, sodass man die ständig wechseln kann?
Wofür erneut aus der Textdatei laden?
Ich meinte weil Du die Vokabeln direkt im Quellcode stehen hast. Die müssen variabel sein.


PS: Ich hab gerade das Problem gefunden. Es lag tatsächlich am .Free nach finally. Jetzt funktioniert es scheinbar.
  Mit Zitat antworten Zitat
DieDolly

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

AW: Elemente aus TStringList in Laufzeit entfernen

  Alt 17. Nov 2018, 16:39
Zitat:
Die müssen variabel sein.
Du musst du ja auch selber reinladen. Das war nur ein Beispiel.
Du kannst 99% von meinem Code übernehmen. Du musst sie nur selber reinladen.

Ungefähr so

Delphi-Quellcode:
try
 Vocabulary:= TStringList.Create;
 Vocabulary.LoadFromFile('Vocabulary.txt');
 
 for i := 0 to Vocabulary.Count - 1 do
  begin
   Vocab := TVocab.Create;
   Vocab.SolvedCount := 0;
   Vocab.German := Vocabulary.Names[i];
   Vocab.English := Vocabulary.ValueFromIndex[i];
   VokabelListe.Add(Vocab);
  end;
finally
 Vocabulary.Free;
end;

Geändert von DieDolly (17. Nov 2018 um 16:57 Uhr)
  Mit Zitat antworten Zitat
KetchUp

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

AW: Elemente aus TStringList in Laufzeit entfernen

  Alt 17. Nov 2018, 16:48
Delphi-Quellcode:

finally
 Vocabulary.Free;
end;
Was hat denn das .Free am Ende für eine Bedeutung/Funktion?
  Mit Zitat antworten Zitat
DieDolly

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

AW: Elemente aus TStringList in Laufzeit entfernen

  Alt 17. Nov 2018, 16:49
Du gibst den reservierten Speicher der StringListe wieder frei.
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
989 Beiträge
 
Delphi 6 Professional
 
#8

AW: Elemente aus TStringList in Laufzeit entfernen

  Alt 17. Nov 2018, 18:49
Hmm..

Zitat:
Die müssen variabel sein.
Du musst du ja auch selber reinladen. Das war nur ein Beispiel.
Du kannst 99% von meinem Code übernehmen. Du musst sie nur selber reinladen.

Ungefähr so

Delphi-Quellcode:
try
 Vocabulary:= TStringList.Create;
 Vocabulary.LoadFromFile('Vocabulary.txt');
 
 for i := 0 to Vocabulary.Count - 1 do
  begin
   Vocab := TVocab.Create;
   Vocab.SolvedCount := 0;
   Vocab.German := Vocabulary.Names[i];
   Vocab.English := Vocabulary.ValueFromIndex[i];
   VokabelListe.Add(Vocab);
  end;
finally
 Vocabulary.Free;
end;
Umd das vielleicht noch zu verdeutlichen, schön in eine Ladeprocedure verpackt:

Delphi-Quellcode:
procedure LoadVocab(VokabelListe : TList<TVocab>);
var
  tmpVocabulary : TStringList;
  Vocab : TVocab;
begin
  try
   tmpVocabulary:= TStringList.Create;
   tmpVocabulary.LoadFromFile('Vocabulary.txt');
 
   for i := 0 to Vocabulary.Count - 1 do
    begin
     Vocab := TVocab.Create;
     Vocab.SolvedCount := 0;
     Vocab.German := tmpVocabulary.Names[i];
     Vocab.English := tmpVocabulary.ValueFromIndex[i];
     VokabelListe.Add(Vocab);
    end;
  finally
   tmpVocabulary.Free;
  end;
end;
(Ungetestet, nur so hingeschrieben )

@KetchUp

Oder wenn Du unbedingt mit der StringList weiter arbeiten möchtest, dann solltest Du dir erstmal über einen grundsätzlichen Ablauf klar sein..

z.B.:

FormCreate
-> Laden der Vokabelliste in die StringList

Im (wahrscheinlich) ButtonClick
-> Prüfen/Arbeiten MIT der Stringliste
-> Nicht wieder neu laden, wozu auch, ist ja bereits

FormClose
-> Mit .Free die Stringliste wieder freigeben (aufräumen!!)
  Mit Zitat antworten Zitat
KetchUp

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

AW: Elemente aus TStringList in Laufzeit entfernen

  Alt 18. Nov 2018, 07:56
Ich möchte es erstmal mit der TStringList Variante probieren. Das Programm muss auch noch ein paar andere Sachen können wie zum Beispiel die Lernrichtung (Deutsch>Englisch oder Englisch>Deutsch) ändern.
Deswegen sieht mein Ansatz jetzt so aus:

Delphi-Quellcode:
Begin
  If Vocabulary.Count > 0 Then

    Begin
      If GermanEnglish = True

      Then
        Begin
          Input:= E_UserGuess.Text;
          E_UserGuess.Text:= '';

          Answer:=AnsiCompareStr(Vocabulary.Names[RandomNumber], Input);

          If Answer=0
          Then
            Begin
              L_CorrectAnswer.Caption:='';
              Img_FeedBack.Picture.Bitmap.Assign(jpgCorrect);
              //jpgCorrect.free;
              Vocabulary.Delete(RandomNumber);
            End

          Else
            Begin
              L_CorrectAnswer.Caption:='Deine Antwort: '+(Input)+' '+'Richtige Antwort: '+(Vocabulary.ValueFromIndex[RandomNumber]);
              Img_FeedBack.Picture.Bitmap.Assign(jpgWrong);
              //jpgWrong.free;
            End;

            RepetitionCheck:=RandomNumber;
            While RepetitionCheck = RandomNumber Do RandomNumber:=random(Vocabulary.Count);

            try
              L_UnknownWord.Caption:= Vocabulary.ValueFromIndex[RandomNumber];
              L_RemainingWords.Caption:= 'Verbleibende Vokabeln: '+IntToStr(Vocabulary.Count);
              L_RemainingWords.Font.Name:='Helvetica LT Std';
              L_RemainingWords.Font.Size:= 16;
              L_RemainingWords.Font.Color:= RGB(170,220,70);
              finally
            end;
        end

      Else
        Begin
          Input:= E_UserGuess.Text;
          E_UserGuess.Text:= '';

          Answer:=AnsiCompareStr(Vocabulary.ValueFromIndex[RandomNumber], Input);

          If Answer=0
          Then
            Begin
              L_CorrectAnswer.Caption:='';
              Img_FeedBack.Picture.Bitmap.Assign(jpgCorrect);
              jpgCorrect.free;
              Vocabulary.Delete(RandomNumber);
            End

          Else
            Begin
              L_CorrectAnswer.Caption:='Deine Antwort: '+(Input)+' '+'Richtige Antwort: '+(Vocabulary.Names[RandomNumber]);
              Img_FeedBack.Picture.Bitmap.Assign(jpgWrong);
              jpgWrong.free;
            End;

            RepetitionCheck:=RandomNumber;
            While RepetitionCheck = RandomNumber Do RandomNumber:=random(Vocabulary.Count);

            try
              L_UnknownWord.Caption:= Vocabulary.Names[RandomNumber];
              L_RemainingWords.Caption:= 'Verbleibende Vokabeln: '+IntToStr(Vocabulary.Count);
              L_RemainingWords.Font.Name:='Helvetica LT Std';
              L_RemainingWords.Font.Size:= 16;
              L_RemainingWords.Font.Color:= RGB(170,220,70);
              finally
              //Vocabulary.Free;
            end;
        End;
    End

  Else
    Begin
      Form3 := TForm3.Create(self);
        try
          Form3.ShowModal;
        finally
          Form3.Free;
          Vocabulary.Free;
        end;
    End;
End;
Nachdem alle Vokabeln (in dem Fall) einmal richtig waren, soll ein neues Fenster geöffnet werden. Aber genau an der Stelle stürzt das Programm immer ab. Wo muss ich Vocabulary.Free; platzieren damit das funktioniert?
  Mit Zitat antworten Zitat
Antwort Antwort


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 07:24 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-2025 by Thomas Breitkreuz