![]() |
Bestimmte Zeile via TStringList löschen
Hallo Leute,
ich bin ein kompletter Anfänger und wollte mir ein Programm zum Abfragen von Vokabeln abfragen. Das klappt alles auch schon soweit, nur möchte ich, dass eine Vokabel aus einer .txt-Datei gelöscht wird, wenn sie richtig beantwortet wurde. Ich sitze heute schon den ganzen Tag dran und habe gegooglet, aber mit List.Delete(1) klappt das irgendwie nicht.
Delphi-Quellcode:
Jedoch bleibt die Zeile immer erhalten und wird einfach nicht gelöscht.List:=TStringList.create; List.LoadFromFile('C:\Users\Florian\Desktop\Delphidateien\Vokabeln-Auslesen\unsicherevoklat.txt'); for i3:=0 to num-1 do begin ReadLn(td3,s2); ReadLn(td4,s3); abfrage2:=inputbox('Wiederholung',s2,''); if (uppercase(abfrage2)=uppercase(s3)) then begin showmessage('Richtig!'); list.Delete(i3); end; Danke schon mal für eure Hilfe. Liebe Grüße, Flo ;) |
AW: Bestimmte Zeile via TStringList löschen
Schon mal überlegt, wo die Stelle zum Abspeichern ist ? :mrgreen:
|
AW: Bestimmte Zeile via TStringList löschen
Liste der Anhänge anzeigen (Anzahl: 1)
Bei folgendem Quelltext kommt folgende Meldung:
Delphi-Quellcode:
Jedoch ist die Datei nicht mehr geöffnet.
List:=TStringList.create;
List.LoadFromFile('C:\Users\Florian\Desktop\Delphidateien\Vokabeln-Auslesen\unsicherevoklat.txt'); for i3:=0 to num-1 do begin ReadLn(td3,s2); ReadLn(td4,s3); abfrage2:=inputbox('Wiederholung',s2,''); if (uppercase(abfrage2)=uppercase(s3)) then begin showmessage('Richtig!'); list.Delete(i3); list.savetofile('C:\Users\Florian\Desktop\Delphidateien\Vokabeln-Auslesen\unsicherevoklat.txt'); end; |
AW: Bestimmte Zeile via TStringList löschen
Aha, dank Nachfrage kommt die betreffende fehlerhafte Zeile. Wird wohl wieder endlos-Thread. Welches Programm könnte denn wohl die Datei im Zgriff haben ? Delphi selber vielleicht ?
|
AW: Bestimmte Zeile via TStringList löschen
Und wie löse ich das Problem dann?
Mit list.free? Grüße, Flo |
AW: Bestimmte Zeile via TStringList löschen
Also wenn man ein Objekt nicht mehr braucht, dann sollte man es schon freigeben.
|
AW: Bestimmte Zeile via TStringList löschen
Liste der Anhänge anzeigen (Anzahl: 1)
Delphi-Quellcode:
Liefert folgende Fehlermeldung:
List:=TStringList.create;
List.LoadFromFile('C:\Users\Florian\Desktop\Delphidateien\Vokabeln-Auslesen\unsicherevoklat.txt'); for i3:=0 to num-1 do begin ReadLn(td3,s2); ReadLn(td4,s3); abfrage2:=inputbox('Wiederholung',s2,''); if (uppercase(abfrage2)=uppercase(s3)) then begin showmessage('Richtig!'); list.Delete(i3); list.free; list.savetofile('C:\Users\Florian\Desktop\Delphidateien\Vokabeln-Auslesen\unsicherevoklat.txt'); end; |
AW: Bestimmte Zeile via TStringList löschen
Bitte nur mal für zwei Sekunden nachdenken. Du gibst ein Objekt frei und dann willst du es noch nutzen. Kann das funktionieren?
|
AW: Bestimmte Zeile via TStringList löschen
Liste der Anhänge anzeigen (Anzahl: 1)
Klingt logisch :P
Aber wie soll ich etwas in die Textdatei speichern, ohne es vorher freigegeben zu haben? Dann kommt folgende Fehlermeldung :P |
AW: Bestimmte Zeile via TStringList löschen
Was ist denn td3 und td4? Zeig doch mal den ganzen Code den du da hast. Mit dem kleinen Ausschnitt kann man nicht viel anfangen.
|
AW: Bestimmte Zeile via TStringList löschen
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var td1,td2,td3,td4,td5:textfile; s,s2,s3,fr,abfrage,abfrage2,belub,belub2:string; i,i2,i3,i4,n,n2,azf,azr,num,g1:integer;pro,pro2:real;list,list2:Tstringlist; begin num:=0; n:=0; azr:=0; azf:=0; AssignFile(td1,'C:\Users\Florian\Desktop\Delphidateien\Vokabeln-Auslesen\lateinvok.txt'); Reset(td1); AssignFile(td2,'C:\Users\Florian\Desktop\Delphidateien\Vokabeln-Auslesen\deutschvok.txt'); reset(td2); AssignFile(td3,'C:\Users\Florian\Desktop\Delphidateien\Vokabeln-Auslesen\unsicherevoklat.txt'); reset(td3); AssignFile(td4,'C:\Users\Florian\Desktop\Delphidateien\Vokabeln-Auslesen\unsicherevokdeutsch.txt'); reset(td4); while not eof(td1) do begin // Zeilenzählen ReadLn(td1); n:=n+1; end; reset(td1); reset(td2); randomize; //Showmessage(IntToStr(n)); //Zeilenausgabe n2:=StrToInt(inputbox('Anzahl','Anzahl der Durchläufe?','10')); for i:=1 to n2 do begin for i2:=0 to (random(n-1)+1) do begin ReadLn(td1,s); ReadLn(td2,fr); randomize; end; Reset(td1); Reset(td2); abfrage:=inputbox('Vokabelabfrage',s,''); //Abfrage if (uppercase(fr)=uppercase(abfrage)) then begin //Überprüfung showmessage('Richtig!'); inc(azr); end else if (uppercase(fr)<>uppercase(abfrage)) then begin inc(azf); showmessage('Falsch. Es wäre "'+ fr + '" gewesen und nicht '+ abfrage + '.'); append(td3); writeln(td3,s); CloseFile(td3); append(td4); writeln(td4,fr); CloseFile(td4); end; end; //showmessage(IntToStr(random(n-1)+1)); // Letzten Zufallswert ausgeben //Showmessage(s); //Showmessage(fr); belub:='Richtig: '+IntToStr(azr) +chr(13)+'Falsch: '+ IntToStr(azf)+chr(13); belub2:='Endübersicht'; pro:=n2/100; pro2:=azr/pro; Showmessage(belub+'Das sind also '+(FloatToStr(pro2))+'% richtig.'); ShowMessage('Jetzt die Falschen wiederholen!'); reset(td3); while not eof(td3) do begin // Zeilenzählen ReadLn(td3); num:=num+1; end; reset(td3); reset(td4); List:=TStringList.create; List.LoadFromFile('C:\Users\Florian\Desktop\Delphidateien\Vokabeln-Auslesen\unsicherevoklat.txt'); List2:=TStringList.create; List2.LoadFromFile('C:\Users\Florian\Desktop\Delphidateien\Vokabeln-Auslesen\unsicherevokdeutsch.txt'); for i3:=0 to num-1 do begin ReadLn(td3,s2); ReadLn(td4,s3); abfrage2:=inputbox('Wiederholung',s2,''); if (uppercase(abfrage2)=uppercase(s3)) then begin showmessage('Richtig!'); list.delete(1); list.savetofile('C:\Users\Florian\Desktop\Delphidateien\Vokabeln-Auslesen\unsicherevoklat.txt'); list.free; end else if (uppercase(abfrage2)<>uppercase(s3)) then begin showmessage('Falsch!'); end; end; end; end. |
AW: Bestimmte Zeile via TStringList löschen
Könnt ihr nicht einfach die Lösung sagen? Versteh nicht was das bringen soll, helfen tut ihm das sicher nicht!
Natürlich nicht mit List.Free, dadurch löscht du komplett die Liste! Dein Problem ist eigentlich ganz einfach, so wie du es jetzt machst verschiebt sich der Index dadurch dass du eine Zeile löscht und daher erscheint diese Fehlermeldung! Lösung ist, du gehst die Liste von Oben nach Unten durch und löscht die Zeile, bzw. du suchst die Zeile und löscht sie (ohne Schleife) Schleife:
Delphi-Quellcode:
oder (in dem Fall besser!) ohne Schleife:
List:=TStringList.create;
List.LoadFromFile('C:\Users\Florian\Desktop\Delphidateien\Vokabeln-Auslesen\unsicherevoklat.txt'); for i3:= num-1 DOWNto 0 do begin ReadLn(td3,s2); ReadLn(td4,s3); abfrage2:=inputbox('Wiederholung',s2,''); if (uppercase(abfrage2)=uppercase(s3)) then begin showmessage('Richtig!'); list.Delete(i3); list.savetofile('C:\Users\Florian\Desktop\Delphidateien\Vokabeln-Auslesen\unsicherevoklat.txt'); list.Free; //Hier end;
Delphi-Quellcode:
lg
List := TstringList.create();
List.LoadFromFile(FileName); .... if ( Richtig ) then begin List.Delete( List.IndexOF(Vokabel) ); List.SaveToFile(FileName); //Hier List.Free; end; |
AW: Bestimmte Zeile via TStringList löschen
Liste der Anhänge anzeigen (Anzahl: 1)
Vielen Dank schonmal, nur leider kommt immer noch eine Fehlermeldung :oops:
Delphi-Quellcode:
for i3:=num downto 0 do begin
ReadLn(td3,s2); ReadLn(td4,s3); abfrage2:=inputbox('Wiederholung',s2,''); if (uppercase(abfrage2)=uppercase(s3)) then begin showmessage('Richtig!'); List.Delete( List.IndexOF(s3) ); List.SaveToFile('C:\Users\Florian\Desktop\Delphidateien\Vokabeln-Auslesen\unsicherevoklat.txt'); list.free; end else if (uppercase(abfrage2)<>uppercase(s3)) then begin showmessage('Falsch!'); end; |
AW: Bestimmte Zeile via TStringList löschen
@ IceBub -Schau mal das Posting #3 dieses Threads an und geh mal in dich ;-)
@Flopa - du selbst öffnest die Datei per Reset nochmal...
Delphi-Quellcode:
und das gleich zweimal nacheinander und ein Closefile folgt nicht... Ich würde dir empfehlen Reset, Closefile und Konsorten bei so was unter den Tisch fallen lassen und alles mit TStringList umzusetzen.
pro2:=azr/pro;
Showmessage(belub+'Das sind also '+(FloatToStr(pro2))+'% richtig.'); ShowMessage('Jetzt die Falschen wiederholen!'); reset(td3); //************* hier while not eof(td3) do begin // Zeilenzählen ReadLn(td3); num:=num+1; end; reset(td3); //************* und hier nochmal reset(td4); List:=TStringList.create; List.LoadFromFile('C:\Users\Florian\Desktop\Delphidateien\Vokabeln-Auslesen\unsicherevoklat.txt'); List2:=TStringList.create; List2.LoadFromFile('C:\Users\Florian\Desktop\Delphidateien\Vokabeln-Auslesen\unsicherevokdeutsch.txt'); for i3:=0 to num-1 do begin ReadLn(td3,s2); ReadLn(td4,s3); abfrage2:=inputbox('Wiederholung',s2,''); if (uppercase(abfrage2)=uppercase(s3)) then begin showmessage('Richtig!'); list.delete(1); list.savetofile('C:\Users\Florian\Desktop\Delphidateien\Vokabeln-Auslesen\unsicherevoklat.txt'); list.free; end else if (uppercase(abfrage2)<>uppercase(s3)) then begin showmessage('Falsch!'); end; end; end; Grüße |
AW: Bestimmte Zeile via TStringList löschen
Zitat:
GRüße |
AW: Bestimmte Zeile via TStringList löschen
Es wird -1 zurückgeliefert. Aber warum findet er s3 nicht in der Datei, die Vokabel steht doch schließlich in ihr :o
|
AW: Bestimmte Zeile via TStringList löschen
Sorry, aber der Code ist nicht wartbar. Keine gescheite Formatierung des Quellcodes, nichts sagende Variablennamen und alles in einer Prozedur drin. Räume den Code erst mal etwas auf, damit man da auch durchblickt.
|
AW: Bestimmte Zeile via TStringList löschen
hm.. du meinst die steht drin, so wie beim anderen Problem oben, wo niemand anders die Datei offen hat? ;-)
Debug mal zu der Stelle an der der Fehler auftritt. SChau dann nach was in List.Text drin steht. Aber du kannst von einem ausgehen: Wenn da -1 zurück kommt, dann steht der String nicht in der Liste.... |
AW: Bestimmte Zeile via TStringList löschen
Nach langem Rumprobieren klappts es nun.
Sorry, aber ich bin echt neu im Programmieren, nicht kreativ mit Variablennamen und wie man übersichtlich formatiert ist mir auch noch nicht recht klar :P Aber trotzdem vielen Danke euch allen Lg, Flo |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:02 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