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 4 von 11   « Erste     234 56     Letzte »    
HolgerX

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

AW: Elemente aus TStringList in Laufzeit entfernen

  Alt 17. Nov 2018, 19: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
 
#32

AW: Elemente aus TStringList in Laufzeit entfernen

  Alt 18. Nov 2018, 08: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
Delphi.Narium

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

AW: Elemente aus TStringList in Laufzeit entfernen

  Alt 18. Nov 2018, 10:53
Wo muss ich Vocabulary.Free; platzieren damit das funktioniert?
Nirgendwo (jedenfalls nicht in dieser Routine).

Wo erstellst Du die Liste ubd wo lädst Du die Liste?

Im FormCreate?
Dann gehört das Vocabulary.Free ins FormDestroy.

Sinnvollerweise solltest Du die Liste beim Programmstart erstellen (unabhängig davon ob Du sie dort sofort lädst oder erst später).

Freigeben solltest Du sie dann beim Programmende.

Wenn Du sie unbedingt leeren möchtest, so kannst Du an der Stelle, an der momentan das Vocabulary.Free steht, ein Vocabulary.Clear aufrufen. Dann wird die Liste geleert, aber nicht zerstört.
  Mit Zitat antworten Zitat
KetchUp

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

AW: Elemente aus TStringList in Laufzeit entfernen

  Alt 18. Nov 2018, 11:29

Wo erstellst Du die Liste ubd wo lädst Du die Liste?

Im FormCreate?
Dann gehört das Vocabulary.Free ins FormDestroy.
Hab ich jetzt auch so gemacht.

Delphi-Quellcode:
 If Vocabulary.Count > 0 Then

//mach was

  Else
    Begin
      FormDestroy(Vocabulary);
    End;
Sobald die Bedingung nicht mehr erfüllt ist stürzt er aber ab. Er kommt garnicht dazu die Prozedur FormDestroy aufzurufen.
  Mit Zitat antworten Zitat
DieDolly

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

AW: Elemente aus TStringList in Laufzeit entfernen

  Alt 18. Nov 2018, 11:59
Zitat:
Das Programm muss auch noch ein paar andere Sachen können wie zum Beispiel die Lernrichtung (Deutsch>Englisch oder Englisch>Deutsch) ändern.
Ein Grund mehr das mit Klassen zu machen

Und wenn du es schon komplizierter machst als es sein muss und ehrlich gesagt auch irgendwie falsch, dann entferne wenigstens diesen einen Fehler hier.
Alle anderen kannst du drin lassen denn sonst bleibt kein Code mehr übrig.
If GermanEnglish = True
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#36

AW: Elemente aus TStringList in Laufzeit entfernen

  Alt 18. Nov 2018, 12:19
Zitat:
Das Programm muss auch noch ein paar andere Sachen können wie zum Beispiel die Lernrichtung (Deutsch>Englisch oder Englisch>Deutsch) ändern.
Ein Grund mehr das mit Klassen zu machen

Und wenn du es schon komplizierter machst als es sein muss und ehrlich gesagt auch irgendwie falsch, dann entferne wenigstens diesen einen Fehler hier.
Alle anderen kannst du drin lassen denn sonst bleibt kein Code mehr übrig.
If GermanEnglish = True
Es ist kein Fehler nur eine Unart!

Das reicht auf True muss man nicht prüfen..
If GermanEnglish then

oder
If not GermanEnglish then

anstelle von
If GermanEnglish = false then

gruss

Geändert von EWeiss (18. Nov 2018 um 12:21 Uhr)
  Mit Zitat antworten Zitat
DieDolly

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

AW: Elemente aus TStringList in Laufzeit entfernen

  Alt 18. Nov 2018, 12:24
Zitat:
Es ist kein Fehler nur eine Unart!
So hätte ich es besser auch genannt.
  Mit Zitat antworten Zitat
Delphi.Narium

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

AW: Elemente aus TStringList in Laufzeit entfernen

  Alt 18. Nov 2018, 12:30

Wo erstellst Du die Liste ubd wo lädst Du die Liste?

Im FormCreate?
Dann gehört das Vocabulary.Free ins FormDestroy.
Hab ich jetzt auch so gemacht.

Delphi-Quellcode:
 If Vocabulary.Count > 0 Then

//mach was

  Else
    Begin
      FormDestroy(Vocabulary);
    End;
Sobald die Bedingung nicht mehr erfüllt ist stürzt er aber ab. Er kommt garnicht dazu die Prozedur FormDestroy aufzurufen.
Du darfst die Liste nicht in der Routine freigeben, sondern nur und ausschließlich nur in der Methode FormDestroy. Und die Methode FormDestroy darfst Du nicht selbst aufrufen, das geschieht automatisch beim Programmende, genauso wie beim Programmstart FormCreate automatisch aufgerufen wird.

Die Liste in Deiner oben geposteten Routine freizugeben ist schlicht und einfach (bei der jetztigen Form der Implementierung) unsinnig und absolut kontraproduktiv.

Lass es doch bitte einfach endlich weg.

Bitte poste mal den vollständigen Quelltext, den Du bisher geschrieben hast. Mit den Fragmenten ist es nur ein Rumgestocher, wo welcher Fehler herkommen könnte und wie man ihn beheben könnte, wenn man die Abhängigkeiten innerhalb des gesamten Programmes nicht kennt.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#39

AW: Elemente aus TStringList in Laufzeit entfernen

  Alt 18. Nov 2018, 12:33
Zitat:
Du darfst die Liste nicht in der Routine freigeben
Eventuell fehlt ihm etwas Mayo <> Ketchup
sorry das musste sein.

gruss
  Mit Zitat antworten Zitat
DieDolly

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

AW: Elemente aus TStringList in Laufzeit entfernen

  Alt 18. Nov 2018, 12:38
Oder der Willen, es endlich mit den Klassen zu machen. Dann braucht er die SttringListe, seinen Gegner, nur noch einmalig beim Programmstart.
Ich habe vor 10 Jahren auch mal einen Vokabeltrainer gemacht und der baute auch auf StringListen auf, weil ich damals nix anderes kannte. Sei doch froh, dass dir hier direkt ein sehr viel besserer Weg vorgeschlagen wird. Der ist nicht nur für dich besser, sondern auch für deine Zensur.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 11   « Erste     234 56     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 06:04 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