home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1991 / 06 / tricks / position.pas < prev    next >
Pascal/Delphi Source File  |  1991-03-19  |  4KB  |  116 lines

  1. (* ------------------------------------------------------ *)
  2. (*                    POSITION.PAS                        *)
  3. (*          (c) 1991 Martin Wölker & TOOLBOX              *)
  4. (* ------------------------------------------------------ *)
  5. UNIT Position;
  6.  
  7. INTERFACE
  8.  
  9. USES Crt;
  10.  
  11. CONST
  12.   modul_name = 'Position';
  13.   Version    = '1.0';
  14.   date       = '11-28-1990';
  15.  
  16. TYPE
  17.   listentyp = (fifo, stack);          { Struktur der Liste }
  18.             {    │     └─────  Keller Struktur             }
  19.             {    └───────────  first in first out Struktur }
  20.  
  21. CONST
  22.   liste_ist : listentyp = stack;      { default Listentyp  }
  23.             { der Anwender kann diesen Typ ändern          }
  24.   liste_weg : BOOLEAN = TRUE;        { defaultmäßiges      }
  25.             { Löschen restaurierter Listenelemente         }
  26.  
  27.   PROCEDURE save_position;              { sichert die      }
  28.             { aktuelle Cursorposition in einer Liste.      }
  29.   PROCEDURE restore_position;           { restauriert die  }
  30.             { gesicherte Poistion entweder nach der        }
  31.             { Variablen listentyp = fifo  --> vorwärts     }
  32.             {                       stack --> rückwärts    }
  33.  
  34. IMPLEMENTATION
  35.  
  36. TYPE
  37.   cursor_ptr = ^cursor_pos;           { Zeiger auf Element }
  38.   cursor_pos = RECORD                 { Definition eines   }
  39.                  xpos : BYTE;         { Elements der Liste }
  40.                  ypos : BYTE;         { Die Verkettung ist }
  41.                  next : cursor_ptr;   { vorwärts und       }
  42.                  prev : cursor_ptr;   { rückwärts.         }
  43.                  Attr : BYTE;         { Attribut           }
  44.                END;
  45.  
  46. VAR                                   { Zeiger auf         }
  47.   last_cursor : cursor_ptr;           { den Anfang und     }
  48.   top_cursor  : cursor_ptr;           { das Ende           }
  49.                                       { der Liste          }
  50.  
  51.   PROCEDURE save_position;
  52.   { Baut eine Liste mit Cursorpositionen auf }
  53.   VAR
  54.     c : cursor_ptr;
  55.   BEGIN
  56.     New(c);
  57.     WITH c^ DO BEGIN
  58.       xpos := WhereX;
  59.       ypos := WhereY;
  60.       Attr := TextAttr;
  61.       prev := last_cursor;
  62.       next := NIL;
  63.     END;
  64.     IF last_cursor = NIL THEN
  65.       top_cursor := c
  66.     ELSE
  67.       last_cursor^.next := c;
  68.     last_cursor := c;
  69.   END;
  70.  
  71.   PROCEDURE restore_position;
  72.   VAR
  73.     c : cursor_ptr;
  74.   BEGIN
  75.     IF liste_ist = stack THEN BEGIN
  76.       IF last_cursor <> NIL THEN BEGIN
  77.         c := last_cursor;
  78.         WITH c^ DO Crt.GotoXY(xpos, ypos);
  79.         TextAttr          := c^.Attr;
  80.         last_cursor       := c^.prev;
  81.         last_cursor^.next := NIL;
  82.         IF liste_weg THEN
  83.           Dispose(c)
  84.         ELSE BEGIN
  85.           top_cursor^.prev := c;
  86.           c^.next    := top_cursor;
  87.           c^.prev    := NIL;
  88.           top_cursor := c;
  89.         END;
  90.         IF last_cursor = NIL THEN top_cursor := NIL;
  91.       END;
  92.     END ELSE IF top_cursor <> NIL THEN BEGIN
  93.       c := top_cursor;
  94.       WITH c^ DO Crt.GotoXY(xpos, ypos);
  95.       TextAttr         := c^.Attr;
  96.       top_cursor       := c^.next;
  97.       top_cursor^.prev := NIL;
  98.       IF liste_weg THEN
  99.         Dispose(c)
  100.       ELSE BEGIN
  101.         last_cursor^.next:=c;
  102.         c^.prev     := last_cursor;
  103.         c^.next     := NIL;
  104.         last_cursor := c;
  105.       END;
  106.       IF top_cursor = NIL THEN last_cursor := NIL;
  107.     END;
  108.   END;
  109.  
  110. BEGIN
  111.   last_cursor := NIL;
  112.   top_cursor  := NIL;
  113. END.
  114. (* ------------------------------------------------------ *)
  115. (*                    POSITION.PAS                        *)
  116.