| Autor |
Beitrag |
sunday_2
      
Beiträge: 101
Delphi 7.0
|
Verfasst: Di 26.11.02 15:47
Hi,
ich habe folgendes Prob:
Ich möchte einen Datensatz aus einer typisierten Datei löschen. Allerdings schmiert er mir jedes mal dabei ab. Des weiteren schreibt mir die Funktion 'Neuer Datensatz anlegen' beim ersten Click jedesmal irgendeinen Mist in meinem Neuen Datensatz(allerdings nur beim ersten mal. Ich habe keine Ahnung warum. Ich poste mal den Code. Vieleicht weiß ja irgend jemand rat.
Record Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| type TSpielerdaten = record Name: String[25]; Vorname: String[25]; Mannschaft: String[30]; Strasse: String[30]; plz: String[5]; ort: String[30]; land: String[20]; telefon: String[30]; alter: String[5]; end; |
Variable:
Quelltext 1:
| FSpDaten: file of TSpielerdaten; |
Prozeduren:
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: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123:
| procedure TSpieldefinition.FormCreate(Sender: TObject); begin AssignFile(FSpDaten,'Spielerdaten.kpt'); if FileExists('Spielerdaten.kpt') then ReSet(FSpDaten) else ReWrite(FSpDaten); end;
procedure TSpieldefinition.FormDestroy(Sender: TObject); begin closeFile(FSpDaten); end;
procedure TSpieldefinition.positionieren(datensatz:integer); var aktDS: TSpielerdaten; begin if(datensatz<0) or (datensatz>=FileSize(FSpDaten)) then exit else begin seek(FSpDaten, datensatz); read(FSpDaten,aktDS); e_spielerdaten_name.text:= aktDS.name; e_spielerdaten_vorname.text:= aktDS.Vorname; e_spielerdaten_mannschaft.text:= aktDS.Mannschaft; e_spielerdaten_strasse.text:= aktDS.Strasse; e_spielerdaten_plz.text:= aktDS.plz; e_spielerdaten_ort.text:= aktDS.ort; e_spielerdaten_land.text:= aktDS.land; e_spielerdaten_telefon.text:= aktDS.telefon; e_spielerdaten_alter.text:= aktDS.alter; end; end;
procedure TSpieldefinition.b_Spielerdaten_zurueckClick(Sender: TObject); begin positionieren(FilePos(FSpDaten)-2); end;
procedure TSpieldefinition.b_Spielerdaten_vorClick(Sender: TObject); begin positionieren(FilePos(FSpDaten)); end;
procedure TSpieldefinition.b_Spielerdaten_NeuerDSClick(Sender: TObject); var Buffer: array[0..BufferSize -1] of TSpielerdaten; i, p: integer; begin Seek(FSpDaten,0); p:=0; while not eof(FSpDaten) do begin Read(FSpDaten,Buffer[p]); p:=p+1; end; CloseFile(FSpDaten); Buffer[p+1].Name := ''; Buffer[p+1].Vorname := ''; Buffer[p+1].Mannschaft := ''; Buffer[p+1].Strasse := ''; Buffer[p+1].plz := ''; Buffer[p+1].ort := ''; Buffer[p+1].land := ''; Buffer[p+1].telefon := ''; Buffer[p+1].alter := ''; ReWrite(FSpDaten); for i:=0 to p do Write(FSpDaten,Buffer[i]); positionieren(FileSize(FSpDaten)-1); end;
procedure TSpieldefinition.b_Spielerdaten_loeschenClick(Sender: TObject); var Buffer: array[0..BufferSize -1] of TSpielerdaten; i, max: integer; StartRecord, EndRecord: integer; begin //Cursor vor akt. DS Seek(FSpDaten,FilePos(FSpDaten)-1); StartRecord:= FilePos(FSpDaten)+1; EndRecord:= FileSize(FSpDaten); while StartRecord < EndRecord do begin max:= BufferSize; if Max > EndRecord - StartRecord then Max := EndRecord - StartRecord; Seek(FSpDaten, StartRecord); //DS lesen for i:=0 to Max -1 do read(FSpDaten, Buffer[i]); Seek(FSpDaten, StartRecord-1); //DS zurückschreiben for i:=0 to Max -1 do Write(FSpDaten, Buffer[i]); end; //Datei abschneiden Truncate(FSpDaten); Positionieren(StartRecord-1); end;
procedure TSpieldefinition.b_Spielerdaten_speichernClick(Sender: TObject); var DS: TSpielerdaten; nr: integer; begin //Cursor vor akt. Datensatz if FilePos(FSpDaten)-1 < 0 then Seek(FSpDaten,0) else Seek(FSpDaten, FilePos(FSpDaten)-1); nr:=FilePos(FSpDaten); DS.Name:= e_spielerdaten_name.Text; DS.vorname:= e_spielerdaten_vorname.Text; DS.mannschaft:= e_spielerdaten_mannschaft.Text; DS.strasse:= e_spielerdaten_strasse.Text; DS.plz:= e_spielerdaten_plz.Text; DS.ort:= e_spielerdaten_ort.Text; DS.land:= e_spielerdaten_land.Text; DS.telefon:= e_spielerdaten_telefon.Text; DS.alter:= e_spielerdaten_alter.Text; //speichern des Datensatzes write(FSpDaten,DS); positionieren(nr); end; |
Ich hab echt keine Ahnung, warum das nicht funktioniert!
_________________ Gruß Sunday
... wer nicht fragt, bleibt dumm!!!
|
|
Klabautermann
      

Beiträge: 6366
Erhaltene Danke: 60
Windows 7, Ubuntu
Delphi 7 Prof.
|
Verfasst: Di 26.11.02 16:16
Hallo,
ich habe deinen Code nur mal flüchtig überflogen, aber in der Schleife der funtion b_Spielerdaten_loeschenClick sehe ich nicht wo du die Werte von StartRecord oder Endrecord änderst. Daher muss es sich meiner meinung nach um eine Englosschleife handeln.
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| while StartRecord < EndRecord do begin max:= BufferSize; if Max > EndRecord - StartRecord then Max := EndRecord - StartRecord; Seek(FSpDaten, StartRecord); //DS lesen for i:=0 to Max -1 do read(FSpDaten, Buffer[i]); Seek(FSpDaten, StartRecord-1); //DS zurückschreiben for i:=0 to Max -1 do Write(FSpDaten, Buffer[i]); end; |
Gruß
Klabautermann
|
|
sunday_2 
      
Beiträge: 101
Delphi 7.0
|
Verfasst: Di 26.11.02 17:08
Ups
Ich glaub es nicht. Habe tatsächlich
inc(StartRecord) vergessen.  .
Danke Klabautermann.
Machmal sieht man den Wald vor lauter Bäumen nicht.
_________________ Gruß Sunday
... wer nicht fragt, bleibt dumm!!!
|
|
nonni
      
Beiträge: 34
|
Verfasst: Mi 29.01.03 01:31
Hallo,
ich habe mal zu dem Code eine Frage und zwar. Wo ist die Konstante die im Array vorkommt "BufferSize" deklariert, bei mir sagt das nur "Konstantenausdruck erwartet".
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:
| procedure TSpieldefinition.b_Spielerdaten_loeschenClick(Sender: TObject); var Buffer: array[0..BufferSize -1] of TSpielerdaten; i, max: integer; StartRecord, EndRecord: integer; begin //Cursor vor akt. DS Seek(FSpDaten,FilePos(FSpDaten)-1); StartRecord:= FilePos(FSpDaten)+1; EndRecord:= FileSize(FSpDaten); while StartRecord < EndRecord do begin max:= BufferSize; if Max > EndRecord - StartRecord then Max := EndRecord - StartRecord; Seek(FSpDaten, StartRecord); //DS lesen for i:=0 to Max -1 do read(FSpDaten, Buffer[i]); Seek(FSpDaten, StartRecord-1); //DS zurückschreiben for i:=0 to Max -1 do Write(FSpDaten, Buffer[i]); end; //Datei abschneiden Truncate(FSpDaten); Positionieren(StartRecord-1); end; |
Ich habe versucht so zu machen:
Quelltext 1:
| buffer: array[0..fileSize(name)] of Tspielerdaten; |
kommt der gleiche Fehler. Kann mir bitte einer helfen?
Moderiert von Tino: Code-Tags hinzugefügt.
|
|
grayfox
      
Beiträge: 800
win98, winXP
D4 Standard; D6 Personal
|
Verfasst: Mi 29.01.03 02:13
hallo nonni!
soweit ich das system hier durchschaut habe, wird in 'buffersize' die mögliche anzahl der einträge festgelegt.
daher gehört 'buffersize' unter 'const' gleich am anfang der unit definiert
zb
const
buffersize = 50;
deine definition:
Quelltext 1:
| buffer: array[0..fileSize(name)] of Tspielerdaten |
wird dir nicht funktionieren, da filesize in deinem fall die grösse des files in byte zurückgibt. und das werden dann viel zu viel einträge
mfg, stefan
|
|
sunday_2 
      
Beiträge: 101
Delphi 7.0
|
Verfasst: Mi 29.01.03 17:21
hi nonni!
Es ist in der Tat so wie Stefan geschrieben hat.
Buffersize legt die Größe fest und ist am Anfang der Unit deklariert.
_________________ Gruß Sunday
... wer nicht fragt, bleibt dumm!!!
|
|
nonni
      
Beiträge: 34
|
Verfasst: Mi 29.01.03 17:50
Vielen dank zusammen, das wollte ich nur wissen.
|
|
|