| Autor |
Beitrag |
skall
      
Beiträge: 38
|
Verfasst: Mo 26.01.09 13:25
und nocheinmal tag
da ich wohl einfach zu wenig davon verstehe brauch ich mal wieder eure Hilfe :S
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:
| procedure DatenEinlesen (DatumWert:String; MittelWert:TStundenMittel; MaxWert:TDatenSatz); var buffer : String; Volt, NullWert, Minute, Stunden, i, h, m, e, VoltWert : Integer; TextDatei : TextFile; Liste : TStringList; Begin AssignFile(TextDatei, DatumWert + '.dat'); FileMode := fmOpenRead; Reset(TextDatei); h := 0; while not Eof(TextDatei) do Begin ReadLn(TextDatei, buffer); Begin Read(TextDatei, Volt); Read(TextDatei, NullWert); Read(TextDatei, Stunden); Read(TextDatei, Minute); Liste := TStringList.Create; Liste.LoadFromFile(DatumWert + '.dat'); For i := 0 to 12 do begin h := e + 6; If Liste[i][3] = IntToStr(h) then begin VoltWert := VoltWert + StrToInt(Liste[i][1]); ShowMessage(IntToStr(VoltWert)); end; end; Liste.Free; End; End; Closefile(TextDatei); End; |
Ihr habt mir dabei ja shcon viel geholfen, aber die Stringlist ist auhc neu für mich... Finde dazu nichts passendes im Internet...
Mein Problem:
Die If-Klausel findet den Wert h nicht... Somit führt er leide rja auch nicht den Then block aus...
Die Werte an der dritten Stelle der Stingsätze, die ich suche ist 7 welcher eigentlich soweit wie ich da durch blicke erkannt werden müsste...
Meine Frage:
Kann mir jemand dabei die Stringlist einwenig erklären und dann mir den Fehler beschreiben? Ausserdem würde ich gerne wissen wie Die Stringlist überhaupt arbeitet? Ist das zu behandeln wie ein zweidimensionales Array?
|
|
Blackheart666
      
Beiträge: 2195
XP
D3Prof, D6Pers.
|
Verfasst: Mo 26.01.09 14:06
_________________ Blackheart666
Der Irrsinn ist bei Einzelnen etwas Seltenes, - aber bei Gruppen, Parteien, Völkern, Zeiten die Regel. (Friedrich Nietzsche)
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 26.01.09 17:00
skall hat folgendes geschrieben : | 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:
| procedure DatenEinlesen (DatumWert:String; MittelWert:TStundenMittel; MaxWert:TDatenSatz); var buffer : String; Volt, NullWert, Minute, Stunden, i, h, m, e, VoltWert : Integer; TextDatei : TextFile; Liste : TStringList; Begin AssignFile(TextDatei, DatumWert + '.dat'); FileMode := fmOpenRead; Reset(TextDatei); h := 0; while not Eof(TextDatei) do Begin ReadLn(TextDatei, buffer); Begin Read(TextDatei, Volt); Read(TextDatei, NullWert); Read(TextDatei, Stunden); Read(TextDatei, Minute); Liste := TStringList.Create; Liste.LoadFromFile(DatumWert + '.dat'); For i := 0 to 12 do begin h := e + 6; | |
An der Stelle ist e gar nicht initialisiert, es sollte auch eine entsprechende Warnung vom Compiler kommen...
skall hat folgendes geschrieben : | Mein Problem:
Die If-Klausel findet den Wert h nicht... Somit führt er leide rja auch nicht den Then block aus...
Die Werte an der dritten Stelle der Stingsätze, die ich suche ist 7 welcher eigentlich soweit wie ich da durch blicke erkannt werden müsste... |
Du schaust nach dem Wert von h, und der ist e + 6, wobei e gar nicht definiert ist.
skall hat folgendes geschrieben : | | Ausserdem würde ich gerne wissen wie Die Stringlist überhaupt arbeitet? Ist das zu behandeln wie ein zweidimensionales Array? |
Jein, du hast eine Liste von Strings.
Liste[0], Liste[1] usw. sind die einzelnen Zeilen.
Wenn du einen String wie z.B. buffer hast, dann kannst du auf die einzelnen Zeichen wie auf ein Array zugreifen. buffer[1], buffer[2], ... sind die einzelnen Zeichen.
Jetzt kombiniere das. Liste[0] ist der erste String. Und jetzt willst du in diesem String auf das dritte Zeichen zugreifen. (Liste[0])[3] oder kurz Liste[0][3]. Das sieht dann aus wie ein zweidimensionales Array, wobei im äußeren Array die Strings und im inneren die Buchstaben der Strings stehen. Wenn du das so gemeint hast, dann: Ja.
|
|
MSCH
      
Beiträge: 1448
Erhaltene Danke: 3
W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
|
Verfasst: Mo 26.01.09 21:03
ich will ja nicht meckern, aber ich bekomme grad einen grauen star
Keinerlei Fehlerprüfung oder/und Try/Finally/Exceptions.
Ich will ja nicht als Oberlehrer auftreten, aber ist das nicht auch ein Thema?
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:
| procedure DatenEinlesen (DatumWert:String; MittelWert:TStundenMittel; MaxWert:TDatenSatz); var buffer : String; Volt, NullWert, Minute, Stunden, i, h, m, e, VoltWert : Integer; TextDatei : TextFile; Liste : TStringList; Begin AssignFile(TextDatei, DatumWert + '.dat'); FileMode := fmOpenRead; Reset(TextDatei); h := 0; while not Eof(TextDatei) do Begin ReadLn(TextDatei, buffer); Begin Read(TextDatei, Volt); Read(TextDatei, NullWert); Read(TextDatei, Stunden); Read(TextDatei, Minute); Liste := TStringList.Create; Liste.LoadFromFile(DatumWert + '.dat'); For i := 0 to 12 do begin h := e + 6; If Liste[i][3] = IntToStr(h) then begin VoltWert := VoltWert + StrToInt(Liste[i][1]); ShowMessage(IntToStr(VoltWert)); end; end; Liste.Free; End; End; Closefile(TextDatei); End; |
 Msch
_________________ ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
|
|
skall 
      
Beiträge: 38
|
Verfasst: Di 27.01.09 10:31
ähhh xD
allet kla... Ding war nur erstens war ja ncoh nicht fertig  obwohl ich darauf sicher nicht selber gekommen wäre  und zweitens schon unter Zeitdruck...
Aber danke für den Tipp... Werde mir das unter dem Aspekt nochmal angucken 
|
|
skall 
      
Beiträge: 38
|
Verfasst: Di 27.01.09 17:30
Kannst du mir vllt n Tipp geben wie ich das mache, dass er mir Bescheid sagt, wenn die Datei nciht vorhanden sit? 
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 27.01.09 18:19
Zunächst mal solltest du keine relativen Pfade verwenden, das ist eher Zufall, das das funktioniert.
www.delphi-library.d...ewtopic.php?p=499701
Und um festzustellen ob die Datei existiert:
Du willst doch auf englisch übersetzt sagen "if file xy exists then do something". Naja, der Parameter xy muss natürlich hinter den Befehl, ansonsten war es das schon... Delphi-Quelltext 1: 2:
| if FileExists(xy) then DoSomething; |
|
|
MSCH
      
Beiträge: 1448
Erhaltene Danke: 3
W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
|
Verfasst: Mi 28.01.09 16:28
Die erste Frage, die ich mir stellen würde, warum verwendest du eine nicht-typisierte Datei? Du musst dadurch das du eine Textdatei verwendest, eine Menge Fehlermöglichkeiten abfangen - was das ganze nur verkompliziert.
aber ok.
es reicht nicht zu prüfen, ob die Datei vorhanden ist, sondern auch ob man sie lesen sprich öffnen kann. Windows ab 2000 hat da nämlich eine ganze Menge Steine, die man in den Weg legen könnte - stichwort ACL.
also
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| if FileExists(Dateiname) then begin Reset(Filehandle); if IoResult=0 then begin end; FileClose(Filehandle); end; |
weiter; verwende - um kompatible zu sein, nicht den Typ "String". Der mag zwar ok sein, aber ab D2009 könnte das ein Unicode-String sein. Also expliziert AnsiString oder ShortString.
Wenn du Klassen instanziiert, immer in einem Try/Finally Block.
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| MyStringList:= TStringList.Create; try finally MyStringlist.Free; end; |
Bei der Konvertierungen von Strings in Zahlen empfehle ich dir die Funktion StrToIntDef(). Bei einer ungültigen
Übergabe wird der Default-Wert (ein Teil der Parameter der Funktion) zurückgegeben.
Beim Lesen einer Datei:
Delphi-Quelltext 1: 2: 3: 4:
| while not Eof(TextDatei) do Begin ReadLn(TextDatei, buffer); Read(TextDatei, Volt); ... |
prüfst du zwar ob nicht EOF(Filehandle) aber du liest mehrfach aus der Datei. Was passiert, wenn das Dateiende
bereits nach dem ersten Readln() erreicht ist?
Eine einfache - nicht die beste - Lösung könnte sein:
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| While not eof(Filehandle) do begin Readln(Filehandle,ShortStringVariable); if not EOF(FileHandle) then Read(FileHandle,Variable); end; |
Cheers
Msch
_________________ ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
|
|
|