Einzelnen Beitrag anzeigen

steewan

Registriert seit: 27. Nov 2003
20 Beiträge
 
#6

Re: Daten in einer Klassenhierachie ablegen

  Alt 28. Okt 2006, 09:55
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
  Mit Zitat antworten Zitat