UNIT uDListe; (* ******************************************************************** *) (* *) (* K L A S S E : TListe - (Teil-)abstrakte Klasse *) (* -------------------------------------------------------------------- *) (* Version : 2.01 *) (* Autor : (c) S. Spolwig, OSZ-Handel I, 10997 Berlin *) (* *) (* Aufgabe : Allgemeine dynamische Liste zur Verwaltung beliebiger*) (* Daten-Objekte. *) (* uDListe ist schnittstellen-kompatibel mit uSListe. *) (* Zum Bewegen in der Liste ist intern eine Listenmarke *) (* mitgefuehrt, die die jeweils aktuelle Listenposition *) (* bezeichnet. Alle Operationen werden auf der aktuellen*) (* Position ausgefuehrt. *) (* In abgeleiteten Klassen sollte der Elemententyp de- *) (* klariert und die abstrakten Methoden Load, Store und *) (* SearchElement überschrieben werden. *) (* *) (* Compiler : Delphi 4.0 *) (* Aenderung : 2.01 - 13-OKT-00 IsFull entfernt *) (* ******************************************************************** *)
INTERFACE (* ==================================================================== *) type TListe = class (TObject) protected Kollektion : array of Pointer; Listenlaenge, // Anzahl der belegten Elemente AktuellePos : integer; // auf aktivem Element oder EoList
public constructor Create; virtual; procedure Init; virtual;
procedure First; virtual; procedure Next; virtual; procedure previous; virtual; procedure Last; virtual;
function GetElement: pointer; virtual; procedure SetElement (Elem : pointer); virtual; procedure Append (Elem : pointer); virtual; procedure Remove; virtual; procedure RemoveAll; virtual; function GetLen : integer ; virtual; function GetAktuellePos : integer; virtual; function EoList : boolean; virtual; function IsFirst : boolean; virtual; function IsLast : boolean; virtual; function IsEmpty : boolean; virtual; function SearchElement (suchElem : pointer) : pointer; virtual; //abstrakt procedure Load (Dateiname : string); virtual; //abstrakt procedure Store(Dateiname : string); virtual; //abstrakt end;
(* ----------------- B e s c h r e i b u n g -------------------------
Oberklasse : TObject Bezugsklassen : -
Methoden --------
Create Auftrag : Leere L. erzeugen vorher : - nachher : ListenLaenge ist Null, AktuellePos ist 0.
Init Auftrag : L. initial. vorher : L. ist vorhanden nachher : ListenLaenge ist Null, AktuellePos ist 0.
First Auftrag : Listenmarke auf das 1. (vorhandene) Element setzen vorher : Die Liste ist nicht leer nachher : Aktuelle Position ist 1. Ist die Liste leer , geschieht nichts
Next Auftrag : Die Listenmarke auf das naechste Element setzen. vorher : Die Liste ist nicht leer und akt. Pos ist nicht letztes El. nachher : Die Marke steht auf der neuen aktuellen Position ist die Liste leer oder EoList erreicht, geschieht nichts.
Previous Auftrag : Die Listenmarke um eins auf das vorhergehende Element zuruecksetzen vorher : Die Liste ist nicht leer und akt. Pos ist nicht 1. Element. nachher : Die Marke steht auf der neuen aktuellen Position. Ist die Liste leer oder die aktuelle Position war 1, geschieht nichts.
Last Auftrag : Listenmarke auf das letzte Element der Liste setzen vorher : Die Liste ist nicht leer. nachher : Letztes vorhandenes Element ist aktuelle Position
GetElement Anfrage : Zugriff auf das aktuelle Element zum Lesen vorher : Die Liste ist nicht leer. nachher : GetElement liefert das aktuelle Element.
SetElement (Elem : Pointer) Auftrag : Zugriff auf die aktuelle Position zum Schreiben vorher : Die Liste ist initialisiert. nachher : Elem ist an aktueller Position uebergeben
Append (Elem : Pointer) Auftrag : Neues Element an das Ende der Liste anhaengen. Wenn die Liste leer war, ist das neue El. das erste. vorher : Die Liste ist initialisiert nachher : Listenlaenge ist um eins erhoeht. Ist die Liste voll, geschieht nichts.
Remove Auftrag: Das aktuelle Element loeschen. vorher : Die Liste ist nicht leer. nachher: Das aktuelle Element ist aus der Liste entfernt. Die Listen- laenge ist um eins vermindert. AktuellePos ist 0.
RemoveAll Auftrag: Alle Elemente aus der Liste entfernen vorher : - nachher: Die Liste ist leer. AktuellePosition ist 0.
EoList Anfrage: ob das Ende der Liste erreicht ist. vorher : Die Liste ist initialisiert. nachher: True, wenn Ende der Liste erreicht ist. Die Listenmarke steht hinter dem letzten belegten Element.
IsEmpty Anfrage: ob Liste leer ist vorher : Die Liste ist initialisiert. nachher: True, wenn die Liste leer ist.
GetLen Anfrage: gibt Listenlaenge zurueck vorher : Liste ist initialisiert nachher: -
SearchElement (suchElem : Pointer) : Pointer; Anfrage: ob suchElem in der Liste gefunden wurde vorher : - nachher: Gefundenes Element wird zurückgegeben. Wenn Liste leer ist oder nicht gefunden, wird EoList zurückgegeben.
Load (dateiname : string); Auftrag: Liste aus externer Datei laden. Wenn keine Datei existiert, dann neue Datei mit der Laenge 0 anlegen. vorher : Die Liste ist initialisiert. nachher: Die Liste ist in den Arbeitsspeicher geladen. Datei ist geschlossen.
Store (dateiname : string); Auftrag: Liste in externe Datei speichern vorher : - nachher: Die Liste ist gespeichert. Ist die Liste leer, wird nichts gespeichert. Datei ist geschlossen.
----------------------------------------------------------------------- *)
IMPLEMENTATION (* ==================================================================== *)
constructor TListe.Create; (* -------------------------------------------------------------------- *) begin inherited Create; Init; end;
procedure TListe.Init; (* -------------------------------------------------------------------- *) var i : integer; begin Kollektion := NIL; setlength(kollektion,2); for i := 0 to 1 do begin Kollektion[i] := NIL; end; Listenlaenge := 0; AktuellePos := 0; end;
procedure TListe.First; (* -------------------------------------------------------------------- *) begin If NOT IsEmpty then AktuellePos := 1; end;
procedure TListe.Next; (* -------------------------------------------------------------------- *) Begin if NOT (IsEmpty OR IsLast) // EoList then AktuellePos := AktuellePos + 1; end;
procedure TListe.Previous; (* -------------------------------------------------------------------- *) begin if NOT (IsEmpty or IsFirst) then AktuellePos := AktuellePos - 1; end;
procedure TListe.Last; (* -------------------------------------------------------------------- *) begin if NOT (IsEmpty) then AktuellePos := ListenLaenge ; end;
function TListe.GetElement : pointer; (* -------------------------------------------------------------------- *) begin Result := Kollektion[AktuellePos]; end;
procedure TListe.SetElement (Elem : pointer); (* -------------------------------------------------------------------- *) begin Kollektion[AktuellePos] := Elem; end;
procedure TListe.Append (Elem : pointer); (* -------------------------------------------------------------------- *) begin AktuellePos := Listenlaenge + 1; SetElement(Elem); inc (Listenlaenge); setlength(kollektion,Listenlaenge + 2); kollektion[high(kollektion)] := NIL; end;
procedure TListe.Remove; (* -------------------------------------------------------------------- *) var i : Cardinal;
begin if NOT IsEmpty then begin for i := aktuellepos to Listenlaenge do Kollektion[i] := Kollektion[i+1];
dec(Listenlaenge); Setlength(Kollektion,Listenlaenge+ 2); AktuellePos := 0; end; end; (* remove *)
procedure TListe.RemoveAll; (* -------------------------------------------------------------------- *) begin if NOT IsEmpty then Init; // der Schrott bleibt im Speicher end;
function TListe.GetLen : integer ; (* -------------------------------------------------------------------- *) begin Result := Listenlaenge; end;
function TListe.GetAktuellePos : integer; (* -------------------------------------------------------------------- *) begin Result := AktuellePos; end;
function TListe.EoList : boolean; (* -------------------------------------------------------------------- *) begin if Kollektion[AktuellePos] = NIL then Result := true else Result := false; end;
function TListe.IsFirst : boolean; (* -------------------------------------------------------------------- *) begin if AktuellePos = 1 then Result := true else Result := false; end;
function TListe.IsLast : boolean; (* -------------------------------------------------------------------- *) begin if AktuellePos = Listenlaenge then Result := true else Result := false; end;
function TListe.IsEmpty : boolean ; (* -------------------------------------------------------------------- *) begin Result := false; if Listenlaenge = 0 then Result := true; end;
function TListe.SearchElement (suchElem : pointer) : pointer; (* -------------------------------------------------------------------- *) begin result := NIL; end;
procedure TListe.Load (Dateiname : string); (* -------------------------------------------------------------------- *) begin end;
procedure TListe.Store(Dateiname : string); (* -------------------------------------------------------------------- *) begin end;
END.
|