Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Exeption - Woher? (https://www.delphipraxis.net/118859-exeption-woher.html)

fortuneNext 16. Aug 2008 17:40


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:
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.
Der Quellcode des restlichen Projekts:

Delphi-Quellcode:
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.
Beim ausführen von LineExtract gibts dann leider immer eine Exception der Klasse EAccessViolation (Zugriffsverletzung).
Keiner - nichtmal der Lehrer :P - weiss woher die kommmt. Hat jemand eine Idee?
mfg
fortuneNext

leddl 16. Aug 2008 17:53

Re: Exeption - Woher?
 
Zitat:

Zitat von fortuneNext
Hat jemand eine Idee?

Habs jetzt nur mal kurz überflogen, aber:
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 ;)

taaktaak 16. Aug 2008 17:56

Re: Exeption - Woher?
 
Ja, ein Record hätte es auch getan!

[OT] Was'n dat für'n Lehrer? [/OT]

DeddyH 16. Aug 2008 18:05

Re: Exeption - Woher?
 
Diese Logik erschließt sich mir nicht so recht:
Zitat:

Delphi-Quellcode:
  For x := 1 to 7 do
  begin
    If x <> 7 then
    begin
      ...
    end
    Else if x = 7 then
    begin
      ...
    end;

Wieso lässt Du nicht die Schleife bis 6 laufen und machst anschließend etwas mit Nummer 7?

grenzgaenger 16. Aug 2008 19:01

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...

fortuneNext 17. Aug 2008 13:44

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)...

fortuneNext 18. Aug 2008 22:21

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

omata 18. Aug 2008 22:24

Re: Exeption - Woher?
 
- Bereichprüfung einschalten.
- Breakpoints setzen.
- Debugger ausgiebig benutzen.

mkinzler 18. Aug 2008 22:24

Re: Exeption - Woher?
 
Jag das Programm doch durch den Debugger, dann siehst du welcher Befehl diesen Fehler auslöst und dann vielleicht auch warum

fortuneNext 18. Aug 2008 23:05

Re: Exeption - Woher?
 
Ich weiss ja woher der Fehler kommt.

Delphi-Quellcode:
StrGrid_Buchliste.Cells[0,x] := IntToStr(Buchliste[x].ID);
Bloß wieso bringt das einen Fehler?
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.
Seite 1 von 3  1 23      

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