Einzelnen Beitrag anzeigen

GroHae

Registriert seit: 19. Apr 2007
Ort: Nabburg
83 Beiträge
 
Delphi 2007 Enterprise
 
#5

Ich hab da was noch nicht verstanden

  Alt 29. Jan 2008, 10:10
Hallo,

jetzt habe ich endlich da weiter gemacht wo ich vor langen aufgehört habe.

Ich habe jetzt folgendes:

Delphi-Quellcode:
interface

uses Classes;


type

  TMyEnumerator = class;

  TSpeisenkarteKomponente = class abstract
  public
    function GetName: string; virtual;
    function GetBeschreibung: string; virtual;
    procedure Ausgeben; virtual;

    procedure Hinzufuegen(AComponent :TSpeisenkarteKomponente);virtual;
    procedure Entfernen(AComponent :TSpeisenkarteKomponente);virtual;
    function GetKind(i:integer) : TSpeisenkarteKomponente; virtual;

    function Components: TMyEnumerator; virtual;
  end;

  // Kompositum
  TSpeisekarte = class(TSpeisenkarteKomponente)
  strict private var
    FComponentList:TList;
  public
    Name, Beschreibung:string;
    constructor Create(iName, iBeschreibung:string);

    function GetName: string; override;
    function GetBeschreibung: string; override;
    procedure Ausgeben; override;

    procedure Hinzufuegen(AComponent :TSpeisenkarteKomponente); override;
    procedure Entfernen(AComponent :TSpeisenkarteKomponente); override;
    function GetKind(i:integer) : TSpeisenkarteKomponente ; override;

    function Components: TMyEnumerator; override;

  end;

  // Blatt
  TSpeise = class(TSpeisenkarteKomponente)
  public
    Name, Beschreibung:string;
    constructor create(iName, iBeschreibung:string);

    function GetName: string; override;
    function GetBeschreibung: string; override;
    procedure Ausgeben; override;
    function Components: TMyEnumerator; override;

  end;


  TMyEnumerator = class
    Values: TList;
    Index: Integer;
  public
    constructor Create(iValues:TList);
    function GetCurrent: TObject;
    function MoveNext: Boolean;
    property Current: TObject read GetCurrent;
  end;


implementation

uses SysUtils, Dialogs;

procedure TSpeisenkarteKomponente.Hinzufuegen(AComponent :TSpeisenkarteKomponente);
begin
  ShowMessage('Fehler auslösen');
end;

function TSpeisenkarteKomponente.Components: TMyEnumerator;
begin
  ShowMessage('Fehler auslösen');
  result := nil;
end;

procedure TSpeisenkarteKomponente.Entfernen(AComponent :TSpeisenkarteKomponente);
begin
  ShowMessage('Fehler auslösen');
end;

function TSpeisenkarteKomponente.GetKind(i:integer) : TSpeisenkarteKomponente;
begin
  ShowMessage('Fehler auslösen');
  result := nil;
end;

procedure TSpeisenkarteKomponente.Ausgeben;
begin
  ShowMessage('Fehler auslösen');
end;

function TSpeisenkarteKomponente.GetBeschreibung: string;
begin
  ShowMessage('Fehler auslösen');
  result := '';
end;

function TSpeisenkarteKomponente.GetName: string;
begin
  ShowMessage('Fehler auslösen');
  result := '';
end;

// ================================================================== //

procedure TSpeisekarte.Ausgeben;
begin
  ShowMessage('Karte: ' + GetName + ', ' + GetBeschreibung);
end;

function TSpeisekarte.Components: TMyEnumerator;
begin
  result := TMyEnumerator.Create(FComponentList);
end;

constructor TSpeisekarte.Create(iName, iBeschreibung:string);
begin
  FComponentList := TList.Create;
  Name := iName;
  Beschreibung := iBeschreibung;
end;

procedure TSpeisekarte.Hinzufuegen(AComponent :TSpeisenkarteKomponente);
begin
  FComponentList.Add(AComponent);
end;

procedure TSpeisekarte.Entfernen(AComponent :TSpeisenkarteKomponente);
begin
  FComponentList.Remove(AComponent);
end;

function TSpeisekarte.GetBeschreibung: string;
begin
  result := Beschreibung;
end;

function TSpeisekarte.GetKind(i:integer) : TSpeisenkarteKomponente;
begin
  result := FComponentList.Items[i];
end;

function TSpeisekarte.GetName: string;
begin
  result := Name;
end;

// ================================================================== //


procedure TSpeise.Ausgeben;
begin
  ShowMessage(GetName + ', ' + GetBeschreibung);
end;

function TSpeise.Components: TMyEnumerator;
begin
  result := nil;
end;

constructor TSpeise.create(iName, iBeschreibung:string);
begin
  Name := iName;
  Beschreibung := Beschreibung;
end;


function TSpeise.GetBeschreibung: string;
begin
  result := Beschreibung;
end;

function TSpeise.GetName: string;
begin
  result := Name;
end;


// ================================================================== //

constructor TMyEnumerator.Create(iValues:TList);
begin
  inherited Create;
  Values := iValues;
  Index := -1;
end;

function TMyEnumerator.MoveNext: Boolean;

   // wie soll ich hier über alles Iterieren???? geht doch nicht so oder??
   procedure Recor(iSpeisekarte : TSpeisekarte);
   var
    iti : TMyEnumerator;
   begin
     iti := iSpeisekarte.Components;
     result := iti.MoveNext;
   end;

begin
  if index + 1 < Values.Count then
    begin
      Inc(Index);
      Result := True;
    end
  else
    Result := False;
end;

function TMyEnumerator.GetCurrent: TObject;
begin
  Result := Values[Index];
end;

Test mit:

Delphi-Quellcode:

var
  Karte2 : TSpeisekarte;
  i : integer;

  iti : TMyEnumerator;

begin

  // Speisekarte 1 erstellen
  Karte := TSpeisekarte.Create('=== Karte 1', 'Hauptspeisen');

  // 5 Speisen auf Karte 1
  for i := 1 to 5 do
    Karte.Hinzufuegen(TSpeise.Create(' Ein Artikel ' + inttostr(i), inttostr(i)));

  // Speisekarte 2 erstellen und zur Karte 1 anfügen
  Karte2 := TSpeisekarte.Create('=== Karte 2', 'Nachspeisen');
  Karte.Hinzufuegen(Karte2);

  // 5 Speisen auf Karte 2
  for i := 1 to 5 do
    Karte2.Hinzufuegen(TSpeise.Create(' Ein Artikel von Karte zwei ' + inttostr(i), inttostr(i)));




  iti := Karte.Components;
  while iti.MoveNext do
    Memo1.Lines.Add(TSpeisenkarteKomponente(iti.GetCurrent).GetName);

end;
Als Ausgabe bekomme ich da dann nur
Ein Artikel 1
Ein Artikel 2
Ein Artikel 3
Ein Artikel 4
Ein Artikel 5
=== Karte 2

was mir auch klar ist.

Wie kann ich aber einen Iterator erstellen, der über den ganzen Baum geht?

== Karte 1
Ein Artikel 1
Ein Artikel 2
Ein Artikel 3
Ein Artikel 4
Ein Artikel 5
=== Karte 2
Ein Artikel von Karte zwei 1
Ein Artikel von Karte zwei 2
Ein Artikel von Karte zwei 3
Ein Artikel von Karte zwei 4
Ein Artikel von Karte zwei 5
...
Grüße

Thomas
  Mit Zitat antworten Zitat