Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Bestimmte Zeile via TStringList löschen (https://www.delphipraxis.net/165561-bestimmte-zeile-via-tstringlist-loeschen.html)

Flopa 5. Jan 2012 19:32

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:

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;
Jedoch bleibt die Zeile immer erhalten und wird einfach nicht gelöscht.
Danke schon mal für eure Hilfe.
Liebe Grüße,

Flo ;)

Hansa 5. Jan 2012 20:16

AW: Bestimmte Zeile via TStringList löschen
 
Schon mal überlegt, wo die Stelle zum Abspeichern ist ? :mrgreen:

Flopa 5. Jan 2012 20:20

AW: Bestimmte Zeile via TStringList löschen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Bei folgendem Quelltext kommt folgende Meldung:

Delphi-Quellcode:
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;
Jedoch ist die Datei nicht mehr geöffnet.

Hansa 5. Jan 2012 20:26

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 ?

Flopa 5. Jan 2012 20:27

AW: Bestimmte Zeile via TStringList löschen
 
Und wie löse ich das Problem dann?

Mit list.free?

Grüße,

Flo

Luckie 5. Jan 2012 20:31

AW: Bestimmte Zeile via TStringList löschen
 
Also wenn man ein Objekt nicht mehr braucht, dann sollte man es schon freigeben.

Flopa 5. Jan 2012 20:33

AW: Bestimmte Zeile via TStringList löschen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Delphi-Quellcode:
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;
Liefert folgende Fehlermeldung:

Luckie 5. Jan 2012 20:35

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?

Flopa 5. Jan 2012 20:38

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

Luckie 5. Jan 2012 20:41

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.

Flopa 5. Jan 2012 20:43

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.

IceBube 5. Jan 2012 20:49

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:
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;
oder (in dem Fall besser!) ohne Schleife:

Delphi-Quellcode:
List := TstringList.create();
List.LoadFromFile(FileName);

....

if ( Richtig ) then
begin
 List.Delete( List.IndexOF(Vokabel) );
 List.SaveToFile(FileName);
 
 //Hier
 List.Free;

end;
lg

Flopa 5. Jan 2012 20:57

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;

Lemmy 5. Jan 2012 20:58

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

Grüße

Lemmy 5. Jan 2012 20:59

AW: Bestimmte Zeile via TStringList löschen
 
Zitat:

Zitat von Flopa (Beitrag 1144537)
Vielen Dank schonmal, nur leider kommt immer noch eine Fehlermeldung :oops:

Delphi-Quellcode:
   
       List.Delete( List.IndexOF(s3) );

SChau mal in der Hilfe nach was bei TStringList.IndexOf zurückgeliefert wird, wenn der String nicht in der Liste gefunden werden kann...

GRüße

Flopa 5. Jan 2012 21:05

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

Luckie 5. Jan 2012 21:08

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.

Lemmy 5. Jan 2012 21:10

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

Flopa 5. Jan 2012 21:21

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 20:35 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