Delphi-PRAXiS
Seite 2 von 2     12   

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 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 09:37 Uhr.
Seite 2 von 2     12   

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