Autor Beitrag
speck12
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36



BeitragVerfasst: Mo 02.06.08 20:06 
Hi, habe eine Problem beim auslesen einer vorher erzeugten datei. Kommt immer eine EAccessViolation Zugriffsverletzung.

Hier der Code:

ausblenden volle Höhe 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:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, TFrage;

type


  TForm1 = class(TForm)
    Edit1: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Edit2: TEdit;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Button1: TButton;
    Edit6: TEdit;
    Label6: TLabel;
    Label7: TLabel;
    Edit7: TEdit;
    Label8: TLabel;
    Label9: TLabel;
    Label10: TLabel;
    Edit8: TEdit;
    Edit9: TEdit;
    Edit10: TEdit;
    Label11: TLabel;
    Edit11: TEdit;
    Label12: TLabel;
    Edit12: TEdit;
    Fragenliste: TListBox;
    Button2: TButton;
    Label13: TLabel;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FragenlisteClick(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    Fragen : Array[1..15] of TFragen;
    selected : integer;
    procedure Fragen_Speichern;
    procedure Fragen_Laden;
    procedure Liste_fuellen;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


procedure TForm1.Fragen_Speichern;
 var datei : file of TFragen;
    pfad  : String        ;
    i : integer;
  begin
    pfad := ExtractFilePath(Application.ExeName) + 'fragen.txt';
    Assignfile(datei,pfad );
    Rewrite(datei);
     for i := 1 to 15 do
      begin
       Write(datei,Fragen[i]);
      end;
     CloseFile(datei);


  end;


procedure TForm1.Fragen_Laden;
 var datei : file of TFragen;
    pfad  : String        ;
    i : integer;
  begin
   pfad := ExtractFilePath(Application.ExeName) +'fragen.txt';
   AssignFile(datei,pfad);
   Reset(datei);
    for i := 1 to 15 do
     begin
      Read(datei,Fragen[i]);
     end;
   CloseFile(datei);
  end;

procedure TForm1.Button1Click(Sender: TObject);
 begin
  Fragen_Speichern;
 end;

procedure TForm1.FormCreate(Sender: TObject);
 var i : integer;
  begin
   selected := 1;
    for i := 1 to 15 do
     begin
      Fragen[i] := TFragen.Create;
      Fragen[i].Frage := '';
      Fragen[i].Antwort1 := '';
      Fragen[i].Antwort2 := '';
      Fragen[i].Antwort3 := '';
      Fragen[i].Richtige_Antwort := '';

     end;
    Liste_fuellen;
  end;


procedure TForm1.Liste_fuellen;
 var summe : string ;
         i : integer;
  begin
   for i := 1 to 15 do
    begin
     case i of
      { 1}  1 : summe := '50'       ;
      { 2}  2 : summe := '100'      ;
      { 3}  3 : summe := '200'      ;
      { 4}  4 : summe := '300'      ;
      { 5}  5 : summe := '500'      ;
      { 6}  6 : summe := '1000'     ;
      { 7}  7 : summe := '2000'     ;
      { 8}  8 : summe := '4000'     ;
      { 9}  9 : summe := '8000'     ;
      {10} 10 : summe := '16000'    ;
      {11} 11 : summe := '32000'    ;
      {12} 12 : summe := '64000'    ;
      {13} 13 : summe := '125000'   ;
      {14} 14 : summe := '500000'   ;
      {15} 15 : summe := '1000000'  ;
     end;
     Fragen[i].Fragenr := i;
     Fragen[i].Gewinnsumme := StrToInt(summe) ;
     Fragenliste.AddItem(summe+' €',Fragen[i]);
    end;
   end;
procedure TForm1.FragenlisteClick(Sender: TObject);
  begin
   selected := Fragenliste.ItemIndex + 1;
     Edit1.Text  := Fragen[selected].Frage;
     Edit2.Text  := Fragen[selected].Richtige_Antwort;
     Edit3.Text  := Fragen[selected].Antwort1;
     Edit4.Text  := Fragen[selected].Antwort2;
     Edit5.Text  := Fragen[selected].Antwort3;
     Edit11.Text := IntToStr(Fragen[selected].Gewinnsumme);
     Edit6.Text  := Fragen[selected].Frage;
     Edit7.Text  := Fragen[selected].Richtige_Antwort;
     Edit8.Text  := Fragen[selected].Antwort1;
     Edit9.Text  := Fragen[selected].Antwort2;
     Edit10.Text := Fragen[selected].Antwort3;
     Edit12.Text := IntToStr(Fragen[selected].Gewinnsumme);
  end;

procedure TForm1.Button3Click(Sender: TObject);
 begin
  with Fragen[selected] do
   begin
    Frage := Edit1.Text;
    Richtige_Antwort := Edit2.Text;
    Antwort1 := Edit3.Text;
    Antwort2 := Edit4.Text;
    Antwort3 := Edit5.Text;
   end; 
 end;

procedure TForm1.Button2Click(Sender: TObject);
 begin
  Fragen_Laden;
 end;

end.


Der Fehler kommt immer dann,wenn ich nach dem Laden der Datei auf die Listbox klicke.

Komme irgendwie nicht auf den Fehler... Wäre froh über jede Hilfe

mfg
Clemens L.
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 158

Win Xp SP3
D6 Enterprise, Turbo Delphi Explorer
BeitragVerfasst: Mo 02.06.08 20:14 
Einen Fehler habe ich noch nicht gefunden beim drüberschauen. Sind denn Datensätze vorhanden? Und ich würde ExtractFilePath(ParamStr(0)) nehmen, ist zwar glaube ich das gleiche, find ich aber besser. :P Und da bei typisierten Dateien meines Wissens ab 0 gezählz wird, solltest du da auch anfangen! :) Bei dir ist die Gefahr groß das du übers Ende hinaus liest!
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 02.06.08 21:00 
Moin!

