home *** CD-ROM | disk | FTP | other *** search
File List | 1987-11-11 | 3.9 KB | 89 lines |
- (* ------------------------------------------------------------------------- *)
- (* HYPERKEY.LST *)
- (* Operationen fuer die dynamische Listenverwaltung *)
- (* ------------------------------------------------------------------------- *)
- (* fuegt neuen Eintrag in Makro-Liste ein und liefert Erfolgsmeldung: *)
- FUNCTION EntryInserted (VAR ListPtr :ListPtrType) :BOOLEAN;
- CONST Dist = $140; (* "Sicherheitsabstand" zum Stack in Paragraphen *)
- VAR NewEntry :ListPtrType; EnoughHeap :BOOLEAN;
- BEGIN
- EnoughHeap := (MaxAvail < 0) OR ((MaxAvail-Dist)*16.0 > SizeOf(EntryType));
- IF EnoughHeap THEN BEGIN
- New (NewEntry); (* neuen Eintrag erzeugen *)
- WITH NewEntry^ DO BEGIN
- Last := ListPtr;
- IF ListPtr <> NIL THEN BEGIN
- Next := ListPtr^.Next; EntryNr := Succ (Last^.EntryNr);
- IF ListPtr^.Next <> NIL THEN ListPtr^.Next^.Last := NewEntry
- ELSE ListEnd := NewEntry;
- ListPtr^.Next := NewEntry
- END
- ELSE BEGIN
- ListHead := NewEntry; ListEnd := NewEntry;
- Next := NIL; EntryNr := 1;
- END;
- FillChar (Replacement, SizeOf(Replacement), 0);
- Scancode := $FFFF; Active := TRUE
- END;
- ListPtr := NewEntry
- END;
- EntryInserted := EnoughHeap
- END;
- (* Loescht den Eintrag "ListPtr^" aus der Makro-Liste: *)
- PROCEDURE DeleteEntry (VAR ListPtr :ListPtrType);
- VAR DisposePtr :ListPtrType;
- BEGIN
- IF ListPtr <> NIL THEN BEGIN
- DisposePtr := ListPtr; (* Zeiger sichern *)
- WITH ListPtr^ DO
- IF Last = NIL THEN BEGIN (* erster Eintrag? *)
- ListHead := Next;
- IF Next = NIL THEN ListEnd := NIL (* einziger Eintrag? *)
- ELSE Next^.Last := NIL;
- ListPtr := Next
- END
- ELSE BEGIN
- Last^.Next := Next;
- IF Next = NIL THEN BEGIN (* letzter Eintrag? *)
- ListEnd := Last; ListPtr := ListEnd
- END
- ELSE BEGIN
- Next^.Last := Last; ListPtr := Next
- END
- END;
- Dispose (DisposePtr)
- END
- END;
- (* gibt den Listeneintrag "ListPtr^" im HYPERKEY-Arbeitsfenster aus: *)
- PROCEDURE ShowEntry (VAR ListPtr :ListPtrType);
- VAR i,c :INTEGER;
- BEGIN
- Cursor (off); SetColors (Pen, KeyBack); WriteString (14, 3, Space(5));
- WriteString (31, 3, Space(6)); WriteString (50, 3, Space(9));
- IF ListPtr <> NIL THEN
- WITH ListPtr^ DO BEGIN
- IF ListPtr = ListHead THEN EntryNr := 1
- ELSE EntryNr := Succ (Last^.EntryNr); (* Nummer aktualisieren *)
- WriteString (15, 3, NumStr(EntryNr,3));
- WriteString (32, 3, HexWord(Scancode));
- WriteString (51, 3, Status[Ord(Active)])
- END;
- SetColors (Pen, EditBack); WriteString (14, 6, Space(45));
- IF ListPtr <> NIL THEN
- WITH ListPtr^ DO
- FOR i := 1 TO 44 DO
- IF Replacement[0] >= i THEN BEGIN
- c := Lo (Replacement[i]);
- IF c < 32 THEN BEGIN (* Control-Zeichen? *)
- SetColors (AltPen, EditBack);
- WriteString (14+i, 6, Chr(c+64));
- SetColors (Pen, EditBack);
- END
- ELSE WriteString (14+i, 6, Chr(c))
- END;
- SetColors (Pen, InfoBack); WriteString (14, 9, Space( 5));
- WriteString (29, 9, Space( 6)); WriteString (48, 9, Space(11))
- END;
- (* ------------------------------------------------------------------------- *)
- (* HYPERKEY.LST *)
-