home *** CD-ROM | disk | FTP | other *** search
- (*-------------------------------------------------------------------------*)
- (* LISTHAND.PAS *)
- (* Routinen zum Listenhandling fuer die "Display-Files" der Grafikserie *)
- (*-------------------------------------------------------------------------*)
- (* Laenge eines Display-Files *)
-
- FUNCTION DispFileLen(Zeiger : tDFEintragP) : INTEGER;
-
- VAR n : INTEGER;
-
- BEGIN
- n := 1;
- WHILE Zeiger^.next <> NIL DO BEGIN
- n := Succ(n);
- Zeiger := Zeiger^.next;
- END;
- DispFileLen := n;
- END;
-
- (*-------------------------------------------------------------------------*)
- (* Komplettes Display-File loeschen: *)
-
- PROCEDURE DeleteList(VAR Zeiger : tDFEintragP);
-
- VAR Alt : tDFEintragP;
-
- BEGIN
- WHILE Zeiger <> NIL DO BEGIN
- Alt := Zeiger;
- Zeiger := Zeiger^.next;
- Dispose(Alt);
- END
- END;
-
- (*-------------------------------------------------------------------------*)
- (* Display-File teilweise loeschen: *)
-
- PROCEDURE DelListPart(von, bis : INTEGER; VAR Zeiger : tDFEintragP);
-
- VAR HilfP, Last, Temp : tDFEintragP;
- i : INTEGER;
-
- BEGIN
- IF von < 1 THEN
- von := 1;
- IF bis > DispFileLen(Zeiger) THEN
- bis := DispFileLen(Zeiger);
- IF von > bis THEN
- von := bis;
- i := 1;
- HilfP := Zeiger;
- Last := NIL;
- (* Erste "Schnittstelle" suchen *)
- WHILE i < von DO BEGIN
- Last := HilfP;
- HilfP := HilfP^.next;
- i := Succ(i);
- END;
- (* Elemente bis zur zweiten "Schnittstelle" entfernen *)
- WHILE i <= bis DO BEGIN
- Temp := HilfP;
- HilfP := HilfP^.next;
- Dispose(Temp);
- i := Succ(i);
- END;
- (* Wieder verketten *)
- IF Last = NIL THEN
- Zeiger := HilfP
- ELSE
- Last^.next := HilfP;
- END;
-
- (*-------------------------------------------------------------------------*)
- (* Eingabe-Display-File-Array zur Liste konvertieren *)
-
- PROCEDURE Array_List(Feld : tDFArray; VAR Zeiger : tDFEintragP);
-
- VAR i : INTEGER;
- HilfP, LastP : tDFEintragP;
-
- BEGIN
- New(Zeiger);
- Zeiger^ := Feld[1];
- LastP := Zeiger;
- i := 2;
- WHILE Feld[i-1].Kommando <> EoDF DO BEGIN
- New(HilfP);
- HilfP^:= Feld[i];
- i := Succ(i);
- LastP^.next := HilfP;
- LastP := HilfP;
- END;
- LastP^.next := NIL
- END;
-
-
- (*-------------------------------------------------------------------------*)
- (* Eingabe-Display-File-Array in Liste VOR Position "wo" einfuegen *)
-
- PROCEDURE InsertArrayInList(Feld : tDFArray; wo : INTEGER;
- VAR Zeiger : tDFEintragP);
-
- VAR i : tDFArrayInd;
- HilfP1, LPos, Last, InsLast, PrevInsLast : tDFEintragP;
-
- BEGIN
- IF wo < 1 THEN
- wo := 1;
- IF wo > DispFileLen(Zeiger) THEN (* Am Ende anhaengen *)
- wo := DispFileLen(Zeiger) + 1 ;
- Array_List(Feld,HilfP1); (* Liste des einzufuegenden Array erzeugen *)
-
- (* Position in der Originalliste suchen *)
- i := 1;
- LPos := Zeiger;
- Last := NIL;
- WHILE i < wo DO BEGIN
- Last := LPos;
- LPos := LPos^.next;
- i := Succ(i);
- END;
-
- (* Ende der einzufuegenden Liste suchen *)
- InsLast := HilfP1;
- PrevInsLast := NIL;
- FOR i := 1 TO DispFileLen(HilfP1) - 1 DO BEGIN
- PrevInsLast := InsLast;
- InsLast := InsLast^.next;
- END;
-
- IF LPos^.next = NIL THEN BEGIN (* Hinten anhaengen *)
- Dispose(LPos);
- Last^.next := HilfP1;
- END
- ELSE BEGIN (* Vorne oder in der Mitte einfuegen *)
- Dispose(InsLast);
- IF Last = NIL THEN BEGIN (* Vorne einfuegen *)
- PrevInsLast^.next := Zeiger;
- Zeiger := HilfP1;
- END
- ELSE BEGIN
- Last^.next := HilfP1;
- PrevInsLast^.next := LPos;
- END;
- END;
- END;
- (*-------------------------------------------------------------------------*)
- (* Ende von LISTHAND.PAS *)
-