![]() |
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:
Habe dann gestern Abend folgende Veränderungen durchgeführt, seitdem läuft es nicht mehr:
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;
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-- |
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 |
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?
|
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 |
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; |
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.) |
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.
|
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:
sollte es dann keine Probleme geben...
inc(count);
setlength(self.Customer, count); |
Re: EAccessViolation - finde den Fehler nach langer Suche ni
Zitat:
Beispiel:
Delphi-Quellcode:
setlength(self.Customer, Length(Self.Customer)+1);
|
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. |
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