Für die Programmentwicklung ist eine genaue Planung der Datenstruktur sehr wichtig. Deshalb mac h ich mir ja die Gedanken.
Ich habe mir jetzt folgende Datenstruktur gebastelt:
Delphi-Quellcode:
TLeuchte = class
private
FZielort : string;
FAdresse : integer;
public
constructor create;
destructor Destroy; override;
property Zielort : string read FZielort write FZielort;
property Adresse : integer read FAdresse write FAdresse;
end;
TStromkreis = class
private
FAdresse : integer;
FLeuchten : Array of TLeuchte;
function GetLeuchte(index:integer):TLeuchte;
public
constructor create;
destructor destroy; override;
property Leuchte[index:integer]:TLeuchte read GetLeuchte; default;
property Adresse : integer read FAdresse write FAdresse;
function get_Anzahl_Leuchten : integer;
procedure Add_Leuchte(vAdresse : integer; vZielort: string);
procedure clear_Leuchten;
end;
TEinschub = class
private
FStromkreise : Array of TStromkreis;
FAdresse : integer;
FTyp : integer;
function GetStromkreis(index:integer):TStromkreis;
public
constructor create;
destructor destroy; override;
property typ : integer read FTyp write FTyp;
property Stromkreis[index:integer]:TStromkreis read GetStromkreis; default;
property Adresse : integer read FAdresse write FAdresse;
function get_Anzahl_Stromkreise : integer;
procedure Add_Stromkreis(vAdresse:integer);
end;
TGeraet = class
private
FZielort : string;
FAdresse : integer;
FTyp : integer;
FEinschuebe : Array of TEinschub;
function getEinschub(index:integer):TEinschub;
public
constructor create;
destructor destroy; override;
property Einschub[index:integer]: TEinschub read getEinschub; default;
property Zielort : string read FZielort write FZielort;
property Typ : integer read FTyp write FTyp;
property Adresse : integer read FAdresse write FAdresse;
function get_Anzahl_Einschuebe : integer;
procedure Add_Einschub(vTyp : integer; vAdresse: integer);
end;
Die Prozedur zum einfügen von Daten sind diese:
Delphi-Quellcode:
procedure TGeraet.Add_Einschub(vTyp : integer; vAdresse : integer);
var idx : integer;
vEinschub : TEinschub;
begin
idx := get_Anzahl_Einschuebe;
SetLength(FEinschuebe, idx + 1);
vEinschub := TEinschub.create;
FEinschuebe[idx] := vEinschub;
vEinschub.Free;
FEinschuebe[idx].Typ := vTyp;
FEinschuebe[idx].Adresse := vAdresse;
end;
procedure TEinschub.Add_Stromkreis(vAdresse : integer);
var idx : integer;
vStromkreis : TStromkreis;
begin
idx := get_Anzahl_Stromkreise;
SetLength(FStromkreise, idx + 1);
vStromkreis := TStromkreis.create;
FStromkreise[idx] := vStromkreis;
FStromkreise[idx].Adresse := vAdresse;
vStromkreis.Free;
end;
procedure TStromkreis.Add_Leuchte(vAdresse : integer; vZielort: string);
var idx : integer;
vLeuchte : TLeuchte;
begin
idx := get_Anzahl_Leuchten;
SetLength(FLeuchten, idx + 1);
vLeuchte := TLeuchte.create;
FLeuchten[idx] := vLeuchte;
vLeuchte.Free;
FLeuchten[idx].Adresse := vAdresse;
FLeuchten[idx].Zielort := vZielort;
end;
Wenn nun die Struktur mit Daten gefüllt werden sollen, kommt eine Zugriffsverletzung:
Delphi-Quellcode:
FGeraet := TGeraet.Create;
FGeraet.Add_Einschub(JSUSV23, 1);
FGeraet.Einschub[0].Add_Stromkreis(1);
FGeraet.Einschub[0].Add_Stromkreis(2);
FGeraet.Einschub[0].Stromkreis[0].Add_Leuchte(1, 'Toilette Herren'); //Hier kommt eine Zugriffsverletzung
FGeraet.Einschub[0].Stromkreis[0].Add_Leuchte(2, 'Toilette Damen');
FGeraet.Einschub[0].Stromkreis[0].Add_Leuchte(3, 'Eingang');
FGeraet.Einschub[0].Stromkreis[0].Add_Leuchte(4, 'Ausgang');
FGeraet.Einschub[0].Stromkreis[0].Add_Leuchte(5, 'Irgendein Text');
FGeraet.Einschub[0].Stromkreis[1].Add_Leuchte(6, 'Eine 6. Leuchte');
FGeraet.Einschub[0].Stromkreis[1].Add_Leuchte(5, 'Toilette Herren');
FGeraet.Einschub[0].Stromkreis[1].Add_Leuchte(4, 'Toilette Damen');
FGeraet.Einschub[0].Stromkreis[1].Add_Leuchte(3, 'Eingang');
FGeraet.Einschub[0].Stromkreis[1].Add_Leuchte(2, 'Ausgang');
FGeraet.Einschub[0].Stromkreis[1].Add_Leuchte(1, 'Irgendein Text');
Ich dachte erst, es liegt daran, dass ich schon zwei Stromkreise eingefügt habe und jetzt eine Leuchte in Stromkreis 1 einfüge, wodurch aber Speicherplatz im Bereich zwischen Stromkreis 1 und Stromkreis 2 reserviert werden muss. Auch nach Auskommentierung von Add_Stromkreis(2) erscheint in der folgenden Zeile die Zugriffsverletzung.
Gruß
Stefan Blankenagel