Autor Beitrag
sunday_2
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 101


Delphi 7.0
BeitragVerfasst: 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
ausblenden 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:
ausblenden Quelltext
1:
FSpDaten: file of TSpielerdaten;					

Prozeduren:
ausblenden volle Höhe 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:
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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: 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.
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 101


Delphi 7.0
BeitragVerfasst: Di 26.11.02 17:08 
Ups :oops:
Ich glaub es nicht. Habe tatsächlich
inc(StartRecord) vergessen. :autsch: .

Danke Klabautermann.
Machmal sieht man den Wald vor lauter Bäumen nicht.

_________________
Gruß Sunday

... wer nicht fragt, bleibt dumm!!!
nonni
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 34



BeitragVerfasst: 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".
ausblenden 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:
ausblenden Quelltext
1:
buffer: array[0..fileSize(name)] of Tspielerdaten;					

kommt der gleiche Fehler. Kann mir bitte einer helfen?

Moderiert von user profile iconTino: Code-Tags hinzugefügt.
grayfox
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 800

win98, winXP
D4 Standard; D6 Personal
BeitragVerfasst: 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 101


Delphi 7.0
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 34



BeitragVerfasst: Mi 29.01.03 17:50 
Vielen dank zusammen, das wollte ich nur wissen.