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