AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Bestimmte Zeile via TStringList löschen

Ein Thema von Flopa · begonnen am 5. Jan 2012 · letzter Beitrag vom 5. Jan 2012
Antwort Antwort
Seite 2 von 2     12
Flopa

Registriert seit: 5. Jan 2012
9 Beiträge
 
#11

AW: Bestimmte Zeile via TStringList löschen

  Alt 5. Jan 2012, 21:43
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.
  Mit Zitat antworten Zitat
IceBube

Registriert seit: 9. Jul 2008
164 Beiträge
 
#12

AW: Bestimmte Zeile via TStringList löschen

  Alt 5. Jan 2012, 21:49
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
  Mit Zitat antworten Zitat
Flopa

Registriert seit: 5. Jan 2012
9 Beiträge
 
#13

AW: Bestimmte Zeile via TStringList löschen

  Alt 5. Jan 2012, 21:57
Vielen Dank schonmal, nur leider kommt immer noch eine Fehlermeldung

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;
Miniaturansicht angehängter Grafiken
untitled4.png  
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.323 Beiträge
 
Delphi 10.3 Rio
 
#14

AW: Bestimmte Zeile via TStringList löschen

  Alt 5. Jan 2012, 21:58
@ 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

Geändert von Lemmy ( 5. Jan 2012 um 22:00 Uhr)
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.323 Beiträge
 
Delphi 10.3 Rio
 
#15

AW: Bestimmte Zeile via TStringList löschen

  Alt 5. Jan 2012, 21:59
Vielen Dank schonmal, nur leider kommt immer noch eine Fehlermeldung

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
  Mit Zitat antworten Zitat
Flopa

Registriert seit: 5. Jan 2012
9 Beiträge
 
#16

AW: Bestimmte Zeile via TStringList löschen

  Alt 5. Jan 2012, 22:05
Es wird -1 zurückgeliefert. Aber warum findet er s3 nicht in der Datei, die Vokabel steht doch schließlich in ihr
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie
(Moderator)

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#17

AW: Bestimmte Zeile via TStringList löschen

  Alt 5. Jan 2012, 22:08
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.323 Beiträge
 
Delphi 10.3 Rio
 
#18

AW: Bestimmte Zeile via TStringList löschen

  Alt 5. Jan 2012, 22:10
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....
  Mit Zitat antworten Zitat
Flopa

Registriert seit: 5. Jan 2012
9 Beiträge
 
#19

AW: Bestimmte Zeile via TStringList löschen

  Alt 5. Jan 2012, 22:21
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

Aber trotzdem vielen Danke euch allen

Lg,

Flo
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 09:21 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf