home *** CD-ROM | disk | FTP | other *** search
- (*****************************************************************************)
- (* Programm : WDIR Dieses Programm gibt Ihnen anhand der Windowtechnik *)
- (* eine Direktorie-Uebersicht aus. *)
- (* *)
- (*---------------------------------------------------------------------------*)
- (* Date : 14.10.1986 Ersteller : K. Feller *)
- (*****************************************************************************)
-
- PROGRAM wdir (Input, Output);
-
- TYPE st3 = STRING (.3.); (* globale Groessen: *)
- st8 = STRING (.8.);
- st20 = STRING (.20.);
-
- VAR filename: st20;
- lfile : TEXT;
- i : INTEGER;
- ch : CHAR;
- buffer : STRING (.255.);
- ext : st3;
-
- (*---------------------------------------------------------------------------*)
- (* Auflisten des Direktories: *)
-
- FUNCTION fname (was:st3; dev:BYTE; selectflag:BOOLEAN) : st20;
-
- CONST lenx = 22; (* Breite, Hoehe, x-, y-Position des Window's *)
- leny = 14;
- x = 30;
- y = 9;
-
- LABEL 1;
-
- TYPE regpack = RECORD (* 8088 Register *)
- ax, bx, cx, dx, bp, di, si, ds, es, flags:INTEGER;
- END;
-
- VAR reg : regpack;
- such : STRING (.128.); (* Such String *)
- name : STRING (.128.); (* Direktorie Entry *)
- retflag, endflag, flag : BOOLEAN; (* div. Flags *)
- i, j : INTEGER;
- exist : BOOLEAN;
- namefield : ARRAY (.1..12.) OF st8; (* Filenamen Buffer *)
- extfield : ARRAY (.1..12.) OF st3; (* Extension Buffer *)
- ch : CHAR;
-
- (*-------------------------------------------------------------------------*)
- (* Gibt 'Bell' aus: *)
-
- PROCEDURE beep;
-
- BEGIN
- Write (Chr(7));
- END;
-
- (*-------------------------------------------------------------------------*)
- (* Setzt Video auf Normal: *)
-
- PROCEDURE lowv;
-
- BEGIN
- TextColor (lightgreen);
- TextBackGround (black);
- END;
-
- (*-------------------------------------------------------------------------*)
- (* Setzt Video auf Reverse: *)
-
- PROCEDURE highv;
-
- BEGIN
- TextColor (yellow);
- TextBackGround (lightblue);
- END;
-
- (*-------------------------------------------------------------------------*)
- (* Sucht ersten Eintrag im Directory: *)
-
- FUNCTION SearchFirst: BOOLEAN;
-
- BEGIN
- reg.ax := $1a00; (* Diskettenuebertragungsadresse setzen *)
- reg.dx := Ofs(name(.1.));
- reg.ds := Seg(name(.1.));
- MSDos(reg);
- reg.ax := $1100; (* ersten Eintrag suchen *)
- reg.dx := Ofs(such(.1.));
- reg.ds := Seg(such(.1.));
- MSDos(reg);
- SearchFirst := (Lo(reg.ax) = 0);
- END;
-
- (*-------------------------------------------------------------------------*)
- (* Sucht naechsten Eintrag im Directory: *)
-
- FUNCTION SearchNext: BOOLEAN;
-
- BEGIN
- reg.ax := $1200;
- reg.dx := Ofs(such(.1.));
- reg.ds := Seg(such(.1.));
- MSDos(reg);
- SearchNext := (Lo(reg.ax) = 0);
- END;
-
- (*-------------------------------------------------------------------------*)
- (* definiert und zeichnet DIR-Window: *)
-
- PROCEDURE CatWindow;
-
- VAR i: INTEGER;
-
- BEGIN
- Window(x, y, x+lenx, y+leny);
- TextColor(yellow);
- ClrScr;
- GotoXY(1,1); Write(Chr(201)); (* linke, obere Ecke *)
- FOR i := 2 TO lenx-1 DO Write(Chr(205)); (* oberer Doppelstrich *)
- Write(Chr(187)); (* rechte, obere Ecke *)
- FOR i := 2 TO leny-1 DO
- BEGIN
- GotoXY(1,i); Write(Chr(186)); (* linker und rechter Strich *)
- GotoXY(lenx,i); Write(Chr(186));
- END;
- WriteLn; Write(Chr(200)); (* linke, untere Ecke *)
- FOR i := 2 TO lenx-1 DO Write(Chr(205)); (* unterer Strich *)
- Write(Chr(188)); (* rechte, untere Ecke *)
- Window(x+1, y+1, x+lenx-2, y+leny-2); (* Window innerhalb des Rahmens *)
- highv;
- ClrScr;
- END;
-
- (*-------------------------------------------------------------------------*)
- (* Bedienungsanweisung anzeigen: *)
-
- PROCEDURE prompt;
-
- VAR i: INTEGER;
-
- BEGIN
- WriteLn;
- IF j <= 11 THEN
- FOR i := 1 TO 11-j DO WriteLn;
- Write(' ');
- TextColor(white);
- TextBackGround(green);
- IF selectflag THEN
- Write(' CURSOR SPACE ')
- ELSE
- Write(' SPACE ');
- TextColor(yellow);
- END;
-
- (*-------------------------------------------------------------------------*)
- (* Selektion des gewuenschten Files: *)
-
- PROCEDURE select;
-
- BEGIN
- endflag := FALSE;
- retflag := FALSE;
- i := 1;
- REPEAT
- TextColor(white);
- TextBackGround (yellow);
- GotoXY (1,i);
- Write (namefield(.i.):12,'.',extfield(.i.),' ');
- Read (Kbd,ch);
- highv;
- GotoXY (1,i);
- Write (namefield(.i.):12,'.',extfield(.i.),' ');
- CASE ch OF
- #32 : endflag := TRUE; (* SPACE: naechste Seite *)
- #13 : BEGIN (* RETURN: Selektion *)
- name := Copy(namefield(.i.),1,Pos(' ',namefield(.i.))-1);
- name := Concat(name,'.',extfield(.i.));
- endflag := TRUE;
- retflag := TRUE;
- END;
- #27 : BEGIN (* Cursor-Tasten: *)
- Read (Kbd,ch);
- CASE ch OF
- #72 : IF i > 1 THEN i := Pred(i) ELSE i := j-2; (* runter *)
- #80 : IF i < j-2 THEN i := Succ(i) ELSE i := 1; (* hoch *)
- ELSE
- beep;
- END;
- END;
- ELSE
- beep;
- END;
- UNTIL endflag;
- namefield (.1.) := namefield(.j-1.);
- extfield(.1.) := extfield(.j-1.);
- j := 2;
- i := 1;
- END;
-
- (*---------------------------------------------------------------------------*)
-
- BEGIN (* fname *)
- flag := FALSE;
- such := Chr(dev) + '????????' + was + Chr(0);
- name := '????????????';
- IF SearchFirst THEN
- BEGIN
- CatWindow;
- flag := TRUE;
- j := 1;
- REPEAT
- namefield(.j.) := Copy(name,2,8);
- extfield(.j.) := Copy(name,10,3);
- j := Succ(j);
- IF j > 11 THEN
- BEGIN
- prompt;
- IF selectflag THEN
- select
- ELSE
- BEGIN
- REPEAT
- Read (Kbd,ch);
- UNTIL ch = ' ';
- j := 1;
- END;
- IF endflag AND retflag THEN GOTO 1;
- highv;
- ClrScr;
- END;
- Write(Copy(name,2,8):12,'.',Copy(name,10,3),' ');
- UNTIL NOT SearchNext;
- IF flag THEN
- BEGIN
- j := Succ(j);
- prompt;
- IF selectflag THEN
- select
- ELSE
- REPEAT
- Read (Kbd,ch);
- UNTIL ch=' ';
- END;
- END;
- 1:lowv;
- Window (x,y,x+lenx,y+leny);
- ClrScr;
- Window (1,1,80,25);
- fname:=name;
- END;
-
- (*---------------------------------------------------------------------------*)
-
- (* DEMO: z.B. Selecktion eines Files *)
-
- BEGIN
- ClrScr;
- filename:=fname ('???',3,TRUE);
- WriteLn(filename);
- REPEAT UNTIL KeyPressed;
- END.