Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi EAccessViolation - finde den Fehler nach langer Suche nicht (https://www.delphipraxis.net/88033-eaccessviolation-finde-den-fehler-nach-langer-suche-nicht.html)

fapsons 9. Mär 2007 07:29


EAccessViolation - finde den Fehler nach langer Suche nicht
 
Hallo Leute,

ich bin ein wenig am verzweifeln. Suche nun seit Stunden den Grund dafür, warum ich direkt nach Programmstart einen EAccessViolation bekomme...

Der Fehler liegt in einer Klasse. Als das Programm noch lief, war sie wie folgt aufgebaut:

Delphi-Quellcode:
Unit DeclareTypes;
...
TSoftwarePaket = class
  private
      Software: TIntArray;
      ...
  protected
      procedure SetSprachVersion(lang: ShortInt);
      ...
  puplic
      property Sprachversion:  ShortInt read GetSprachversion  write SetSprachversion;
      ...
...

procedure TSoftwarePaket.SetSprachVersion(lang: ShortInt);
begin
 case lang of
   1: software[9] := Prims[13]; //Deutsch
   2: software[9] := Prims[14]; //Englisch
 end;
end;
Habe dann gestern Abend folgende Veränderungen durchgeführt, seitdem läuft es nicht mehr:

Delphi-Quellcode:
Unit SetObject Values;
...
 reg := TSoftwarePaket.Create;
 reg.Ac_ID := 0;
...


Unit DeclareTypes;

type
    TCustomer = record
      ID :Integer;
      Company :String;
      CompanyType :String;
      PAdress :String;
      Software :TIntArray;
    end;

TSoftwarePaket = class
  private
      Customer: array of TCustomer;
      ...
  protected
      procedure SetSprachVersion(lang: ShortInt);
      ...
  puplic
      Ac_ID :Integer;
      property Sprachversion:  ShortInt read GetSprachversion  write SetSprachversion;
      ...
...

procedure TSoftwarePaket.SetSprachVersion(lang: ShortInt);
begin
 case lang of
   1: customer[ac_ID].software[9] := Prims[13]; //Deutsch
   2: customer[ac_ID].software[9] := Prims[14]; //Englisch
 end;
end;

Kann mir jemand sagen, was ich falsch mache?


Vielen Dank!
Gruß
-fapsons--

Klaus01 9. Mär 2007 07:37

Re: EAccessViolation - finde den Fehler nach langer Suche ni
 
Guten Morgen,

dieses Array "Customer: array of TCustomer;" wurde es schon mal initialisiert, bzw. wurde die
Länge gesetzt.

Grüße
Klaus

fapsons 9. Mär 2007 07:41

Re: EAccessViolation - finde den Fehler nach langer Suche ni
 
Nein, wurde es nicht. Darf das nicht dynamisch bleiben? Wie initialisiere ich es am besten richtig?

Klaus01 9. Mär 2007 07:55

Re: EAccessViolation - finde den Fehler nach langer Suche ni
 
Nun, die Länge kannst Du mit SetLength(dazu einmal die Hilfe befragen) dynamisch anpassen.
Wenn die Länge noch nicht gesetzt wurde, hat das Array die Länge 0
und wenn Du etwas hineinschreiben willst knallt es.

Grüße
Klaus

fapsons 9. Mär 2007 08:05

Re: EAccessViolation - finde den Fehler nach langer Suche ni
 
Super, vielen Dank für deine Hilfe. Ich war schon am verzweifeln...

Habe jetzt folgendes in den Constructor meiner Klasse TSoftware geschrieben.
Ist das so sinnvoll gelöst?

Delphi-Quellcode:
constructor TSoftwarePaket.Create;
begin
 inherited;
 setlength(self.Customer, 9999);
 Init;
 Get_INI_Prims;
end;

IngoD7 9. Mär 2007 08:14

Re: EAccessViolation - finde den Fehler nach langer Suche ni
 
Es ist immer schwer, sich tausend Ratschläge anhören zu müssen, die mit der hinterfragten Problematik nichts direkt zu tun haben, aber ich möchte trotzdem hier einen geben (auch weil du gerade nach sinnvoll fragst):

Mache aus TCustomer eine eigene Klasse (kein Record). Und dann nehme kein Array für Customer, sondern eine Liste (TStringList (kann auch Objekte speichern) oder TObjectList).
Dann musst du dir über die (Array-)Länge deiner Benutzerliste keine Gedanken machen.

(P.S.: Tue dir selbst einen Gefallen und bennene Klassenfelder (also die meist privaten oder protected Variablen in Klassen) mit einem vorangehenden F ---> also FCustomer : TIrgendwas.
Oft hast du eine dazugehörige Property - die würde/könnte dann Customer heißen.)

sirius 9. Mär 2007 08:15

Re: EAccessViolation - finde den Fehler nach langer Suche ni
 
Es ist nicht sinn der Sache ein dynamisches array auf einen festen Wert zu legen (dann kann man auch gleich ein statisches nehmen) du musst es halt auf deine Kundeanzahl festlegen.

yörsch 9. Mär 2007 08:33

Re: EAccessViolation - finde den Fehler nach langer Suche ni
 
Merk dir doch wieviele einträge du hast...
bei New oder Add wird mit
Delphi-Quellcode:
inc(count);
setlength(self.Customer, count);
sollte es dann keine Probleme geben...

Muetze1 9. Mär 2007 08:53

Re: EAccessViolation - finde den Fehler nach langer Suche ni
 
Zitat:

Zitat von yörsch
Merk dir doch wieviele einträge du hast...

Wozu? Die kann er jederzeit mit Length() abfragen. Diese unsinnige Count Variable bei dynamischen Arrays haben bei mir schon öfters kopfschütteln ausgelöst.

Beispiel:
Delphi-Quellcode:
setlength(self.Customer, Length(Self.Customer)+1);

mkinzler 9. Mär 2007 09:00

Re: EAccessViolation - finde den Fehler nach langer Suche ni
 
Es ist nur zu überlegen die Größe dynamische Arrays nicht in 1er-Schritten zu verändern, da das sehr and der Performance der Anwendunng nagen kann


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:59 Uhr.
Seite 1 von 2  1 2      

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-2025 by Thomas Breitkreuz