Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Fehler beim Speichern??? (https://www.delphipraxis.net/130801-fehler-beim-speichern.html)

ichnixwissen 13. Mär 2009 13:15


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;

Reinhardtinho 13. Mär 2009 13:19

Re: Fehler beim Speichern???
 
Weil du die Datei nach dem ersten Record schließt :mrgreen:

BackOrifice 13. Mär 2009 13:22

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.

DeddyH 13. Mär 2009 13:23

Re: Fehler beim Speichern???
 
Und eine sinnvolle Einrückung erleichtert die Fehlersuche auch ungemein.

BackOrifice 13. Mär 2009 13:25

Re: Fehler beim Speichern???
 
Zitat:

Zitat von Reinhardtinho
Weil du die Datei nach dem ersten Record schließt :mrgreen:

Wie kommst du darauf?

ichnixwissen 13. Mär 2009 13:28

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

Reinhardtinho 13. Mär 2009 13:31

Re: Fehler beim Speichern???
 
Zitat:

Zitat von BackOrifice
Zitat:

Zitat von Reinhardtinho
Weil du die Datei nach dem ersten Record schließt :mrgreen:

Wie kommst du darauf?

Ups. Hab mich verguckt.

Die Einrückung und die [zu] vielen end;s haben mich verwirrt.


@DeddyH: So ist es :mrgreen:

Klaus01 13. Mär 2009 13:33

Re: Fehler beim Speichern???
 
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; wozu diese ends gehören kann man hier nicht erkennen
//end;
Ansonsten sieht für mich die Schleife o.k. aus.
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

nahpets 13. Mär 2009 13:35

Re: Fehler beim Speichern???
 
Zitat:

Zitat von BackOrifice
Zitat:

Zitat von Reinhardtinho
Weil du die Datei nach dem ersten Record schließt :mrgreen:

Wie kommst du darauf?

Über die nicht so ganz elegante Einrückung gestolpert, hatte ich im ersten Moment auch gedacht.

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:
var
  Datei: TextFile;
// oder
  Datei: File of Char
// oder
  Datei: File of Eintrag;
// oder
...
[edit]hat mal wieder Schreibfehler gefunden[/edit]

ichnixwissen 13. Mär 2009 13:39

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;

DeddyH 13. Mär 2009 13:46

Re: Fehler beim Speichern???
 
Was gibt denn FileSize aus?

ichnixwissen 13. Mär 2009 13:56

Re: Fehler beim Speichern???
 
was is FileSize? :wiejetzt:

Klaus01 13. Mär 2009 13:59

Re: Fehler beim Speichern???
 
FileSize und F1 drücken dann kommt die Erklärung.

Grüße
Klaus

nahpets 13. Mär 2009 14:02

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:
type TEintrag = record
  zahl: array[1..20] of Char;
  zeit: array[1..20] of Char;
  datum: array[1..20] of Char;
end;
Wenn die Datei nun ein "einzeler" ist, wollte alle 60 Byte ein neuer Eintrag stehen und mit Deiner Routine zu lesen sein.

Filesize sagt Dir, wieviele Sätze Du in Deiner Datei hast. Mach mal bitte hinter das Reset(Datei) ein:
Delphi-Quellcode:
ShowMessage(IntToStr(FileSize(datei)));
und prüf', ob das Ergebnis mit der von Dir erwarteten Anzahl von Einträgen in der Datei übereinstimmt.

ichnixwissen 13. Mär 2009 14:19

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

nahpets 13. Mär 2009 14:33

Re: Fehler beim Speichern???
 
Hallo,

von String nach Array Of Char sollte so gehen:
Delphi-Quellcode:
  // von string nach array
copymemory(@Eintrag.zahl[low(Eintrag.zahl)],@s[1],sizeof(Eintrag.zahl));
s ist hier der von Dir zu verwendende String.

Reinhardtinho 13. Mär 2009 14:41

Re: Fehler beim Speichern???
 
Oder auch mit der Funktion StrPCopy.

nahpets 13. Mär 2009 15:04

Re: Fehler beim Speichern???
 
Zitat:

Zitat von Reinhardtinho
Oder auch mit der Funktion StrPCopy.

Wie ist denn dann die korrekte Syntax?
Delphi-Quellcode:
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'
StrPCopy funktioniert nur, wenn ein Array bei 0 beginnt.
Delphi-Quellcode:
type Teintrag = record
       zahl: array[0..19] of char;
       zeit: array[0..19] of char;
       datum: array[0..19] of char;
     end;
Okay, dass sollte in diesem Fall hier kein Problem sein.

ichnixwissen 13. Mär 2009 15:19

Re: Fehler beim Speichern???
 
wie is das dann auf mein problem bezogen? Ich versteh es nicht(bin kein Pro in Sachen Delphi) :(

nahpets 13. Mär 2009 15:51

Re: Fehler beim Speichern???
 
Hallo,
Zitat:

Zitat von ichnixwissen
wie is das dann auf mein problem bezogen? Ich versteh es nicht(bin kein Pro in Sachen Delphi) :(

ach eigentlich nicht wirklich, ist eher akademisch.

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:
copymemory(@Eintrag.zahl[low(Eintrag.zahl)],@s[1],sizeof(Eintrag.zahl));
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.

Klaus01 13. Mär 2009 16:20

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:
type Teintrag = packed record
        zahl:string[20];
        zeit: string[20];
        datum: string[20];
     end;

var

datei: file of Teintrag;
eintrag: Teintrag;
Wenn Dein Programm 10 Zeilen im StringGrid anlegt
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