| Autor |
Beitrag |
Waldkauz
      
Beiträge: 102
|
Verfasst: Mo 30.03.09 19:59
Hallo
Ich muss mich leider schon wieder wegen einer Frage melden...
Okay, also wie bereits erklärt, man klickt auf den Button3, und wenn sich das eingegebene Wort in dem jeweiligen Textfile befindet, bekommt man, je nach verbliebener Zeit gewisse Punkte (die Punkteanzahl wird in ein jeweils separates Editfeld ausgegeben).
Bei den ersten drei Funktionen klappt das einwandfrei, nur beim letzten (beim "Namen.txt") funktioniert etwas nicht.
Ich weiß aber nicht wo der Fehler liegt. Ist das textfile mit seinen 146 KB, bzw. den 8902 Wörtern zu groß?
Das textfile ist selbtverständlich im gleichen Ordner wie das Programm, und die Wörter sind jeweils eines pro zeile geordnet.
ich entschuldige mich schon im Vorfeld für den chaotischen und unprofessionellen Quelltext...
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71:
| procedure TForm1.Button3Click(Sender: TObject); var Stadt,Land,Fluss : textfile; Namen : textfile; Suchen : String; Search : String; S : Integer; I: Integer; Z:Integer; begin Assignfile(Stadt, 'Stadt.txt'); Reset(Stadt); for S := 0 to 233 do begin ReadLn(Stadt,Suchen); if (Edit1.Text=Suchen) and (StrToInt(Label9.Caption)>=100) then Edit8.Text:='30'; if (Edit1.Text=Suchen) and (StrToInt(Label9.Caption)>=60) and (StrToInt(Label9.Caption)<100) then Edit8.Text:='20'; if (Edit1.Text=Suchen) and (StrToInt(Label9.Caption)>=0) and (StrToInt(Label9.Caption)<60) then Edit8.Text:='10'; if Edit1.Text='' then Edit8.Text:=''; end; Assignfile(Land,'Land.txt'); Reset(Land); for I := 0 to 241 do begin ReadLn(Land,Search); if (Edit2.Text=Search) and (StrToInt(Label9.Caption)>=100) then Edit9.Text:='30'; if (Edit2.Text=Search) and (StrToInt(Label9.Caption)>=60) and (StrToInt(Label9.Caption)<100) then Edit9.Text:='20'; if (Edit2.Text=Search) and (StrToInt(Label9.Caption)>=0) and (StrToInt(Label9.Caption)<60) then Edit9.Text:='10'; if Edit2.Text='' then Edit9.Text:=''; end; Assignfile(Fluss,'Fluss.txt'); Reset(Fluss); for I := 0 to 887 do begin ReadLn(Fluss,Search); if (Edit3.Text=Search) and (StrToInt(Label9.Caption)>=100) then Edit10.Text:='30'; if (Edit3.Text=Search) and (StrToInt(Label9.Caption)>=60) and (StrToInt(Label9.Caption)<100) then Edit10.Text:='20'; if (Edit3.Text=Search) and (StrToInt(Label9.Caption)>=0) and (StrToInt(Label9.Caption)<60) then Edit10.Text:='10'; if Edit3.Text='' then Edit10.Text:=''; end; Assignfile(Namen,'Namen.txt'); Reset(Namen); for Z := 0 to 8902 do begin ReadLn(Namen,Search); if (Edit4.Text=Search) and (StrToInt(Label9.Caption)>=100) then Edit11.Text:='30'; if (Edit4.Text=Search) and (StrToInt(Label9.Caption)>=60) and (StrToInt(Label9.Caption)<100) then Edit11.Text:='20'; if (Edit4.Text=Search) and (StrToInt(Label9.Caption)>=0) and (StrToInt(Label9.Caption)<60) then Edit11.Text:='10'; if Edit4.Text='' then Edit11.Text:=''; end;
end; |
Moderiert von Narses: Titel geändert.
|
|
JayEff
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Mo 30.03.09 20:07
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
Horst_H
      
Beiträge: 1654
Erhaltene Danke: 244
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: Mo 30.03.09 20:11
Hallo,
Du nutzt ein umständliches Verfahren, Du könntest zu Beginn des Programmes jeweils eine Stringliste laden, aber gut.
Kann es sein das Du Deine Textdateien erzeugst, öffnest und liest aber nicht mehr schliesst ( z.B.: Closefile(Stadt) ) .
Probier das mal. Man kann vielleicht nur begrenzt viele Dateien öffnen.
Gruß Horst
|
|
JayEff
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Mo 30.03.09 20:24
Horst_H hat folgendes geschrieben : | | Du nutzt ein umständliches Verfahren, Du könntest zu Beginn des Programmes jeweils eine Stringliste laden, aber gut. |
Und die TStringList wäre sogar schneller, getestet hiermit:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28:
| var t:textfile; sl: TStringList; ticks, ende : Cardinal; buff : String; i : Integer; begin sl := TStringList.Create; ticks := GetTickCount; sl.LoadFromFile('D:\testdb.txt'); for i := 0 to sl.Count - 1 do if sl[i] = 'asd' then showmessage('omg'); sl.free; ende := GetTickCount; Form1.Caption := Format('%d', [ende - ticks]);
ticks := GetTickCount; AssignFile(t, 'D:\testdb.txt'); Reset(t); while not EOF(t) do begin ReadLn(t, buff); if buff = 'asd' then showmessage('omg'); end; ende := GetTickCount; Form1.Caption := Format('StringList: %s ms, textfile: %d ms', [Form1.Caption, ende-ticks]); |
StringList: 16 ms, textfile: 32 ms. Klar, dass die Abfragen niemals true waren, das war natürlich beabsichtigt, wollte nur vergleichbaren code haben der auch wirklich nicht wegoptimiert wird.
Edit: Mein textfile war 1,3 MB groß und hatte verdammt viele Zeilen
Horst_H hat folgendes geschrieben : | | Kann es sein das Du Deine Textdateien erzeugst, öffnest und liest aber nicht mehr schliesst |
Richtig, das fehlt auch noch.
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
Waldkauz 
      
Beiträge: 102
|
Verfasst: Mo 30.03.09 20:46
Danke zunächst mal für eure Hilfe.
Ich habe es jetzt mit Closefile probiert.
Also es sieht jetzt so aus:
Alle Funktionien gehen, bis auf die mit Namen.
Bei der Namensfunktion schreibt es, auch bei richtiger Eingabe, keine Punkte ins Punktefeld, also muss irgendwo in dieser Funktion das Problem liegen
Hat es vielleicht was mit der Codierung des Textfiles zu tun?
Weil, wenn ich mich nicht irre, waren in dem Textfile auch Namen mit Sonderzeichen.
|
|
JayEff
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Mo 30.03.09 20:57
Waldkauz hat folgendes geschrieben : | | Weil, wenn ich mich nicht irre, waren in dem Textfile auch Namen mit Sonderzeichen. |
Solange es keine Unicode Zeichen sind, müsste das trotzdem gehen, an sonsten bin ich mir nicht sicher. Trotzdem müssten die Namen erkennbar sein. Klatsch mal eine Listbox auf dein Programm und füge in deine Schleife ListBox1.Add(Suchen);. Das macht die Schleife zwar verdammt langsam, aber wenn sie dann durchgelaufen ist, siehst du, was delphi sieht. Vielleicht wär ein Memo mit Memo1.Lines.Add besser, dann könntest du auch (durch markieren) erkennen, ob am ende der Zeilen irgendwelche leerzeichen stehen oder ähnliches. Alternativ poste mal die textdatei.
Und korrigiere das mit den relativen Pfaden!
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
Waldkauz 
      
Beiträge: 102
|
Verfasst: Mo 30.03.09 21:06
Problem gelöst - es waren die Unicode-Zeichen!
Vielen Dank für eure Hilfe!
|
|
JayEff
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Mo 30.03.09 21:08
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
Waldkauz 
      
Beiträge: 102
|
Verfasst: Mo 30.03.09 21:10
|
|
|