![]() |
Exeption - Woher?
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,
in der Schule programmieren wir aktuell ein kleines Übungsprojekt, das eine Buchliste (Datenstruktur siehe Anhang) auslesen und ein TBuch schreiben soll. Wir benutzen übrigens Delphi 6. Ein Buch ist als folgendes deklariert (in eigener Unit mBuch):
Delphi-Quellcode:
Der Quellcode des restlichen Projekts:
unit mBuch;
interface type TBuch = class(TObject) private {} public ID: integer; Thema: string; Autor: string; Titel: string; Ort: string; Erscheinungsjahr: integer; Verlag: string; end; implementation end.
Delphi-Quellcode:
Beim ausführen von LineExtract gibts dann leider immer eine Exception der Klasse EAccessViolation (Zugriffsverletzung).
unit mBuchliste;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, mBuch, StdCtrls; type TfMain = class(TForm) procedure FormCreate(Sender: TObject); private {} protected procedure LineExtract; public Buchliste: Array[1..1602] of TBuch; end; var fMain: TfMain; s: string; z: integer; const MyDat ='Buecher.txt'; implementation {$R *.dfm} function PosEx(const Substr: string; const S: string; Offset: Integer): Integer; begin if Offset <= 0 then Result := 0 else Result := Pos(Substr, Copy(S, Offset, Length(S))); if Result <> 0 then Result := Result + Offset - 1; end; procedure TfMain.LineExtract; var x,y: integer; begin x := 0; y := 1; For x := 1 to 7 do begin If x <> 7 then begin Case x of 1: Buchliste[z].ID := StrToInt(Copy(s, y, PosEx(';', s, y) - y)); 2: Buchliste[z].Thema := Copy(s, y, PosEx(';', s, y) - y); 3: Buchliste[z].Autor := Copy(s, y, PosEx(';', s, y) - y); 4: Buchliste[z].Titel := Copy(s, y, PosEx(';', s, y) - y); 5: Buchliste[z].Ort := Copy(s, y, PosEx(';', s, y) - y); 6: begin If Copy(s, y, PosEx(';', s, y) - y) <> '' then Buchliste[z].Erscheinungsjahr := StrToInt(Copy(s, y, PosEx(';', s, y) - y)) Else if Copy(s, y, PosEx(';', s, y) - y) = '' then Buchliste[z].Erscheinungsjahr := 0; end; end; y := PosEx(';', s, y) + 1; end Else if x = 7 then begin Buchliste[z].Verlag := Copy(s, y, Length(s) - y + 1); end; end; end; procedure ReadIn; var datei: Textfile; begin z := 0; assignfile(datei,MyDat); reset(datei); while not EOF(datei) do begin readln(datei,s); z := z + 1; fMain.LineExtract; end; closefile(datei); end; procedure TfMain.FormCreate(Sender: TObject); begin ReadIn; end; end. Keiner - nichtmal der Lehrer :P - weiss woher die kommmt. Hat jemand eine Idee? mfg fortuneNext |
Re: Exeption - Woher?
Zitat:
Du hast ein Array von Objekten, die Du nirgends erzeugst, greifst aber trotzdem darauf zu? :gruebel: Das kann ja gar nicht gehen ;) Setze ein Buchliste[z] := TBuch.Create() und es sollte doch eigentlich gehen. Btw hast Du also eine Klasse, die nichts anderes ist als ein Datencontainer. Hätte es dafür ein Record nicht auch getan? Damit würde es nämlich auch so funktionieren ;) |
Re: Exeption - Woher?
Ja, ein Record hätte es auch getan!
[OT] Was'n dat für'n Lehrer? [/OT] |
Re: Exeption - Woher?
Diese Logik erschließt sich mir nicht so recht:
Zitat:
|
Re: Exeption - Woher?
mhhh... scheint mir 'n mix zwischen konsolapp und fensterapp zu sein... (z.b. readln im constructor). der aufbau scheint mir da auch so 'n mix aus objektorientierung und prozeduraler zu sein... class buch in verbindung mit record...
tja, als übungsprobjekt schon sehr gut, da hast du noch 'n bischen arbeit vor dir, bis es rund läuft ... :-) PS: mit den tipp von leddl, sollt es klappen... |
Re: Exeption - Woher?
Ah, danke für die ganzen konstruktiven Kommentare :-)
Werde bald mal alles ausprobieren... das mit dem Create ist natürlich klar, hatte ich ganz vergessen :-D Und naja... zur Unterrichtung junger Informatiker wird in der Regel kein kompetentes Personal genutzt... Und generell gehts in der Schule ja nicht dadrum, sinnvolle, gut laufende, simpel geschriebene und funktionierende Programme zu schreiben, sondern irgendwelche überhaupt nicht passenden Komponenten dabei zu verwenden (Record - Typ)... |
Re: Exeption - Woher?
Liste der Anhänge anzeigen (Anzahl: 1)
Okay... der Create war die Lösung.
Nun versuchen wir, die eingelesenen Daten in ein StringGrid einzutragen. Dazu 2 Fragen: 1. Es wird wieder eine Exception ausgelöst... völlig sinnlos, beim lesen von Eintrag 1598 und den folgenden 4. Die kann zwar durch einen Try-Block umgangen werden, was aber eine sehr schlampige Lösung ist und nicht die Frage beantwortet, woher sie kommt. Das seltsame daran ist, dass das Programm trotzdem gut läuft, alle Sachen werden korrekt dargestellt etc. 2. Jetzt möchten wir die Sachen sortieren, nach den div. Datentypen (also z.B. nach ID, nach Autor etc). Das wollten wir auslösen, indem man auf die "Fixed-Cols" drückt (oben wo die Beschriftung ist). Ein OnCellSelect geht leider nicht, da sich die Dinger nicht anklicken lassen. Gibt es da irgendeine Lösung oder werden wir eigene Buttons einbauen müssen? Also die Frage ist, lassen sich die Fixed Einträge zu Buttons umfunktionieren?. Danke! mfg |
Re: Exeption - Woher?
- Bereichprüfung einschalten.
- Breakpoints setzen. - Debugger ausgiebig benutzen. |
Re: Exeption - Woher?
Jag das Programm doch durch den Debugger, dann siehst du welcher Befehl diesen Fehler auslöst und dann vielleicht auch warum
|
Re: Exeption - Woher?
Ich weiss ja woher der Fehler kommt.
Delphi-Quellcode:
Bloß wieso bringt das einen Fehler?
StrGrid_Buchliste.Cells[0,x] := IntToStr(Buchliste[x].ID);
Und vor allem erst bei Eintrag 1598-1602? Und warum klappts dann auch noch trotzdem? oO Für mich ein mysterium... das kompetente Lehrpersonal weiss es auch nicht ^^ |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:40 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz