Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - OOP Liste Vorgänger


Pr0g3r - Mi 01.09.10 12:17
Titel: OOP Liste Vorgänger
Hallo alle zusammen.
Ich habe folgendes Problem: Ich habe mit OOP ein Listenelement programmiert, welches sich selbst verwaltet.
Nun möchte ich gerne, dass die Liste ihren Vorgänger kennt.
Hat irgendjemand eine idee, wie man das bewerkstelligen kann?

//edit: Ich weiss, die Katerogie ist falsch...


Moderiert von user profile iconNarses: Topic aus Internet / Netzwerk verschoben am Mi 01.09.2010 um 12:23


elundril - Mi 01.09.10 12:21

Indem du eine Referenz auf das Objekt in der Liste vorher reinschmeißt. ;)

lg elundril


Pr0g3r - Mi 01.09.10 12:29

Vielleicht noch mal zum Verständnis:
Das Listenelement created sich selbst noch mal um ein neues Element dranzumachen.
Für den Vorgänger müsste man sich also selbst mitgeben. Wie geht das?


Nersgatt - Mi 01.09.10 13:12

Indem man beim erstellen eine Referenz auf Self übergibt? Oder hab ich die Frage nicht verstanden?


Pr0g3r - Mo 06.09.10 16:50

also

next := Liste.Create(self); ?


elundril - Mo 06.09.10 18:06

Wir wissen leider nicht wie du deine liste ausprogrammiert hast. Insofern können wir dir auch keinen konkreten Code liefern.

lg elundril


Pr0g3r - Di 07.09.10 11:13

die Liste habe ich wie folgt deklariert:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
type
  TListe = class

  protected
   zInhalt: TObject;
   znext: TListe;
   zprev: Tliste;

 public
   constructor create(plast: TListe; pInhalt: TObject);
[...]

ALso müsste ich den constructor so aufrufen:

next := znext := TListe.Create(self,pInhalt); ?

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt


Nersgatt - Di 07.09.10 11:24

Probiers doch mal aus. :roll:


martin300 - Di 07.09.10 11:56

Hallo,
dein Konzept ist sehr eigenartig. Aber wenn ich es machen würde, dann hätte ich eine Klasse Liste (die kann die Liste verwalten, dh. Einträge hinzufügen, löschen, speichern) und dann noch eine Klasse Eintrag (dort steht der zu speichernde Eintrag, oder was auch immer). Dann erzeuge ich die Liste und beliebig viele Einträge die hinzugefügt werden.


Nait - Di 07.09.10 21:48

Ah, ein ähnliches Problem hatte ich auch letztens. Ich bin zwar neu in der OOP, habe aber ein effektives Verfahren aus der strukturierten Programmierung angewandt und es funktioniert bei meinen Klassen. Dort kannst du zB einem record-Typ nicht sich selbst als Eigenschaft mitgeben, sondern musst vorher einen Pointer vereinbaren. Bei dir sehe das also so aus:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
type
  PTListe = ^TListe; //Zeiger auf eine TListe
  TListe = class

  protected
    zInhalt: TObject;
    znext: PTListe;
    zprev: PTliste;

  public
    constructor Create(plast: PTListe; pInhalt: TObject);
  [...]
end;{class.TListe}

var
  ListenAnfang, ListenEnde: PTListe;

Konstruktor entsprechend:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
constructor TListe.Create(plast: PTListe; pInhalt: TObject);
begin
  zInhalt:= pInhalt; //Inhalt übernehmen
  zprev:= plast; //auf vorherigen zeigen
  New(znext); //initialisiert Pointer für nächsten
  znext^.Create(zprev^.znext, zInhalt);
    //zprev^.znext ist DIESER Zeiger, der ja dann der vorherige ist
end;{constructor.TListe.Create}

So wie es jetzt ist, wirds natürlich ne Endlosschleife, also noch nen globalen Zähler mit einfügen. Und das Create-Ereignis im Create muss in ein if-then, für das erste Element (weil das kein vorheriges hat). Ähnlich ist auf das letzte Element zu achten.

Persönlicher Tipp: es existiert bereits TList und da ist schon alles wichtige drin


Pr0g3r - Mi 08.09.10 12:11

hat sich erledigt.
Das mit dem self hat geklappt, ich konnte es nur nicht ausprobieren, da das ganze Zeug auf dem Schulserver vergammelt...

Trotzdem Danke