home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1987 / 09 / grafik6 / listhand.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1987-07-06  |  3.9 KB  |  149 lines

  1. (*-------------------------------------------------------------------------*)
  2. (*                             LISTHAND.PAS                                *)
  3. (*   Routinen zum Listenhandling fuer die "Display-Files" der Grafikserie  *)
  4. (*-------------------------------------------------------------------------*)
  5. (*                  Laenge eines Display-Files                             *)
  6.  
  7. FUNCTION DispFileLen(Zeiger : tDFEintragP) : INTEGER;
  8.  
  9. VAR n : INTEGER;
  10.  
  11. BEGIN
  12.   n := 1;
  13.   WHILE Zeiger^.next <> NIL DO BEGIN
  14.     n := Succ(n);
  15.     Zeiger := Zeiger^.next;
  16.   END;
  17.   DispFileLen := n;
  18. END;
  19.  
  20. (*-------------------------------------------------------------------------*)
  21. (*                  Komplettes Display-File loeschen:                      *)
  22.  
  23. PROCEDURE DeleteList(VAR Zeiger : tDFEintragP);
  24.  
  25. VAR Alt : tDFEintragP;
  26.  
  27. BEGIN
  28.   WHILE Zeiger <> NIL DO BEGIN
  29.     Alt := Zeiger;
  30.     Zeiger := Zeiger^.next;
  31.     Dispose(Alt);
  32.   END
  33. END;
  34.  
  35. (*-------------------------------------------------------------------------*)
  36. (*                  Display-File teilweise loeschen:                       *)
  37.  
  38. PROCEDURE DelListPart(von, bis : INTEGER; VAR Zeiger : tDFEintragP);
  39.  
  40. VAR HilfP, Last, Temp : tDFEintragP;
  41.     i : INTEGER;
  42.  
  43. BEGIN
  44.   IF von < 1 THEN
  45.     von := 1;
  46.   IF bis > DispFileLen(Zeiger) THEN
  47.     bis := DispFileLen(Zeiger);
  48.   IF von > bis THEN
  49.     von := bis;
  50.   i := 1;
  51.   HilfP := Zeiger;
  52.   Last := NIL;
  53.   (* Erste "Schnittstelle" suchen *)
  54.   WHILE i < von DO BEGIN
  55.     Last := HilfP;
  56.     HilfP := HilfP^.next;
  57.     i := Succ(i);
  58.   END;
  59.   (* Elemente bis zur zweiten "Schnittstelle" entfernen *)
  60.   WHILE i <= bis DO BEGIN
  61.     Temp := HilfP;
  62.     HilfP := HilfP^.next;
  63.     Dispose(Temp);
  64.     i := Succ(i);
  65.   END;
  66.   (* Wieder verketten *)
  67.   IF Last = NIL THEN
  68.     Zeiger := HilfP
  69.   ELSE
  70.     Last^.next := HilfP;
  71. END;
  72.  
  73. (*-------------------------------------------------------------------------*)
  74. (*             Eingabe-Display-File-Array zur Liste konvertieren           *)
  75.  
  76. PROCEDURE Array_List(Feld : tDFArray; VAR Zeiger : tDFEintragP);
  77.  
  78. VAR i : INTEGER;
  79.     HilfP, LastP : tDFEintragP;
  80.  
  81. BEGIN
  82.   New(Zeiger);
  83.   Zeiger^ := Feld[1];
  84.   LastP := Zeiger;
  85.   i := 2;
  86.   WHILE Feld[i-1].Kommando <> EoDF DO BEGIN
  87.     New(HilfP);
  88.     HilfP^:= Feld[i];
  89.     i := Succ(i);
  90.     LastP^.next := HilfP;
  91.     LastP := HilfP;
  92.   END;
  93.   LastP^.next := NIL
  94. END;
  95.  
  96.  
  97. (*-------------------------------------------------------------------------*)
  98. (* Eingabe-Display-File-Array in Liste VOR Position "wo" einfuegen         *)
  99.  
  100. PROCEDURE InsertArrayInList(Feld : tDFArray; wo : INTEGER;
  101.                             VAR Zeiger : tDFEintragP);
  102.  
  103. VAR i : tDFArrayInd;
  104.     HilfP1, LPos, Last, InsLast, PrevInsLast : tDFEintragP;
  105.  
  106. BEGIN
  107.   IF wo < 1 THEN
  108.     wo := 1;
  109.   IF wo > DispFileLen(Zeiger) THEN (* Am Ende anhaengen *)
  110.     wo := DispFileLen(Zeiger) + 1 ;
  111.   Array_List(Feld,HilfP1);   (* Liste des einzufuegenden Array erzeugen *)
  112.  
  113.   (* Position in der Originalliste suchen *)
  114.   i := 1;
  115.   LPos := Zeiger;
  116.   Last := NIL;
  117.   WHILE i < wo DO BEGIN
  118.     Last := LPos;
  119.     LPos := LPos^.next;
  120.     i := Succ(i);
  121.   END;
  122.  
  123.   (* Ende der einzufuegenden Liste suchen *)
  124.   InsLast := HilfP1;
  125.   PrevInsLast := NIL;
  126.   FOR i := 1 TO DispFileLen(HilfP1) - 1 DO BEGIN
  127.     PrevInsLast := InsLast;
  128.     InsLast := InsLast^.next;
  129.   END;
  130.  
  131.   IF LPos^.next = NIL THEN BEGIN (* Hinten anhaengen *)
  132.     Dispose(LPos);
  133.     Last^.next := HilfP1;
  134.   END
  135.   ELSE BEGIN (* Vorne oder in der Mitte einfuegen *)
  136.     Dispose(InsLast);
  137.     IF Last = NIL THEN BEGIN (* Vorne einfuegen *)
  138.       PrevInsLast^.next := Zeiger;
  139.       Zeiger := HilfP1;
  140.     END
  141.     ELSE BEGIN
  142.       Last^.next := HilfP1;
  143.       PrevInsLast^.next := LPos;
  144.     END;
  145.   END;
  146. END;
  147. (*-------------------------------------------------------------------------*)
  148. (*                         Ende von LISTHAND.PAS                           *)
  149.