home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1991 / 09_10 / praxis / edit.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1991-07-18  |  17.8 KB  |  517 lines

  1. (* ------------------------------------------------------ *)
  2. (*                      EDPAS.PAS                         *)
  3. (*          Kleiner Rumpfeditor in Turbo Pascal           *)
  4. (*                   Turbo Pascal 6.0                     *)
  5. (*                   (c) 1991 TOOLBOX                     *)
  6. (* ------------------------------------------------------ *)
  7. {$A+,B-,D-,F-,G-,I-,O-,R-,S-,V-,X+}
  8. {$M 8192,0,655360}
  9.  
  10. PROGRAM EDPAS;
  11. USES Dos, Crt;
  12. TYPE
  13.   Str80      = STRING[80];            { für eine Textzeile }
  14.   StrPtr     = ^Str80;        { Pointer auf eine Textzeile }
  15.   ScreenCell = RECORD          { für direktes Schreiben in }
  16.                   ch : CHAR; Attr : BYTE;
  17.                END;               { den Bildschirmspeicher }
  18.   ScreenRec  = ARRAY[1..25,1..80] OF ScreenCell;{ VideoRAM }
  19. CONST
  20.   InsertMode : BOOLEAN = TRUE;             { Insert aktiv? }
  21.                                  { Positionen in Infozeile }
  22.   PosPos = 1; NamePos = 11; InsPos = 28; TextMaxY = 24;
  23.   ErrorMessage : ARRAY [1..5] OF STRING =
  24.    ('Datei nicht gefunden', 'Lesefehler',
  25.     'Datei kann nicht geschrieben werden',
  26.     'Laufwerk nicht bereit',
  27.     'Text paßt nicht in Arbeitsspeicher');
  28. VAR
  29.   Key,               { Taste oder erweiterter Tastaturcode }
  30.   TextLine,        { Nr. der gerade bearbeiteten Textzeile }
  31.   FirstOnScreen,       { Nr. der obersten Zeile auf Screen }
  32.   MaxLine : WORD;              { Nr. der letzten Textzeile }
  33.   FileName,                                { Name Texdatei }
  34.   NextFile : STRING;              { Name zu ladender Datei }
  35.   TextFile : TEXT;                 { File-Handle Textdatei }
  36.   Lines : ARRAY[1..15600] OF StrPtr;            { der Text }
  37.   ScreenID : BYTE ABSOLUTE $040:$049;           { CGA/HGC? }
  38.   Screen : ^ScreenRec;                { Bildschirmspeicher }
  39.   IOError : BOOLEAN;      { Flag für Dateifehlerbehandlung }
  40.   InfoBuffer : ARRAY[1..80] OF WORD; { Puffer f. Infozeile }
  41.   TextCol : BYTE;                      { Spalte Textcursor }
  42.   TextColor, ErrorColor, InfoColor : BYTE;        { Farben }
  43.  
  44. {$F+}                     { für Errorhandling Heapspeicher }
  45. FUNCTION HeapFunc(Size : WORD) : INTEGER;
  46. {$F-}          { ermöglicht das Abfangen von Heap-Fehlern; }
  47. BEGIN          { diese Funktion muß in jedem Fall explizit }
  48.   HeapFunc := 1;                     { installiert werden! }
  49. END;  { HeapFunc }
  50.  
  51. FUNCTION GetKey : WORD;  { auf Taste warten und Auswertung }
  52. VAR ch1, ch2 : CHAR;
  53. BEGIN
  54.   REPEAT UNTIL KeyPressed;
  55.   ch1 := ReadKey;
  56.   IF ch1 = #0 THEN BEGIN       { erweiterter Tastaturcode: }
  57.     ch2 := ReadKey;   { 2. Taste erfragen, Wert in Hi-Byte }
  58.     GetKey := BYTE(ch2) * 256 + BYTE(ch1);    { schreiben; }
  59.   END ELSE GetKey := BYTE(ch1);     { sonst Rückgabe ASCII }
  60. END;  { GetKey }
  61.  
  62. PROCEDURE WriteLine(Nr : WORD);           { Zeile anzeigen }
  63. VAR l, n, y : BYTE;
  64. BEGIN
  65.   y := Nr - FirstOnScreen + 1; l := Length(Lines[Nr]^);
  66.   IF Nr <= MaxLine THEN BEGIN
  67.     FOR n := 1 TO 80 DO BEGIN
  68.       Screen^[y, n].Attr := TextColor;
  69.       IF n <= l THEN Screen^[y, n].ch := Lines[Nr]^[n]
  70.                 ELSE Screen^[y, n].ch := #0;
  71.     END;
  72.   END ELSE
  73.     FOR n := 1 TO 80 DO BEGIN
  74.       Screen^[y, n].Attr := TextColor;
  75.       Screen^[y, n].ch := #0;
  76.     END;
  77. END;  { WriteLine }
  78.  
  79. PROCEDURE WriteInfoLine(Msg : STRING);         { Infozeile }
  80. BEGIN
  81.   TextAttr := InfoColor; GotoXY(1, 25); Write(Msg); ClrEol;
  82. END;  { WriteInfoline }
  83.  
  84. PROCEDURE SaveInfoline;                { Infozeile puffern }
  85. BEGIN
  86.   Move(Screen^[25, 1], InfoBuffer, SizeOf(InfoBuffer));
  87. END;  { SaveInfoline }
  88.  
  89. PROCEDURE RestoreInfoline;        { Infozeile restaurieren }
  90. BEGIN
  91.   Move(InfoBuffer, Screen^[25, 1], SizeOf(InfoBuffer));
  92. END;  { RestoreInfoline }
  93.  
  94. PROCEDURE QuitProgram;                { Programm verlassen }
  95. BEGIN
  96.   WriteInfoLine(' Programm beenden (J/N) ?');
  97.   REPEAT
  98.     IF UpCase(ReadKey) = 'J' THEN BEGIN
  99.       TextMode(LastMode); TextAttr := LightGray;
  100.       ClrScr; Halt;
  101.     END ELSE BEGIN
  102.       RestoreInfoLine; Exit;
  103.     END;
  104.   UNTIL FALSE;
  105. END;  { QuitProgram }
  106.  
  107. PROCEDURE ShowError(Nr : BYTE; Fatal : BOOLEAN);
  108. BEGIN                             { Fehlermeldung ausgeben }
  109.   SaveInfoline; GotoXY(1, 25); TextAttr := ErrorColor;
  110.   Write(ErrorMessage[Nr], ' - Taste...'); ClrEol; Write(^G);
  111.   REPEAT UNTIL ReadKey > '';
  112.   RestoreInfoline;
  113.   IF Fatal THEN QuitProgram;
  114. END;  { ShowError }
  115.  
  116. PROCEDURE Scroll(Val : INTEGER);  { Text anzeigen/scrollen }
  117. VAR n : WORD;
  118. BEGIN
  119.   IF MaxLine = 0 THEN Exit;
  120.   IF FirstOnScreen + Val < 1 THEN BEGIN
  121.     FirstOnScreen := 1; TextLine := 1;
  122.   END ELSE BEGIN
  123.     FirstOnScreen := FirstOnScreen + Val;
  124.     TextLine := TextLine + Val;
  125.     IF FirstOnScreen > MaxLine THEN
  126.       FirstOnScreen := MaxLine;
  127.     IF TextLine > MaxLine THEN TextLine := MaxLine;
  128.   END;
  129.   TextAttr := TextColor;
  130.   IF Abs(Val) <> 1 THEN
  131.     FOR n := FirstOnScreen TO FirstOnScreen + TextMaxY - 1
  132.     DO BEGIN WriteLine(n);
  133.     END
  134.   ELSE BEGIN           { eine Zeile scrollen: Move-Befehle }
  135.     CASE Val OF               { sorgen für Geschwindigkeit }
  136.       1  : BEGIN                       { eine Zeile runter }
  137.              Move(Screen^[2, 1], Screen^[1, 1],
  138.                   (TextMaxY - 1) * 160);
  139.              WriteLine(FirstOnScreen + TextMaxY - 1);
  140.            END;
  141.       -1 : BEGIN                        { ...und eine rauf }
  142.              Move(Screen^[1, 1], Screen^[2, 1],
  143.                   (TextMaxY - 1) * 160);
  144.              WriteLine(FirstOnScreen);
  145.            END;
  146.     END;
  147.   END;
  148. END;  { Scroll }
  149.  
  150. PROCEDURE GetNewLine;    { holt Heap für neue letzte Zeile }
  151. BEGIN
  152.   Inc(MaxLine); New(Lines[MaxLine]);
  153.   IF Lines[MaxLine] = NIL THEN ShowError(5, TRUE);
  154. END;  { GetNewLine }
  155.  
  156. PROCEDURE ReleaseLine;  { Heap der letzten Zeile freigeben }
  157. BEGIN
  158.   Dispose(Lines[MaxLine]); Dec(MaxLine);
  159. END;  { ReleaseLine }
  160.  
  161. PROCEDURE InsertLine(Nr : WORD);          { Zeile einfügen }
  162. VAR n : WORD;
  163. BEGIN
  164.   GetNewLine;
  165.   FOR n := MaxLine - 1 DOWNTO Nr DO
  166.     Lines[n + 1]^ := Lines[n]^;
  167.   Lines[Nr]^ := '';
  168. END;  { InsertLine }
  169.  
  170. PROCEDURE DeleteLine(Nr : WORD);           { Zeile löschen }
  171. VAR n : WORD;
  172. BEGIN
  173.   IF MaxLine > 0 THEN BEGIN
  174.     FOR n := Nr TO MaxLine - 1 DO
  175.       Lines[n]^ := Lines[n + 1]^;
  176.     ReleaseLine;
  177.   END;
  178. END;  { DeleteLine }
  179.  
  180. PROCEDURE ShowInsert;             { Insert-Status anzeigen }
  181. BEGIN
  182.   TextAttr := InfoColor; GotoXY(InsPos, 25);
  183.   IF InsertMode THEN Write('INS')
  184.                 ELSE Write('OVR');
  185. END;  { ShowInsert }
  186.  
  187. PROCEDURE ShowPosition;  { Cursorposition x und y anzeigen }
  188. BEGIN
  189.   TextAttr := InfoColor; GotoXY(PosPos, 25);
  190.   Write(TextLine:5, ':', TextCol:2);
  191. END;  { ShowPosition }
  192.  
  193. PROCEDURE ShowName;                  { Dateinamen anzeigen }
  194. VAR D : DirStr; N : NameStr; E : ExtStr;
  195. BEGIN
  196.   FSplit(FileName, D, N, E); TextAttr := InfoColor;
  197.   GotoXY(NamePos, 25); Write(N + E : 12);
  198. END;  { ShowName }
  199.  
  200. PROCEDURE ToggleInsert;          { Insert-Modus umschalten }
  201. BEGIN
  202.   InsertMode := NOT InsertMode; ShowInsert;
  203. END;  { ToggleInsert }
  204.  
  205. PROCEDURE InitEmptyText;   { Initialisierung "leerer" Text }
  206. BEGIN
  207.   MaxLine := 0; GetNewLine; Lines[1]^ := '';
  208.   FirstOnScreen := 1; TextLine := 1; TextCol := 1;
  209. END;  { InitEmptyText }
  210.  
  211. PROCEDURE CheckIO;                { prüft Dateioperationen }
  212. VAR IOErrorNr : WORD;
  213. BEGIN
  214.   IOErrorNr := IOResult; IOError := (IOErrorNr <> 0);
  215.   CASE IOErrorNr OF
  216.     2, 3, 15      : ShowError(1, FALSE);
  217.     100, 154, 158 : ShowError(2, FALSE);
  218.     5, 12, 101    : ShowError(3, FALSE);
  219.     152           : ShowError(4, FALSE);
  220.   END;
  221. END;  { CheckIO }
  222.  
  223. PROCEDURE LoadFile(Name : STRING);            { Text laden }
  224. VAR n : WORD;
  225. BEGIN
  226.   FileMode := 0;
  227.   {$I-} Assign(TextFile, Name); {$I+}
  228.   CheckIO;
  229.   IF IOError THEN BEGIN InitEmptyText; Exit; END;
  230.   {$I-} Reset(TextFile); {$I+}
  231.   CheckIO;
  232.   IF IOError THEN BEGIN
  233.     IF MaxLine = 0 THEN InitEmptyText;
  234.     Exit;
  235.   END;
  236.   n := 0; MaxLine := 0; SaveInfoline;
  237.   WriteInfoline('Lade Datei ' + Name + '...');
  238.   WHILE NOT EOF(TextFile) DO BEGIN
  239.     GetNewLine; ReadLn(TextFile, Lines[MaxLine]^);
  240.   END;
  241.   Close(TextFile); RestoreInfoline;
  242.   FirstOnScreen := 1; TextLine := 1; TextCol := 1;
  243.   Scroll(0); ShowName;
  244. END;  { LoadFile }
  245.  
  246. PROCEDURE SaveFile(Name : STRING);          { Text sichern }
  247. VAR n : WORD;
  248. BEGIN
  249.   {$I-} Assign(TextFile, Name); {$I+}
  250.   CheckIO;
  251.   IF IOError THEN Exit;
  252.   {$I-} ReWrite(TextFile); {$I+}
  253.   CheckIO;
  254.   IF IOError THEN Exit;
  255.   SaveInfoline;
  256.   WriteInfoline('Speichere Datei ' + Name + '...');
  257.   FOR n := 1 TO MaxLine DO BEGIN
  258.     WriteLn(TextFile, Lines[n]^); CheckIO;
  259.     IF IOError THEN BEGIN
  260.       RestoreInfoline; Exit;
  261.     END;
  262.   END;
  263.   Close(TextFile); RestoreInfoline;
  264. END;  { SaveFile }
  265.  
  266. PROCEDURE AddStr(VAR Str : STRING; Len : BYTE);
  267. VAR n : BYTE;          { String mit Leerzeichen verlängern }
  268. BEGIN
  269.   FOR n := Length(Str) TO Pred(Len) DO Str := Str + #32;
  270. END;  { AddStr }
  271.  
  272. FUNCTION UpString(s : STRING) : STRING;   { wandelt String }
  273. VAR n : BYTE;                          { in Großbuchstaben }
  274. BEGIN
  275.   FOR n := 1 TO Length(s) DO s[n] := UpCase(s[n]);
  276.   UpString := s;
  277. END;  { UpString }
  278.  
  279. FUNCTION GetParams : STRING;    { Kommandozeilenauswertung }
  280. VAR s : STRING;
  281. BEGIN
  282.   IF ParamCount = 0 THEN s := '' ELSE s := ParamStr(1);
  283.   GetParams := UpString(s);
  284. END;  { GetParams }
  285.  
  286. PROCEDURE EditLine(y : WORD; x : BYTE; ch : CHAR);
  287. BEGIN                                    { Zeile editieren }
  288.   IF ch IN [#32..#255] THEN BEGIN
  289.     AddStr(Lines[y]^, x - 1);
  290.     IF InsertMode THEN BEGIN            { Zeichen einfügen }
  291.       Insert(ch, Lines[y]^, x);
  292.       IF BYTE(Lines[y]^[0]) > 80 THEN Lines[y]^[0] := #80;
  293.     END ELSE Lines[y]^[x] := ch;   { Zeichen überschreiben }
  294.     WriteLine(y);
  295.     IF TextCol < 80 THEN Inc(TextCol);
  296.   END;
  297. END;  { EditLine }
  298.  
  299. FUNCTION GetFileName(Msg : STRING) : STRING;
  300. VAR s : STRING; n : BYTE;      { Eingabe eines Dateinamens }
  301. BEGIN
  302.   SaveInfoline; TextAttr := InfoColor;
  303.   Window(1, 25, 80, 25);
  304.   GotoXY(1, 25); ClrEol; Write(Msg);
  305.   ReadLn(s); s := UpString(s); GetFilename := s;
  306.   RestoreInfoline; Window(1, 1, 80, 25);
  307. END;  { GetFilename }
  308.  
  309. PROCEDURE Edit;                            { Hauptprozedur }
  310.             { es folgen: diverse lokale Prozeduren. Voilá: }
  311. PROCEDURE HelpScreen;                     { Hilfe anzeigen }
  312. VAR ScreenBuf : ScreenRec;
  313. BEGIN
  314.   Move(Screen^[1, 1], ScreenBuf, SizeOf(ScreenBuf));
  315.   TextAttr := InfoColor; Window(20, 6, 61, 18); ClrScr;
  316.   WriteLn(' Spezielle Befehle des toolbox-Editors:');
  317.   WriteLn(' --------------------------------------');
  318.   WriteLn;
  319.   WriteLn('          <F2>    Sichern');
  320.   WriteLn('          <F3>    Laden');
  321.   WriteLn('    <Alt>-<F2>    Sichern als');
  322.   WriteLn(' <Ctrl>-<Home>    Textanfang');
  323.   WriteLn('  <Ctrl>-<End>    Textende');
  324.   WriteLn('         <Ins>    Einfügen/Überschreiben');
  325.   WriteLn('    <Ctrl>-<N>    Zeile einfügen');
  326.   WriteLn('    <Ctrl>-<Y>    Zeile löschen');
  327.   WriteLn;
  328.   Write('          weiter mit beliebiger Taste...');
  329.   REPEAT UNTIL ReadKey > '';
  330.   WHILE KeyPressed DO ReadKey;
  331.   Move(ScreenBuf, Screen^[1, 1], SizeOf(ScreenBuf));
  332.   Window(1, 1, 80, 25);
  333. END;  { HelpScreen }
  334.  
  335. PROCEDURE DeleteKey;                         { Taste <Del> }
  336. VAR l1, l2 : BYTE;
  337. BEGIN
  338.   l1 := Length(Lines[TextLine]^);
  339.   IF TextLine + 1 <= MaxLine THEN
  340.     l2 := Length(Lines[TextLine + 1]^);
  341.   IF TextCol <= l1 THEN BEGIN { Zchn. unter Cursor löschen }
  342.     Delete(Lines[TextLine]^, TextCol, 1);
  343.     WriteLine(TextLine);
  344.   END ELSE
  345.   BEGIN                            { nächste Zeile anfügen }
  346.     IF TextLine + 1 > MaxLine THEN Exit;
  347.     IF l2 <= 80 - l1 THEN BEGIN      { Zeile paßt komplett }
  348.       Lines[TextLine]^ := Lines[TextLine]^ +
  349.                           Lines[TextLine + 1]^;
  350.       DeleteLine(TextLine + 1);
  351.       Scroll(0);
  352.     END ELSE BEGIN              { Zeile teilweise anhängen }
  353.       Lines[TextLine]^ := Lines[TextLine]^ +
  354.         Copy(Lines[TextLine + 1]^, 1, 80 - l1);
  355.       Delete(Lines[TextLine + 1]^, 1, 80 - l1);
  356.       WriteLine(TextLine); WriteLine(TextLine + 1);
  357.     END;
  358.   END;
  359. END;  { DeleteKey }
  360.  
  361. PROCEDURE BSKey;                              { Taste <BS> }
  362. VAR l1, l0 : BYTE;
  363. BEGIN
  364.   l1 := Length(Lines[TextLine]^);
  365.   IF TextLine > 1 THEN
  366.     l0 := Length(Lines[TextLine - 1]^);
  367.   IF TextCol > 1 THEN BEGIN  { Zchn. links v.Curs. löschen }
  368.     Delete(Lines[TextLine]^, TextCol - 1, 1);
  369.     Dec(TextCol); WriteLine(TextLine);
  370.   END ELSE
  371.   BEGIN                             { letzte Zeile anfügen }
  372.     IF TextLine = 1 THEN Exit;
  373.     IF l0 <= 80 - l1 THEN BEGIN      { Zeile paßt komplett }
  374.       TextCol := Length(Lines[TextLine - 1]^) + 1;
  375.       Lines[TextLine]^ := Lines[TextLine - 1]^ +
  376.                           Lines[TextLine]^;
  377.       Dec(TextLine); DeleteLine(TextLine); Scroll(0);
  378.     END ELSE
  379.     BEGIN                       { Zeile teilweise anhängen }
  380.       Lines[TextLine - 1]^ := Lines[TextLine - 1]^ +
  381.         Copy(Lines[TextLine]^, 1, 80 - l0);
  382.       Delete(Lines[TextLine]^, 1, 80 - l0);
  383.       WriteLine(TextLine - 1); WriteLine(TextLine);
  384.     END;
  385.   END;
  386. END;  { BSKey }
  387.  
  388. PROCEDURE EnterKey;                        { Taste <Enter> }
  389. BEGIN
  390.   CASE InsertMode OF
  391.     TRUE :
  392.       BEGIN
  393.         InsertLine(TextLine);
  394.         Lines[TextLine + 1]^ :=
  395.           Copy(Lines[TextLine + 1]^, TextCol,
  396.                Length(Lines[TextLine + 1]^) - TextCol + 1);
  397.         Lines[TextLine]^[0] := CHAR(TextCol - 1);
  398.         TextCol := 1;
  399.         IF TextLine - FirstOnScreen > TextMaxY - 2 THEN
  400.           Scroll(0)
  401.         ELSE BEGIN Inc(TextLine); Scroll(0);
  402.         END;
  403.       END;
  404.     FALSE :
  405.       IF TextLine < MaxLine THEN BEGIN
  406.         TextCol := 1;
  407.         IF TextLine - FirstOnScreen > TextMaxY - 2 THEN
  408.           Scroll(1)
  409.         ELSE Inc(TextLine);
  410.       END ELSE BEGIN GetNewLine; Lines[MaxLine]^ := '';
  411.       END;
  412.   END;
  413. END;  { EnterKey }
  414.  
  415. PROCEDURE SaveAs;          { Taste <Alt>-<F2>: Sichern als }
  416. BEGIN
  417.   NextFile := GetFilename('Datei sichern als: ');
  418.   IF NextFile > '' THEN BEGIN
  419.     FileName := NextFile; SaveFile(FileName); ShowName;
  420.   END;
  421. END;  { SaveAs }
  422.  
  423. PROCEDURE LoadTextFile;          { Taste <F3>: Datei laden }
  424. BEGIN
  425.   NextFile := GetFilename('Datei laden: ');
  426.   IF NextFile > '' THEN BEGIN
  427.     LoadFile(NextFile);
  428.     IF NOT IOError THEN BEGIN
  429.       FileName := NextFile; ShowName;
  430.     END;
  431.   END;
  432. END;  { LoadFile }
  433.  
  434. BEGIN  { Edit }
  435.   REPEAT
  436.     ShowPosition;
  437.     GotoXY(TextCol, TextLine - FirstOnScreen + 1);
  438.     Key := GetKey;
  439.     IF Key < 255 THEN BEGIN        { normaler Tastaturcode }
  440.       CASE Key OF
  441.         8  : BSKey;                                 { <BS> }
  442.         13 : EnterKey;                           { <Enter> }
  443.         14 : BEGIN                            { <Ctrl>-<N> }
  444.                InsertLine(TextLine); Scroll(0);
  445.              END;
  446.         25 : BEGIN                            { <Ctrl>-<Y> }
  447.                DeleteLine(TextLine); Scroll(0);
  448.              END;
  449.         27 : QuitProgram;                          { <Esc> }
  450.       ELSE   EditLine(TextLine, TextCol, CHAR(Key));
  451.       END;
  452.     END ELSE BEGIN              { erweiterter Tastaturcode }
  453.       CASE Hi(Key) OF
  454.         59 : HelpScreen;                            { <F1> }
  455.         60 : SaveFile(FileName);                    { <F2> }
  456.         61 : LoadTextFile;                          { <F3> }
  457.         71 : TextCol := 1;                        { <Home> }
  458.         72 : IF TextLine > 1 THEN                 { <hoch> }
  459.                IF TextLine < FirstOnScreen + 1
  460.                THEN Scroll(-1)
  461.                ELSE Dec(TextLine);
  462.         73 : Scroll(- TextMaxY + 1);              { <PgUp> }
  463.         75 : IF TextCol > 1 THEN Dec(TextCol);   { <links> }
  464.         77 : IF TextCol < 80 THEN Inc(TextCol); { <rechts> }
  465.         79 : BEGIN                                 { <End> }
  466.                TextCol := BYTE(Lines[TextLine]^[0]);
  467.                IF TextCol < 80 THEN Inc(TextCol);
  468.              END;
  469.         80 : IF TextLine < MaxLine THEN         { <runter> }
  470.                IF TextLine - FirstOnScreen > TextMaxY - 2
  471.                THEN Scroll(1)
  472.                ELSE Inc(TextLine);
  473.         81 : Scroll(TextMaxY - 1);                { <PgDn> }
  474.         82 : ToggleInsert;                         { <Ins> }
  475.         83 : DeleteKey;                            { <Del> }
  476.         105: SaveAs;                          { <Alt>-<F2> }
  477.         117: BEGIN                          { <Ctrl>-<End> }
  478.                FirstOnScreen := MaxLine - TextMaxY + 1;
  479.                TextLine := MaxLine; Scroll(0);
  480.              END;
  481.         119: BEGIN                         { <Ctrl>-<Home> }
  482.                TextLine := 1; FirstOnScreen := 1; Scroll(0);
  483.              END;
  484.       END;
  485.     END;
  486.   UNTIL FALSE;
  487. END;  { Edit }
  488.  
  489. PROCEDURE Init;                { diverse Initialisierungen }
  490. BEGIN
  491.   IF ScreenID = 7 THEN BEGIN       { Grafikkartenerkennung }
  492.     Screen := Ptr($B000, $0000);  { Hercules, der "Starke" }
  493.     TextColor   := 7;                    { normale Schrift }
  494.     ErrorColor  := 240;                  { invers blinkend }
  495.     InfoColor   := 120;                      { invers hell }
  496.   END ELSE BEGIN
  497.     Screen := Ptr($B800, $0000);             { CGA/EGA/VGA }
  498.     TextColor  := Yellow OR Blue SHL 4;
  499.     ErrorColor := Yellow OR LightRed SHL 4;
  500.     InfoColor  := White OR Red SHL 4;
  501.   END;
  502.   TextAttr := TextColor; ClrScr;
  503.   HeapError := @HeapFunc;  { Error-Handling initialisieren }
  504.   WriteInfoline('                                 ' +
  505.                 '      toolbox-Editor   <F1> Hilfe');
  506.   MaxLine := 0; ShowInsert; FileName := GetParams;
  507.   IF FileName > '' THEN LoadFile(FileName)
  508.   ELSE InitEmptyText;
  509.   Scroll(0);
  510. END;  { Init }
  511.  
  512. BEGIN                                      { Hauptprogramm }
  513.   Init; Edit;
  514. END.
  515. (* ------------------------------------------------------ *)
  516. (*                 Ende von EDPAS.PAS                     *)
  517.