home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1990 / 05 / tricks / sheldemo.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1990-02-12  |  3.7 KB  |  105 lines

  1. (* ------------------------------------------------------ *)
  2. (*                   SHELLDEMO.PAS                        *)
  3. (*   Zum Aufruf eines weiteren Befehlsinterpreters        *)
  4. (*   Rückkehr von Dos mit Exit.                           *)
  5. (*         (C) 1990 Hubert Hopf & TOOLBOX                 *)
  6. (* ------------------------------------------------------ *)
  7.  
  8. PROGRAM ShellDemo;
  9.  
  10. USES Crt, Dos;
  11.  
  12. {$M 32768,0,0 }
  13.         (* Heap muß begrenzt werden, da sonst Abbruch mit *)
  14.         (* Fehler "Nicht genug Hauptspeicher" erfolgt.    *)
  15. TYPE
  16.   Strg60 = STRING[60];
  17.   VArray = ARRAY[0..3999] OF BYTE;
  18.  
  19. VAR
  20.   Rueck : INTEGER;
  21.   Ch    : CHAR;
  22.  
  23.       (* VRAM wird durch ABSOLUTE an den Anfang des Bild-
  24.          schirmspeichers gesetzt. Ein Zugriff auf VRAM[I]
  25.          bedeutet dann einen direkten Zugriff auf das
  26.          I. Element des Bildschirmspeichers.              *)
  27.  
  28.   VRAM   : VARRAY ABSOLUTE $B800:$0000;
  29.                                   (* Für Mono $B000:$0000 *)
  30.   VR     : VArray;  (* Zum Abspeichern des Bildschirms    *)
  31.  
  32.  
  33.   PROCEDURE FENSTER(TEXT : STRG60);
  34.  
  35.     (* Prozedur zur Ausgabe eines Textes in einem Fenster *)
  36.     (* z. B. für Fehlermeldungen.                         *)
  37.     (* Bildschirm wird vor der Ausgabe gerettet und       *)
  38.     (* danach wieder hergestellt.                         *)
  39.  
  40.   VAR
  41.     Ch : CHAR;
  42.   BEGIN
  43.     VR := VRAM;                (* Bildschirminhalt retten *)
  44.     Window(10, 10, 70, 13);
  45.     TextAttr := BLUE SHL 4 OR Yellow;     (* Farbe setzen *)
  46.     ClrScr;
  47.     GotoXY(30 - (Length(TEXT) DIV 2), 2);
  48.     Write(TEXT);                         (* Text ausgeben *)
  49.     GotoXY(8,4);
  50.     Write('Weiter mit beliebiger Taste, Abbruch mit ESC');
  51.     Ch := ReadKey;              (* Warten auf Tastendruck *)
  52.     TextAttr := BLACK SHL 4 OR White;   (* Fenster zurück *)
  53.     Window(1,1,80,25);
  54.     ClrScr;
  55.     VRAM := VR;                 (* alter Bildschirminhalt *)
  56.     IF Ch = #27 THEN Halt;             (* Abbruch bei ESC *)
  57.   END;
  58.  
  59.   PROCEDURE Fehler(FehlerNr : BYTE);
  60.   (* Fehlerbehandlung :
  61.      Bei EXEC können die Fehler 2,8,10 und 11 auftreten *)
  62.   BEGIN
  63.     CASE FEHLERNR OF
  64.       2 : FENSTER('Datei nicht gefunden');
  65.       8 : FENSTER('Nicht genug Speicherpl. im Hauptsp.');
  66.      10 : FENSTER('Ungültiger Umgebungs-Parameter');
  67.      11 : FENSTER('Ungültiges Befehlsformat');
  68.     END;
  69.   END;
  70.  
  71.   FUNCTION SHELL(PROG, PARAM : STRG60) : INTEGER;
  72.   BEGIN
  73.     FENSTER('Zurück mit EXIT'); (* Hinweis zur Rückkehr   *)
  74.     Exec(PROG,PARAM);           (* Aufruf des Befehlsin-
  75.                                               terpreters  *)
  76.                                 (* kann auch zum Aufruf
  77.                                    anderer Programme
  78.                                    dienen.                *)
  79.     IF DosError<>0 THEN BEGIN
  80.       FEHLER(DosError);         (* Fehler aufgetreten     *)
  81.       SHELL := -1;              (* Im Fehlerfall -1
  82.                                            zurückgeben    *)
  83.     END ELSE BEGIN
  84.       SHELL := DosExitCode;     (* sonst ExitCode des auf-
  85.                                    gerufenen Programmes.  *)
  86.     END;
  87.   END;
  88.  
  89. BEGIN
  90.   TextAttr := BLACK SHL 4 OR WHITE;
  91.   ClrScr;
  92.   GotoXY(1,1);
  93.   WriteLn('Aufruf eines neuen Befehlsinterpreters aus');
  94.   Writeln('einem laufenden Turbo-Pascal-Programm mittels');
  95.   Writeln('der EXEC-Funktion');
  96.   RUECK := SHELL('\COMMAND.COM','');
  97.                             (* Aufruf der SHELL-Funktion  *)
  98.                             (* mit Rückgabe des Exitcodes *)
  99.   WriteLn;
  100.   WriteLn('Exitcode des aufgerufenen Programmes : ',RUECK);
  101.   CH := ReadKey;
  102. END.
  103. (* ------------------------------------------------------ *)
  104. (*                  Ende von SHELLDEMO.PAS                *)
  105.