home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* REALLDEM.PAS *)
- (* Demonstrationsprogramm zur Verwendung der Unit ReAlloc *)
- (* (c) 1991 Gerd Cebulla & TOOLBOX *)
- (* ------------------------------------------------------ *)
- PROGRAM Demo;
-
- USES
- Crt, ReAlloc;
-
- 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 Laufzeitbibliothek }
- { 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;
-
- 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;
-
- PROCEDURE DisplayError;
- BEGIN
- GotoXY(54, 25);
- Write(^G'NICHT GENUG SPEICHERPLATZ!');
- WHILE ReadKey = #0 DO
- ;
- GotoXY(54, 25);
- ClrEol;
- END;
-
- 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;
- END;
- END;
- UNTIL Taste = #27;
- END;
-
- BEGIN
- Init;
- Edit;
- END.
- (* ------------------------------------------------------ *)
- (* Ende von REALLDEM.PAS *)