![]() |
Fehler beim Speichern???
Beim einlesen des Stringrids ließt er nur die erste Zeile ein und macht dann nicht weiter.
Delphi-Quellcode:
v:=0;
AssignFile(datei,z +'.kt'); Reset(datei); m:=0; while not eof(datei) do begin m:=m+1; Read(datei,eintrag); with eintrag do begin stringGrid1.Cells[0,m]:= datum; stringGrid1.Cells[1,m]:=zahl; StringGrid1.Cells[2,m]:=zeit; Label8.Caption:= inttostr(m); end; end; closeFile(datei); v:= ((strtoint(Label8.Caption))+1); stringgrid1.Cells[0,v]:= Label7.Caption; stringGrid1.Cells[1,v]:=label2.Caption; StringGrid1.Cells[2,v]:=zeit.Caption; end; end; |
Re: Fehler beim Speichern???
Weil du die Datei nach dem ersten Record schließt :mrgreen:
|
Re: Fehler beim Speichern???
-Gehts jetzt hier ums Speichern oder ums Lesen?
-Was ist m, was ist v? -I/O Operationen setzt man in try..except + try..finally Teile. -Gib den fucking Labels einen anständigen Bezeichner :/ -Je nachdem, was v ist (typisiert oder text), verhält sich read anders. |
Re: Fehler beim Speichern???
Und eine sinnvolle Einrückung erleichtert die Fehlersuche auch ungemein.
|
Re: Fehler beim Speichern???
Zitat:
|
Re: Fehler beim Speichern???
es geht ums lesen. der soll die vorhanden daten in der datei ins stringgrid schreiben und die neuen werte in den labels auch ins stringgrid schreiben, aber hinten dran.
v und m sind normale integer variablen |
Re: Fehler beim Speichern???
Zitat:
Die Einrückung und die [zu] vielen end;s haben mich verwirrt. @DeddyH: So ist es :mrgreen: |
Re: Fehler beim Speichern???
Delphi-Quellcode:
Ansonsten sieht für mich die Schleife o.k. aus.
v:=0;
AssignFile(datei,z +'.kt'); Reset(datei); m:=0; while not eof(datei) do begin m:=m+1; Read(datei,eintrag); with eintrag do begin stringGrid1.Cells[0,m]:= datum; stringGrid1.Cells[1,m]:=zahl; StringGrid1.Cells[2,m]:=zeit; Label8.Caption:= inttostr(m); end; end; closeFile(datei); v:= ((strtoint(Label8.Caption))+1); stringgrid1.Cells[0,v]:= Label7.Caption; stringGrid1.Cells[1,v]:=label2.Caption; StringGrid1.Cells[2,v]:=zeit.Caption; //end; wozu diese ends gehören kann man hier nicht erkennen //end; Bist Du sicher das in der Datei mehr als 1 Datensatz ist? Bist Du Deinen Code mal mit F7 oder F8 durchgegangen und hast Dir die Variablen angeschaut? Grüße Klaus |
Re: Fehler beim Speichern???
Zitat:
Von welchem Type ist Eintrag? Eventuell hilft ja Reset(datei,SizeOf(Eintrag)), damit das Programm weiß, wieviel es bei einem Read lesen soll. Ohne Größenangabe werden 128 Byte gelesen. Wenn die Datei kleiner ist, ist sie beim ersten Lesen weg. Von welchem Typ ist Datei?
Delphi-Quellcode:
[edit]hat mal wieder Schreibfehler gefunden[/edit]
var
Datei: TextFile; // oder Datei: File of Char // oder Datei: File of Eintrag; // oder ... |
Re: Fehler beim Speichern???
Delphi-Quellcode:
type Teintrag = record
zahl:string[20]; zeit: string[20]; datum: string[20]; end; var datei: file of Teintrag; eintrag: Teintrag; |
Re: Fehler beim Speichern???
Was gibt denn FileSize aus?
|
Re: Fehler beim Speichern???
was is FileSize? :wiejetzt:
|
Re: Fehler beim Speichern???
FileSize und F1 drücken dann kommt die Erklärung.
Grüße Klaus |
Re: Fehler beim Speichern???
Hallo,
wie sieht Deine Datei aus, häng' sie hier mal bitte dran. Enthält die Datei für jeden Eintrag eine Zeile? Dann muss Du beim Lesen den Zeilenvorschub berücksichtigen. Beim Lesen von Strings musst Du berücksichtigen, dass das 0. Byte die Längenangabe zum String enthält. Für string[20] müssen in der Datei daher 21 Byte zur Verfügung stehen bzw. für einen Eintrag 63 Byte. Versuch es mal bitte mit 'ner geänderten Typedefinition für TEintrag:
Delphi-Quellcode:
Wenn die Datei nun ein "einzeler" ist, wollte alle 60 Byte ein neuer Eintrag stehen und mit Deiner Routine zu lesen sein.
type TEintrag = record
zahl: array[1..20] of Char; zeit: array[1..20] of Char; datum: array[1..20] of Char; end; Filesize sagt Dir, wieviele Sätze Du in Deiner Datei hast. Mach mal bitte hinter das Reset(Datei) ein:
Delphi-Quellcode:
und prüf', ob das Ergebnis mit der von Dir erwarteten Anzahl von Einträgen in der Datei übereinstimmt.
ShowMessage(IntToStr(FileSize(datei)));
|
Re: Fehler beim Speichern???
er gibt die message 10 ( wie die zeilen in dem stringgrid) aus... wie wandel ich dann string in char um?
Danke für die Hilfe |
Re: Fehler beim Speichern???
Hallo,
von String nach Array Of Char sollte so gehen:
Delphi-Quellcode:
s ist hier der von Dir zu verwendende String.
// von string nach array
copymemory(@Eintrag.zahl[low(Eintrag.zahl)],@s[1],sizeof(Eintrag.zahl)); |
Re: Fehler beim Speichern???
Oder auch mit der Funktion StrPCopy.
|
Re: Fehler beim Speichern???
Zitat:
Delphi-Quellcode:
StrPCopy funktioniert nur, wenn ein Array bei 0 beginnt.
type Teintrag = record
zahl: array[1..20] of char; zeit: array[1..20] of char; datum: array[1..20] of char; end; var s : String; Eintrag : TEintrag; begin s := '1000,00'; StrPCopy(Eintrag.Zahl,s); end; [Fehler] Unit1.pas(57): Inkompatible Typen: 'Array' und 'PAnsiChar'
Delphi-Quellcode:
Okay, dass sollte in diesem Fall hier kein Problem sein.
type Teintrag = record
zahl: array[0..19] of char; zeit: array[0..19] of char; datum: array[0..19] of char; end; |
Re: Fehler beim Speichern???
wie is das dann auf mein problem bezogen? Ich versteh es nicht(bin kein Pro in Sachen Delphi) :(
|
Re: Fehler beim Speichern???
Hallo,
Zitat:
Wenn in einem Array der Index bei 0 beginnt, kann man mit StrPCopy dem Array einen String zuweisen, andernfalls muss man es so machen:
Delphi-Quellcode:
Da ich Deine ursprüngliche Definition von string[20] auf array[1..20] of char geändert hatte, funktioniert StrPCopy nicht. Wenn Du hergehst und aus array[1..20] of char überall array[0..19] of char machst, dann kannst Du StrPCopy benutzen, was den Quelltext sicherlich lesbarer macht. Falls Du inzwischen Dein Problem gelöst haben solltest, dann lass das Programm so wie es ist.
copymemory(@Eintrag.zahl[low(Eintrag.zahl)],@s[1],sizeof(Eintrag.zahl));
|
Re: Fehler beim Speichern???
Hallo,
den Typen von String nach Array of char umzustellen halte ich nicht für sehr zielführend. Ein record mit Strings funktioniert auch. Allerdings würde ich aus dem record ein packed record machen.
Delphi-Quellcode:
Wenn Dein Programm 10 Zeilen im StringGrid anlegt
type Teintrag = packed record
zahl:string[20]; zeit: string[20]; datum: string[20]; end; var datei: file of Teintrag; eintrag: Teintrag; dann werden auch 10 Einträge aus der Datei gelesen. Steht denn in den Zeilen 1-9 nichts drin oder wird der Inhalt immer aus Zeile 0 wiederholt? Wenn dem so sein sollte, dann zeige uns doch einmal Deine speicher Routine. Grüße Klaus |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:07 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz