home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------------------------- *)
- (* HYPERKEY.EDT *)
- (* Modul zum Editieren eines Eintrags der Makro-Liste *)
- (* ------------------------------------------------------------------------- *)
- PROCEDURE EditEntry (VAR ListPtr :ListPtrType);
- VAR Quit, InsMode, NewEntry, Replace :BOOLEAN;
- i, (* Cursor-Position im m-Array *)
- j, (* Cursor-Position im Editfeld *)
- k, Key, Code :INTEGER;
- m :MacroType;
- Len :INTEGER ABSOLUTE m; (* m[0], die "Laenge" von m *)
- DummyPtr :ListPtrType;
- MacroStr :StringType; (* String fuer Uebergabe an ANSI *)
-
- (* holt den Scancode der mit einem Makro zu belegenden Taste: *)
- PROCEDURE GetScanCode (VAR ListPtr :ListPtrType; VAR Key :INTEGER);
- VAR DummyPtr :ListPtrType; found :BOOLEAN;
- BEGIN
- CursorShape (Line);
- REPEAT
- MenuLine ('Bitte zu belegende Taste druecken .....');
- GetKey (Key); DummyPtr := ListHead; found := FALSE;
- WHILE (DummyPtr <> NIL) AND NOT found DO
- WITH DummyPtr^ DO BEGIN
- found := (Scancode = Key) AND (DummyPtr <> ListPtr);
- DummyPtr := Next
- END;
- IF found THEN ErrorMsg (2)
- ELSE (* HYPERKEY-Taste ist verboten: *)
- IF Hi(Key) = TSR_Char THEN ErrorMsg (3)
- UNTIL NOT found AND (Hi(Key) <> TSR_Char);
- CursorShape (ShapeType(InsMode));
- MenuLine (EditMenu); SetColors (Pen, KeyBack);
- WITH ListPtr^ DO BEGIN
- WriteString (15, 3, NumStr(EntryNr,3));
- WriteString (32, 3, HexWord(Key));
- WriteString (51, 3, Status[Ord(Active)])
- END
- END;
- (* fuegt den Scancode einer gedrueckten Taste zum Makro-Array m hinzu: *)
- PROCEDURE AddKey (Key :INTEGER);
- BEGIN
- IF InsMode THEN (* Einfuege-Modus *)
- IF Len < MaxMacroLen THEN BEGIN
- IF i <> Succ(Len) THEN Move (m[i], m[Succ(i)], Succ(Len-i) SHL 1);
- m[i] := Key; Len := Succ (Len); i := Succ (i);
- IF j < 44 THEN j := Succ (j)
- END
- ELSE
- ELSE (* Ueberschreib-Modus *)
- IF i = Succ(Len) THEN
- IF Len < MaxMacroLen THEN BEGIN
- m[i] := Key; Len := Succ (Len); i := Succ (i);
- IF j < 44 THEN j := Succ (j)
- END
- ELSE
- ELSE BEGIN
- m[i] := Key; i := Succ (i);
- IF j < 44 THEN j := Succ (j)
- END
- END;
- (* schreibt den aktuellen Ausschnitt des Makro-Strings ins Editierfeld: *)
- PROCEDURE WriteEditField;
- VAR p,k,c :INTEGER; CurCode :STRING[4]; CurChar :STRING[9];
- BEGIN
- SetColors (Pen, EditBack);
- FOR k:=1 TO 44 DO BEGIN
- p := i - j + k;
- IF p <= Len THEN BEGIN
- c := Lo (m[p]);
- IF c < 32 THEN BEGIN (* Control-Zeichen? *)
- SetColors (AltPen, EditBack); WriteString (14+k, 6, Chr(c+64));
- SetColors (Pen, EditBack)
- END
- ELSE WriteString (14+k, 6, Chr(c))
- END
- ELSE WriteString (14+k, 6, ' ')
- END;
- SetCursor (14+j, 6);
- IF i > Len THEN k := Pred (i)
- ELSE k := i;
- SetColors (Pen, InfoBack);
- IF Len <> 0 THEN BEGIN
- CurCode := HexWord (m[k]);
- CurChar := HexByte(Lo(m[k])) + 'h (' + NumStr(Lo(m[k]),3) + ')'
- END
- ELSE BEGIN CurCode := Space (4); CurChar := Space (9) END;
- WriteString (15, 9, NumStr(i,3));
- WriteString (30, 9, CurCode); WriteString (49, 9, CurChar)
- END;
-
- BEGIN (* EditEntry *)
- InsMode := TRUE; (* defaultmaessig Einfuege-Modus an *)
- WITH ListPtr^ DO BEGIN
- NewEntry := (Scancode = $FFFF); (* neuer Eintrag? *)
- IF NewEntry THEN BEGIN
- DummyPtr := NIL; ShowEntry (DummyPtr); (* alle Fensterchen loeschen *)
- GetScanCode (ListPtr, Code)
- END
- ELSE Code := Scancode;
- m := Replacement
- END;
- MenuLine (EditMenu); Quit := FALSE; CursorShape (ShapeType(InsMode));
- i := 1; j := 1;
- REPEAT
- WriteEditField; GetKey (Key);
- IF ScrollLock THEN AddKey (Key) (* ist Sonderzeichen-Eingabe aktiv? *)
- ELSE
- CASE Key OF
- Left: IF i > 1 THEN BEGIN (* Cursor ein Zeichen nach links *)
- i := Pred (i); IF j > 1 THEN j := Pred (j)
- END;
- Right: IF i <= Len THEN BEGIN (* ... und nach rechts *)
- i := Succ (i); IF j < 44 THEN j := Succ (j)
- END;
- Home: BEGIN i := 1; j := 1; END; (* Cursor an Zeilenanfang *)
- End_: BEGIN (* Cursor ans Zeilenende *)
- i := Succ (Len); IF i > 44 THEN j := 44 ELSE j := i
- END;
- Delete: IF i <= Len THEN BEGIN (* Zeichen u. Cursor loeschen *)
- IF i <> Len THEN Move(m[Succ(i)],m[i],(Len-i) SHL 1);
- Len := Pred (Len)
- END;
- Clear: IF i > 1 THEN BEGIN (* Zeichen vor Cursor loeschen *)
- IF i <> Succ(Len) THEN
- Move (m[i], m[i-1], Succ(Len-i) SHL 1);
- Len := Pred (Len); i := Pred (i);
- IF j > 1 THEN j := Pred (j)
- END; (* gesamte Zeile loeschen: *)
- CtrlHome: BEGIN i := 1; j := 1; Len := 0; END;
- CtrlEnd: Len := Pred (i); (* bis Zeilenende loeschen *)
- Insert: BEGIN (* Ueberschreibmodus ein/aus *)
- InsMode := NOT InsMode; CursorShape(ShapeType(InsMode))
- END;
- Tab: GetScanCode (ListPtr, Code); (* Tastencode editieren *)
- Help: EditHelp; (* Edit-Hilfsbildschirm anzeigen *)
- Return: BEGIN (* sichern, zurueck ins Hauptmenue *)
- Quit := TRUE; Replace := TRUE
- END;
- CtrlRet: BEGIN (* Makrostring an ANSI uebergeben *)
- Quit := TRUE; Replace := FALSE; MacroStr := '';
- FOR k := 1 TO m[0] DO
- MacroStr := MacroStr + Chr(Lo(m[k]));
- SetKey (ListPtr^.Scancode, MacroStr);
- DeleteEntry (ListPtr)
- END;
- Escape: BEGIN (* Bearbeitung abbrechen *)
- Quit := TRUE; Replace := FALSE;
- IF NewEntry THEN DeleteEntry (ListPtr)
- END
- ELSE AddKey (Key) (* Taste dem Makro-Array hinzufuegen *)
- END;
- UNTIL Quit;
- IF Replace THEN (* wurde die Bearbeitung nicht abgebrochen? *)
- WITH ListPtr^ DO BEGIN Replacement := m; Scancode := Code END;
- MenuLine (MainMenu)
- END;
- (* ------------------------------------------------------------------------- *)
- (* HYPERKEY.EDT *)
-