AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi EAccessViolation - finde den Fehler nach langer Suche nicht
Thema durchsuchen
Ansicht
Themen-Optionen

EAccessViolation - finde den Fehler nach langer Suche nicht

Offene Frage von "fapsons"
Ein Thema von fapsons · begonnen am 9. Mär 2007 · letzter Beitrag vom 9. Mär 2007
Antwort Antwort
Seite 1 von 2  1 2      
fapsons

Registriert seit: 29. Jan 2007
Ort: Berlin
65 Beiträge
 
#1

EAccessViolation - finde den Fehler nach langer Suche nicht

  Alt 9. Mär 2007, 08:29
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--
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.767 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: EAccessViolation - finde den Fehler nach langer Suche ni

  Alt 9. Mär 2007, 08:37
Guten Morgen,

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

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
fapsons

Registriert seit: 29. Jan 2007
Ort: Berlin
65 Beiträge
 
#3

Re: EAccessViolation - finde den Fehler nach langer Suche ni

  Alt 9. Mär 2007, 08:41
Nein, wurde es nicht. Darf das nicht dynamisch bleiben? Wie initialisiere ich es am besten richtig?
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.767 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: EAccessViolation - finde den Fehler nach langer Suche ni

  Alt 9. Mär 2007, 08:55
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
Klaus
  Mit Zitat antworten Zitat
fapsons

Registriert seit: 29. Jan 2007
Ort: Berlin
65 Beiträge
 
#5

Re: EAccessViolation - finde den Fehler nach langer Suche ni

  Alt 9. Mär 2007, 09:05
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;
  Mit Zitat antworten Zitat
IngoD7

Registriert seit: 17. Feb 2004
464 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: EAccessViolation - finde den Fehler nach langer Suche ni

  Alt 9. Mär 2007, 09:14
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.)
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: EAccessViolation - finde den Fehler nach langer Suche ni

  Alt 9. Mär 2007, 09:15
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.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von yörsch
yörsch

Registriert seit: 10. Jan 2007
Ort: Lampertheim
206 Beiträge
 
Delphi XE2 Architect
 
#8

Re: EAccessViolation - finde den Fehler nach langer Suche ni

  Alt 9. Mär 2007, 09:33
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...
Jörg
have FUN
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#9

Re: EAccessViolation - finde den Fehler nach langer Suche ni

  Alt 9. Mär 2007, 09:53
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:setlength(self.Customer, Length(Self.Customer)+1);
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#10

Re: EAccessViolation - finde den Fehler nach langer Suche ni

  Alt 9. Mär 2007, 10:00
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
Markus Kinzler
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:36 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz