home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------------------ *)
- (* BATMENU.PAS *)
- (* Menueauswahl fuer Batchprogramme *)
- PROGRAM BatMenu;
- CONST Fehler = 255; (* wird bei einem Fehler zurueckgegeben *)
- Abbruch = 254; (* wird bei ESC-Taste zurueckgegeben *)
- Escape = 27;
- TYPE str255 = STRING[255];
- VAR menue: ARRAY [0..9] OF BOOLEAN;
- (* ------------------------------------------------------------------ *)
- (* Beendet Programm und erzeugt Programm-Return-Code, der mit ERROR- *)
- (* LEVEL in DOS abgefragt werden kann. Abfrage IF ERRORLEVEL in ab- *)
- (* steigender Reihenfolge! *)
- PROCEDURE System (antwort: INTEGER);
- TYPE register = RECORD
- ax,bx,cx,dx,bp,si,di,ds,es,fl : INTEGER;
- END;
- VAR regs: register;
- BEGIN regs.ax := $4C00 OR antwort; MSDos(regs); END;
- (* ------------------------------------------------------------------ *)
- FUNCTION erstes_Textzeichen (zeile: str255): INTEGER;
- VAR i: INTEGER;
- BEGIN
- i := 1; erstes_Textzeichen := 1;
- WHILE i <= Length(zeile) DO BEGIN
- IF zeile[i] IN ['0'..'9','A'..'z'] THEN BEGIN
- erstes_Textzeichen := i; i := Length(zeile);
- END;
- i := Succ(i);
- END;
- END;
- (* ------------------------------------------------------------------ *)
- PROCEDURE Gross (VAR st1, st2: str255);
- VAR i: INTEGER;
- BEGIN
- st2 := st1;
- FOR i := 1 TO Length(st2) DO st2[i] := UpCase(st2[i]);
- END;
- (* ------------------------------------------------------------------ *)
- PROCEDURE lese_Menue (name: str255);
- VAR menue_datei: TEXT; zeile, temp: str255; code: INTEGER;
- BEGIN
- FOR code := 0 TO 9 DO menue[code] := FALSE;
- Assign(menue_datei,name); (* Text-Datei mit dem Menue lesen *)
- (*$I-*) ReSet(menue_datei); (*$I+*) (* wir machen Fehlerbehandlung *)
- IF IOResult <> 0 THEN BEGIN (* selbst... *)
- WriteLn('*** Fehler in BATMENU: ',name,
- ' kann nicht gelesen werden!');
- System(Fehler); (* Programm endet hier !!! *)
- END;
- WHILE NOT Eof(menue_datei) DO BEGIN
- ReadLn(menue_datei,zeile);
- IF zeile <> '' THEN BEGIN
- temp := Copy(zeile,erstes_Textzeichen(zeile),3);
- Gross(temp,temp);
- IF temp <> 'REM' THEN BEGIN (* Zeile auf Menuepunkt pruefen: *)
- code := Ord(zeile[erstes_Textzeichen(zeile)])-Ord('0');
- IF code IN [0..9] THEN menue[code] := TRUE;
- WriteLn(zeile);
- END;
- END
- ELSE WriteLn;
- END;
- Close(menue_datei);
- END;
- (* ------------------------------------------------------------------ *)
- FUNCTION hole_Taste: CHAR;
- VAR Taste: CHAR;
- BEGIN
- REPEAT UNTIL KeyPressed; (* auf Tastendruck warten *)
- Read(Kbd, Taste); (* Zeichen von Tastatur lesen *)
- hole_Taste := Taste;
- END;
- (* ------------------------------------------------------------------ *)
- PROCEDURE waehlen;
- VAR code: INTEGER;
- BEGIN
- REPEAT
- code := Ord(hole_Taste);
- IF code = Escape THEN System(abbruch); (* hier geht's aus *)
- code := code - Ord('0');
- IF code IN [0..9] THEN (* dem Programm ! *)
- IF menue[code] THEN System(code);
- UNTIL FALSE;
- END;
- (* ------------------------------------------------------------------ *)
- BEGIN
- ClrScr; (* Bildschirm loeschen *)
- IF paramcount <> 1 THEN BEGIN
- WriteLn('*** Fehler in BATMENU: keine Menue-Datei angegeben!');
- System(Fehler);
- END;
- lese_Menue(paramstr(1));
- waehlen;
- END.