home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* ALLOTEST.PAS *)
- (* Compiler: Turbo-Pascal 4.0/5.0/5.5/6.0 *)
- (* Ein Demonstrationsprogramm zur Verwendung *)
- (* der Unit ReAlloc} *)
- (* (c) 1991 Gerd Cebulla & TOOLBOX *)
- (* ------------------------------------------------------ *)
- PROGRAM Demo;
-
- USES
- Crt, ReAlloc2;
-
- CONST
- MaxZeilen = 18;
- ScrBase = 5;
-
- TYPE
- Str79 = STRING [79];
-
- VAR
- SP : ARRAY [1..MaxZeilen] OF ^Str79;
-
- {$F+}
- FUNCTION HeapFunc (Size : WORD) : INTEGER; {$F-}
- {Heapfehlerbehandlung. Wird von der Turbo-Pascal-Laufzeit- }
- {bibliothek aufgerufen, wenn der verfügbare Speicherplatz }
- {zu klein ist, und sorgt dafür, daß die Funktionen New, }
- {GetMem und ChangeMem das Programm nicht mit einer Fehler- }
- {meldung abbrechen, sondern lediglich den Zeigerwert nil }
- {zurückliefern. }
- BEGIN
- HeapFunc := 1;
- END; {HeapFunc}
-
- PROCEDURE Init;
- VAR
- i : BYTE;
- BEGIN
- HeapError := @HeapFunc;
- {eigene Fehlerroutine installieren}
- FOR i := 1 TO MaxZeilen DO BEGIN
- GetMem (SP [i], 1);
- SP [i]^ := '';
- END;
- ClrScr;
- WriteLn ('Ein kleiner Texteditor zur Demonstration ' +
- 'der Benutzung der Unit ReAlloc.');
- WriteLn ('Geben Sie ein paar Zeilen ein, ' +
- 'und editieren Sie sie.');
- WriteLn ('Achten Sie dabei auf die Anzeige des ' +
- 'freien Speicherplatzes.');
- WriteLn ('(Esc = Programmende.)');
- GotoXY (1, 25);
- Write ('Frei: ', MemAvail:6, ' Byte');
- END; {Init}
-
- PROCEDURE DisplayError;
- BEGIN
- GotoXY (54, 25);
- Write (^G'NICHT GENUG SPEICHERPLATZ!');
- WHILE ReadKey = #0 DO
- ;
- GotoXY (54, 25);
- ClrEol;
- END; {DisplayError}
-
- PROCEDURE Edit;
- VAR
- P : Pointer;
- Spalte,
- Zeile,
- Len : BYTE;
- Taste,
- FTaste : CHAR;
- BEGIN
- Spalte := 1;
- Zeile := 1;
- REPEAT
- GotoXY (7, 25);
- Write (MemAvail:6);
- GotoXY (Spalte, ScrBase + Zeile);
- Taste := ReadKey;
- CASE Taste OF
- #32..#255 : BEGIN {normales Zeichen}
- Len := Length (SP [Zeile]^);
- IF Len < 79 THEN BEGIN
- P := ChangeMem (SP [Zeile], Len + 1, Len + 2);
- IF P = NIL THEN
- DisplayError
- ELSE BEGIN
- SP [Zeile] := P;
- Insert (Taste, SP [Zeile]^, Spalte);
- Write (Copy (SP [Zeile]^, Spalte, 79));
- Inc (Spalte);
- END;
- END;
- END;
- #13 : {Return}
- IF Zeile < MaxZeilen THEN BEGIN
- Inc (Zeile);
- Spalte := 1;
- END;
- #8 : {BackSpace}
- IF Spalte > 1 THEN BEGIN
- Dec (Spalte);
- Delete (SP [Zeile]^, Spalte, 1);
- Len := Length (SP [Zeile]^);
- SP [Zeile] := ChangeMem (SP [Zeile],
- Len + 2, Len + 1);
- GotoXY (Spalte, ScrBase + Zeile);
- Write (Copy (SP [Zeile]^, Spalte, 79));
- ClrEol;
- END;
- #0 : BEGIN {Funktionstaste}
- FTaste := ReadKey;
- CASE FTaste OF
- #72 : {Cursor up}
- IF Zeile > 1 THEN BEGIN
- Dec (Zeile);
- Len := Length (SP [Zeile]^);
- IF Len < Spalte - 1 THEN
- Spalte := Len + 1;
- END;
- #80 : {Cursor down}
- IF Zeile < MaxZeilen THEN BEGIN
- Inc (Zeile);
- Len := Length (SP [Zeile]^);
- IF Len < Spalte - 1 THEN
- Spalte := Len + 1;
- END;
- #75 : {Cursor left}
- IF Spalte > 1 THEN
- Dec (Spalte);
- #77 : {Cursor right}
- IF Spalte <= Length (SP [Zeile]^) THEN
- Inc (Spalte);
- #83 : BEGIN {Del}
- Len := Length (SP [Zeile]^);
- IF Spalte <= Len THEN BEGIN
- Delete (SP [Zeile]^, Spalte, 1);
- SP [Zeile] := ChangeMem (SP [Zeile],
- Len + 1, Len);
- Write (Copy (SP [Zeile]^, Spalte, 79));
- ClrEol;
- END;
- END;
- END; {case FTaste}
- END;
- END; {case Taste}
- UNTIL Taste = #27;
- END; {Edit}
-
- BEGIN
- Init;
- Edit;
- END.
-