home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* POSITION.PAS *)
- (* (c) 1991 Martin Wölker & TOOLBOX *)
- (* ------------------------------------------------------ *)
- UNIT Position;
-
- INTERFACE
-
- USES Crt;
-
- CONST
- modul_name = 'Position';
- Version = '1.0';
- date = '11-28-1990';
-
- TYPE
- listentyp = (fifo, stack); { Struktur der Liste }
- { │ └───── Keller Struktur }
- { └─────────── first in first out Struktur }
-
- CONST
- liste_ist : listentyp = stack; { default Listentyp }
- { der Anwender kann diesen Typ ändern }
- liste_weg : BOOLEAN = TRUE; { defaultmäßiges }
- { Löschen restaurierter Listenelemente }
-
- PROCEDURE save_position; { sichert die }
- { aktuelle Cursorposition in einer Liste. }
- PROCEDURE restore_position; { restauriert die }
- { gesicherte Poistion entweder nach der }
- { Variablen listentyp = fifo --> vorwärts }
- { stack --> rückwärts }
-
- IMPLEMENTATION
-
- TYPE
- cursor_ptr = ^cursor_pos; { Zeiger auf Element }
- cursor_pos = RECORD { Definition eines }
- xpos : BYTE; { Elements der Liste }
- ypos : BYTE; { Die Verkettung ist }
- next : cursor_ptr; { vorwärts und }
- prev : cursor_ptr; { rückwärts. }
- Attr : BYTE; { Attribut }
- END;
-
- VAR { Zeiger auf }
- last_cursor : cursor_ptr; { den Anfang und }
- top_cursor : cursor_ptr; { das Ende }
- { der Liste }
-
- PROCEDURE save_position;
- { Baut eine Liste mit Cursorpositionen auf }
- VAR
- c : cursor_ptr;
- BEGIN
- New(c);
- WITH c^ DO BEGIN
- xpos := WhereX;
- ypos := WhereY;
- Attr := TextAttr;
- prev := last_cursor;
- next := NIL;
- END;
- IF last_cursor = NIL THEN
- top_cursor := c
- ELSE
- last_cursor^.next := c;
- last_cursor := c;
- END;
-
- PROCEDURE restore_position;
- VAR
- c : cursor_ptr;
- BEGIN
- IF liste_ist = stack THEN BEGIN
- IF last_cursor <> NIL THEN BEGIN
- c := last_cursor;
- WITH c^ DO Crt.GotoXY(xpos, ypos);
- TextAttr := c^.Attr;
- last_cursor := c^.prev;
- last_cursor^.next := NIL;
- IF liste_weg THEN
- Dispose(c)
- ELSE BEGIN
- top_cursor^.prev := c;
- c^.next := top_cursor;
- c^.prev := NIL;
- top_cursor := c;
- END;
- IF last_cursor = NIL THEN top_cursor := NIL;
- END;
- END ELSE IF top_cursor <> NIL THEN BEGIN
- c := top_cursor;
- WITH c^ DO Crt.GotoXY(xpos, ypos);
- TextAttr := c^.Attr;
- top_cursor := c^.next;
- top_cursor^.prev := NIL;
- IF liste_weg THEN
- Dispose(c)
- ELSE BEGIN
- last_cursor^.next:=c;
- c^.prev := last_cursor;
- c^.next := NIL;
- last_cursor := c;
- END;
- IF top_cursor = NIL THEN last_cursor := NIL;
- END;
- END;
-
- BEGIN
- last_cursor := NIL;
- top_cursor := NIL;
- END.
- (* ------------------------------------------------------ *)
- (* POSITION.PAS *)