Entwickler-Ecke

Sonstiges (Delphi) - Zugriffsverletztung bei Adrees 00402E42


Arkathor - Sa 13.11.10 20:49
Titel: Zugriffsverletztung bei Adrees 00402E42
Hallo
Ich habe einen Problem,ich soll bis Dienstag einen kleinen DatenBank machen, der 6 eidits (name, vorname, geburts datum itp.), 5 buttons (Eintragen, speichern, Laden, löschen) und einen StringGrid hat. Eintragen soll die Daten von Edits in Array speichern, sie dabei alphabetisch sortieren und dabei soll er diese Daten i den StringGrid einfügen, speichern soll eine Datei erzeugen und die Daten dort speichern, laden soll sie laden und anzeigen und löschen soll einen konkreten datensatz aus dem array löschen und alle nach vorne verschieben. Naja ich bin beim Eintragen stehen gebieleben, da ich eine solche fehlermeldung kriege [url=http://img577.imageshack.us/i/fehlermeldung.png/]user defined image[/URL] ich habe das Programm schritt für schritt ablaufen lassen und die Fehler Meldung bekomme ich ganz am Ende von Procedure EintragenButtonKlick. Kann mir jemand erklären, was bedeutet dieses Felher und wie man ihn beheben könnte?
Unterhalb mein bisheriger queltext.


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:
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:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
type
  TPerson  = Record
            FName:String[50];
            Vorname:String[50];
            Alter:Byte;
            Geburtsdatum:String[10];
            StrNr:String[50];
            Plz:Integer;
            Ort:String[50];
            Geschlecht:String[1];
    end;

  TGruppe = Array of TPerson;
    TForm1 = class(TForm)
    FNameEd: TEdit;
    StrNrEd: TEdit;
    VornameEd: TEdit;
    NameLb: TLabel;
    VornameLb: TLabel;
    StrNrLb: TLabel;
    OrtEd: TEdit;
    OrtLb: TLabel;
    GeburtsdatumEd: TEdit;
    GebDatLb: TLabel;
    GeschlechtEd: TEdit;
    GeschlechtLb: TLabel;
    PLZLb: TLabel;
    PLZEd: TEdit;
    AlterEd: TEdit;
    AlterLb: TLabel;
    EintragenBt: TButton;
    SpeichernBt: TButton;
    LadenBt: TButton;
    AnzeigeStrGr: TStringGrid;
    EndeBt: TButton;
    procedure FormCreate(Sender: TObject);
    procedure SpeichernBtClick(Sender: TObject);
    procedure LadenBtClick(Sender: TObject);
    procedure EintragenBtClick(Sender: TObject);
    procedure EndeBtClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  Gruppe:TGruppe;
  Person:TPerson;
  Datei:File of TPerson;
  i:integer;

implementation

{$R *.DFM}

procedure StringGrindIni;
begin
         with Form1.AnzeigeStrGr do
         begin
         cells[0,0]:='Name';
         cells[1,0]:='Vorname';
         cells[2,0]:='Alter';
         cells[3,0]:='Str./Nr.';
         cells[4,0]:='Ort';
         cells[5,0]:='Geschlecht';
         cells[6,0]:='Geburtsdatum';
         cells[7,0]:='PLZ';
         cells[8,0]:='Nr';
         end;

end;
procedure leeren;
begin
    Form1.FNameEd.text:='';
    Form1.VornameEd.text:='';
    Form1.AlterEd.text:='';
    Form1.GeburtsdatumEd.text:='';
    Form1.GeschlechtEd.text:='';
    Form1.OrtEd.text:='';
    Form1.StrNrEd.text:='';
    Form1.PlzEd.text:='';
end;

procedure initial;
var x:integer;
begin
    For x:=1 to Length(Gruppe) do
    with Gruppe[x] do
         begin
         FName:='';
         Vorname:='';
         Alter:=0;
         Geburtsdatum:='';
         StrNr:='';
         Ort:='';
         Geschlecht:='';
         end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
i:=0;
StringGrindIni;
initial;
leeren;
end;


procedure Fuellen;
var x:integer;
begin
For x:=i to i do
begin
with Form1.AnzeigeStrGr do
    begin
    Form1.AnzeigeStrGr.cells[0,x]:=gruppe[x].FName;
    Form1.AnzeigeStrGr.cells[1,x]:=gruppe[x].Vorname;
    Form1.AnzeigeStrGr.cells[2,x]:=inttostr (gruppe[x].Alter);
    Form1.AnzeigeStrGr.cells[3,x]:=gruppe[x].StrNr;
    Form1.AnzeigeStrGr.cells[4,x]:=gruppe[x].Ort;
    Form1.AnzeigeStrGr.cells[5,x]:=gruppe[x].Geschlecht;
    Form1.AnzeigeStrGr.cells[6,x]:=gruppe[x].Geburtsdatum;
    Form1.AnzeigeStrGr.cells[7,x]:=inttostr (gruppe[x].PLZ);
    end;
    Form1.AnzeigeStrGr.RowCount:=i;
    end;
end;




procedure TForm1.SpeichernBtClick(Sender: TObject);
begin
assignfile(Datei,'Daten.dat');
{$I-}
seek(datei,Filesize(Datei));
{$I+}
   If IOResult <>0 then
   rewrite(Datei);
   For i:=1 to i do
   begin
   write(Datei,Gruppe[i]);
   end;
closefile(Datei);
end;

procedure TForm1.LadenBtClick(Sender: TObject);

var j:integer;
begin
assignfile(Datei,'Daten.dat');
{$I-}
  reset(Datei);
{$I+}
   j:=1;
   if IOResult<>0 then
   showmessage('Datei liegt auffinfbar');
   While not EOF(Datei) do
begin
     read(Datei,Person);
     Gruppe[j]:=Person;
     j:=j+1;
end;
i:=Filepos(Datei);
closefile(Datei);
end;

procedure TForm1.EintragenBtClick(Sender: TObject);
begin
     i:=i+1;
     SetLength(Gruppe,i);
     FNameEd.SetFocus;
     with gruppe[i] do
     begin
          FName:=FNameEd.text;
          Vorname:=VornameEd.text;
          Alter:=strtoint (AlterEd.text);
          StrNr:=StrNrEd.text;
          Ort:=OrtEd.text;
          Geschlecht:=GeschlechtEd.text;
          Geburtsdatum:=GeburtsdatumEd.text;
          Plz:=strtoint (PlzEd.text);
     end;
     Fuellen;
     leeren;
end;

procedure TForm1.EndeBtClick(Sender: TObject);
begin
close;
end;

end.


elundril - Sa 13.11.10 21:14

ich weiß nicht ob das mit deinem Problem zusammenhängt, aber bei der procedure fuellen:

Delphi-Quelltext
1:
for x := i to i                    


ist das dein ernst? wie oft glaubst du läuft die durch. (das problem könnte sein, weil du von 0 bis i-1 laufen musst in der schleife. sonst greifst du auf eine Arrayitem zu das gar nicht existiert.)

lg elundril

Tante Edith sagt:

da hier gleich der nächste Codeausschnitt der weh tut!

Delphi-Quelltext
1:
2:
3:
4:
   For i:=1 to i do
   begin
   write(Datei,Gruppe[i]);
   end;


Gerd Kayser - Sa 13.11.10 21:31

user profile iconelundril hat folgendes geschrieben Zum zitierten Posting springen:
da hier gleich der nächste Codeausschnitt der weh tut!
Da fallen noch andere Stolpersteine auf, u. a.:
PLZ sollte als string[10] definiert sein, weil sonst führende Nullen wegfallen und Postleitzahlen bis zu 10 Zeichen lang sein können. Siehe: http://de.wikipedia.org/wiki/Postleitzahl
Außerdem sollte man packed records verwenden.