| Autor |
Beitrag |
speck12
      
Beiträge: 36
|
Verfasst: Mo 02.06.08 20:06
Hi, habe eine Problem beim auslesen einer vorher erzeugten datei. Kommt immer eine EAccessViolation Zugriffsverletzung.
Hier der Code:
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 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 : summe := '50' ; 2 : summe := '100' ; 3 : summe := '200' ; 4 : summe := '300' ; 5 : summe := '500' ; 6 : summe := '1000' ; 7 : summe := '2000' ; 8 : summe := '4000' ; 9 : summe := '8000' ; 10 : summe := '16000' ; 11 : summe := '32000' ; 12 : summe := '64000' ; 13 : summe := '125000' ; 14 : summe := '500000' ; 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.
      
Beiträge: 158
Win Xp SP3
D6 Enterprise, Turbo Delphi Explorer
|
Verfasst: 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.  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
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mo 02.06.08 21:00
Moin!
speck12 hat folgendes geschrieben: | | Hi, habe eine Problem beim auslesen einer vorher erzeugten datei. Kommt immer eine EAccessViolation Zugriffsverletzung. |
Zeig doch mal die Deklaration von:
speck12 hat folgendes geschrieben: | 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.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
speck12 
      
Beiträge: 36
|
Verfasst: Mo 02.06.08 21:43
Ups^^... Ja hier is die Unit TFrage. Eigentlich nichts großes..
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
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mo 02.06.08 21:48
Moin!
speck12 hat folgendes geschrieben: | Ups^^... Ja hier is die Unit TFrage. Eigentlich nichts großes..
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!
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
speck12 
      
Beiträge: 36
|
Verfasst: 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
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mo 02.06.08 22:30
Moin!
speck12 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:
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.  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 
      
Beiträge: 36
|
Verfasst: Mo 02.06.08 22:43
hey, vielen dank
ich probier das mal gleich aus.
mfg
|
|
|