user profile iconspeck12 hat folgendes geschrieben:
Hi, habe eine Problem beim auslesen einer vorher erzeugten datei. Kommt immer eine EAccessViolation Zugriffsverletzung.
Zeig doch mal die Deklaration von:
user profile iconspeck12 hat folgendes geschrieben:
ausblenden Delphi-Quelltext
1:
Fragen : Array[1..15] of TFragen;					
und pack mal eine Beispieldatei mit ein paar Datensätzen hier in den Anhang, so kommen wir ja nicht weiter. :nixweiss:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
speck12 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36



BeitragVerfasst: Mo 02.06.08 21:43 
Ups^^... Ja hier is die Unit TFrage. Eigentlich nichts großes..

ausblenden volle Höhe 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:
unit TFrage;


interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;


type
  TFragen = class(TObject)
             Frage            : String[150] ;
             Antwort1         : String[150] ;
             Antwort2         : String[150] ;
             Antwort3         : String[150] ;
             Richtige_Antwort : String[150] ;
             Gewinnsumme      : Integer;
             Fragenr          : Integer;
             Constructor  Create;
             Destructor   Destroy;
           end;


implementation

Constructor TFragen.Create;
 begin
  Inherited Create;
 end;

Destructor TFragen.Destroy;
 begin
  Inherited Destroy;
 end;



end.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 02.06.08 21:48 
Moin!

user profile iconspeck12 hat folgendes geschrieben:
Ups^^... Ja hier is die Unit TFrage. Eigentlich nichts großes..
ausblenden Delphi-Quelltext
1:
2:
type
  TFragen = class(TObject)
Da isser ja, das sind dynamische Objekte, die kann man nicht (so ohne weiteres) in eine typisierte Datei speichern! :idea: ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
speck12 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36



BeitragVerfasst: Mo 02.06.08 21:54 
hmm, was könnte ich denn dann nehmen?
wenn ich record nehme, dann kann ich es nicht mit der ListBox verbinden, weil es nach Objekten verlangt. Oder soll ich nur anstatt TObject etwas anderes nehmen?
mfg
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 02.06.08 22:30 
Moin!

user profile iconspeck12 hat folgendes geschrieben:
hmm, was könnte ich denn dann nehmen?
TObject ist schon nicht ganz schlecht, aber dann könntest du das mal so probieren:
ausblenden volle Höhe 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:
type
  TFragen = class(TObject)
    Frage            : String;
    Antwort1         : String;
    Antwort2         : String;
    Antwort3         : String;
    Richtige_Antwort : String;
    Gewinnsumme      : Integer;
    Fragenr          : Integer;
  private
    function GetText: String;
    procedure SetText(const Value: String);
  public
    property Text: String read GetText write SetText;
  end;

function TFragen.GetText: String;
  var
    SL: TStringList;
begin
  SL := TStringList.Create;
  try
    SL.Values['Frage'] := Frage;
    SL.Values['Antwort1'] := Antwort1;
    SL.Values['Antwort2'] := Antwort2;
    SL.Values['Antwort3'] := Antwort3;
    SL.Values['Richtige_Antwort'] := Richtige_Antwort;
    SL.Values['Gewinnsumme'] := IntToStr(Gewinnsumme);
    SL.Values['Fragenr'] := IntToStr(Fragenr);
    Result := SL.CommaText;
  finally
    SL.Free;
  end;
end;

procedure TFragen.SetText(const Value: String);
  var
    SL: TStringList;
begin
  SL := TStringList.Create;
  try
    Frage := SL.Values['Frage'];
    Antwort1 := SL.Values['Antwort1'];
    Antwort2 := SL.Values['Antwort2'];
    Antwort3 := SL.Values['Antwort3'];
    Richtige_Antwort := SL.Values['Richtige_Antwort'];
    Gewinnsumme := StrToIntDef(SL.Values['Gewinnsumme'],0);
    Fragenr := StrToIntDef(SL.Values['Fragenr'],0);
  finally
    SL.Free;
  end;
end;
Jetzt ist das Objekt in der Lage, sich aus einem String zu laden und auch dort wieder abzulegen. Du könntest dann einfach alle Objekte in eine Stringliste schieben und diesen dann mit .SaveToFile() speichern. Umgekehrt beim laden. :idea: Das ist zwar nicht unbedingt speicherplatzoptimiert oder mega-performant (jedenfalls nicht, wenn man zig-tausende Objekte verarbeiten will), aber du kannst dir den Datenbestand in der Datei in einem einfachen Editor ansehen und sogar bearbeiten. ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
speck12 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36



BeitragVerfasst: Mo 02.06.08 22:43 
hey, vielen dank :)
ich probier das mal gleich aus.

mfg