AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

System.Collections in Delphi32 einbinden

Ein Thema von GroHae · begonnen am 1. Aug 2007 · letzter Beitrag vom 29. Jan 2008
 
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, 11: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
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:29 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 by Thomas Breitkreuz