Einzelnen Beitrag anzeigen

Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#7

Re: Daten in einer Klassenhierachie ablegen

  Alt 28. Okt 2006, 10:42
Zitat von steewan:
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;
Dast geht auch anders:

Delphi-Quellcode:
{ * Variante 1 = Direkte Instanzierung + with * }

procedure TGeraet.Add_Einschub(vTyp : integer; vAdresse : integer);
var idx : integer;
begin
  idx := get_Anzahl_Einschuebe;
  SetLength(FEinschuebe, idx + 1);

  with FEinschuebe[idx] := TEinschub.create do begin
    Typ := vTyp;
    Adresse := vAdresse;
  end;
end;

{ * Variante 2 = direkte Instanzierung * }

procedure TEinschub.Add_Stromkreis(vAdresse : integer);
var idx : integer;
begin
  idx := get_Anzahl_Stromkreise;
  SetLength(FStromkreise, idx + 1);

  FStromkreise[idx] := TStromkreis.create;
  FStromkreise[idx].Adresse := vAdresse;
end;

{ * Variante 3 = direkte Instanzierung + Verzicht, auf eigene Methoden * }

procedure TStromkreis.Add_Leuchte(vAdresse : integer; vZielort: string);
begin
  SetLength(FLeuchten, Length(FLeuchten) + 1);

  FLeuchten[High(FLeuchten)] := TLeuchte.create;
  FLeuchten[High(FLeuchten)].Adresse := vAdresse;
  FLeuchten[High(FLeuchten)].Zielort := vZielort;

// Ich bin mir nicht sicher, ob es hier mit with effektiver ist, da nur einmal die "High()" - Methode aufgerufen werden muss (siehe Variante 1)
end;
Zu deinem Problem: Debug mal in "Add_Leuchte" und sag uns, wo dort der Fehler auftritt... Vielleicht ist "get_Anzahl_Leuchten" "defekt"
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat