home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1989 / 06 / tricks / dirwin.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1989-03-21  |  7.1 KB  |  258 lines

  1. (* ------------------------------------------------------ *)
  2. (*                     DIRWIN.PAS                         *)
  3. (*        Utility zum Anzeigen eines Verzeichnisses       *)
  4. (*           innerhalb eines Bildschirmfensters           *)
  5. (*          (c) 1989 by J. Laitenberger & TOOLBOX         *)
  6. (* ------------------------------------------------------ *)
  7. UNIT DirWin;
  8.  
  9. INTERFACE
  10.  
  11. USES Crt, Dos;
  12.  
  13. CONST
  14.   spaces = '              ';                    { 14 Stück }
  15.   video  = $b800;           { hier für color. mono : $b000 }
  16.  
  17. TYPE
  18.   str12  = STRING [12];
  19.   str20  = STRING [20];
  20.   str80  = STRING [80];
  21.   dirtyp = ARRAY [0..100] OF str12;
  22.  
  23. VAR
  24.   path, next, st : STRING;
  25.   c, c1, c2      : CHAR;
  26.   count, first,
  27.   last, diff,
  28.   marked         : BYTE;
  29.   regs           : Registers;
  30.   i, j, max      : INTEGER;
  31.   srec           : searchrec;
  32.   dira           : dirtyp;
  33.   att            : BOOLEAN;
  34.   strg, mask     : str12;
  35.   page           : ARRAY [$0000..$0fff] OF BYTE;
  36.  
  37. FUNCTION GetDir : STRING;
  38.  
  39. IMPLEMENTATION
  40.  
  41. PROCEDURE color (tc, bc : BYTE);
  42. BEGIN
  43.   TextColor (tc);
  44.   TextBackground (bc)
  45. END;
  46.  
  47. PROCEDURE cursor (start, end_ : INTEGER);
  48. (* Setzt die Cursorform *)
  49. VAR  regs : Registers;
  50. BEGIN
  51.   WITH regs DO BEGIN
  52.     ch := start; cl := end_; ah := 1; Intr($10, regs);
  53.   END;
  54. END;
  55.  
  56. PROCEDURE hidecur;                (* Schaltet Cursor aus *)
  57. BEGIN
  58.   cursor(-1, 0);
  59. END;
  60.  
  61. PROCEDURE showcur;          (* Schaltet Cursor wieder ein *)
  62. BEGIN
  63.   cursor(6,7);
  64. END;
  65.  
  66. PROCEDURE store;                (* Sichert den Bildschirm *)
  67. VAR i: INTEGER;
  68. BEGIN
  69.   FOR i := 0 TO $0fff DO page [i] := Mem [video:i];
  70. END;
  71.  
  72. PROCEDURE restore;                 (* -> alter Bildschirm *)
  73. VAR i: INTEGER;
  74. BEGIN
  75.   FOR i := 0 TO $0fff DO Mem [video:i] := page [i];
  76. END;
  77.  
  78. FUNCTION getdd : CHAR;
  79. (* Ermittelt das aktuelle Diskettenlaufwerk *)
  80. BEGIN
  81.   regs.ah := $19; MsDos (regs);
  82.   getdd  := Chr (regs.al + Ord ('A'))
  83. END;
  84.  
  85. FUNCTION form (ent: str12): str12;
  86. BEGIN
  87.   form := ent + '\'
  88. END;
  89.  
  90. PROCEDURE dir;
  91. (* Ermittelt Directory, Kapazität, freie Bytes *)
  92. (* der Diskette im aktuellen Laufwerk          *)
  93. BEGIN
  94.   srec.name := '*.*'; i:=0;
  95.   FindFirst(Copy(path, 1, Length(path)
  96.             - Length(mask)) + '*.*', $20 + $10, srec);
  97.   WHILE NOT (DosError = 18) AND (i <= 100) DO BEGIN
  98.     IF srec.attr = $10 THEN BEGIN
  99.       IF srec.name <> '.' THEN BEGIN
  100.         Inc (i); dira [i] := form (srec.name)
  101.       END;
  102.     END;
  103.     FindNext (srec);
  104.   END;
  105.   srec.name := path;
  106.   FindFirst(path, $20, srec);
  107.   WHILE NOT (DosError = 18) AND (i <= 100) DO BEGIN
  108.     Inc (i);
  109.     dira[i] := srec.name;
  110.     FindNext (srec)
  111.   END;
  112.   IF dira[1] = (getdd + ':\' + mask) THEN Dec(i);
  113.   max := i;
  114. END;
  115.  
  116. PROCEDURE Window;
  117. VAR i, j : INTEGER;
  118. BEGIN
  119.   GotoXY (10, 9); color (14,0);
  120.   Write (Chr(218));
  121.   FOR i := 0 TO 59 DO Write (Chr(196));
  122.   Write (Chr(191));
  123.   GotoXY (10,19);
  124.   Write (Chr(192));
  125.   FOR i := 0 TO 59 DO Write (Chr(196));
  126.   Write (Chr(217));
  127.   Color (15,0);
  128.   GotoXY ((60 - Length(path) + 2) DIV 2 + 10, 9);
  129.   Write (' ', path, ' ');
  130.   Color (14,0);
  131.   FOR i := 10 TO 18 DO BEGIN
  132.     GotoXY (10,i);
  133.     Write (Chr(179));
  134.     FOR j := 0 TO 59 DO Write (Chr(32));
  135.     Write (Chr(179));
  136.   END;
  137.   Color (7,0)
  138. END;
  139.  
  140. PROCEDURE fill;
  141. VAR  x, y : BYTE; cnt : BYTE;
  142. BEGIN
  143.   x := 11;  y := 10;
  144.   IF att THEN BEGIN
  145.     Window; att := FALSE;
  146.   END;
  147.   last := max;
  148.   IF last > 0 THEN BEGIN
  149.     IF last > 35 + first THEN last := first + 35;
  150.     FOR cnt := first TO last DO BEGIN
  151.       GotoXY (x,y);
  152.       IF cnt = marked THEN BEGIN
  153.         Color (0,7); Write (' ' + dira[cnt],
  154.                    Copy(spaces, 1, 14 - Length(dira[cnt])));
  155.         Color (7,0)
  156.       END ELSE Write (' ' + dira[cnt],
  157.                    Copy(spaces, 1, 14 - Length(dira[cnt])));
  158.       x := x + 15;
  159.       IF x > 60 THEN BEGIN
  160.         x := 11; Inc (y);
  161.       END;
  162.     END;
  163.   END ELSE BEGIN
  164.     GotoXY (11,10);
  165.     Write ('No files found.');
  166.   END;
  167. END;
  168.  
  169. FUNCTION GetDir : STRING;
  170. VAR xpos, ypos : BYTE;
  171. BEGIN
  172.   marked := 1;  xpos := WhereX;  ypos := WhereY;
  173.   path := getdd + ':\' + mask;  store;  hidecur;
  174.   dir;  att := TRUE;  first := 1;  fill;
  175.   REPEAT
  176.     c1 := ReadKey;
  177.     IF c1 = #0 THEN BEGIN
  178.       c1 := ReadKey;
  179.       CASE c1 OF
  180.         'K': IF marked > first THEN Dec (marked);
  181.         'M': IF (marked < max) AND
  182.                 (marked < 35 + first) THEN Inc (marked);
  183.         'H': BEGIN
  184.                IF (first-1 < marked) AND
  185.                   (first+4 > marked) THEN BEGIN
  186.                  IF marked-3 > 1 THEN BEGIN
  187.                    Dec (first,4); Dec (marked,4);
  188.                    Window; fill;
  189.                  END;
  190.                END ELSE BEGIN
  191.                  IF marked > 3 + first THEN
  192.                    Dec (marked, 4);
  193.                END;
  194.              END;
  195.         'P': BEGIN
  196.                IF (first+31 < marked) AND
  197.                   (first+36 > marked) THEN BEGIN
  198.                  IF marked+4 < max THEN BEGIN
  199.                    Inc (first,4);  Inc (marked,4);
  200.                    Window; fill;
  201.                  END ELSE BEGIN
  202.                    IF marked <> max THEN BEGIN
  203.                      Inc (first,4); marked := max;
  204.                      Window; fill;
  205.                    END;
  206.                  END;
  207.                END ELSE BEGIN
  208.                  IF (marked <= max - 4) AND
  209.                     (marked <= 31 + first) THEN
  210.                    Inc(marked,4)
  211.                  ELSE IF marked > max-4 THEN marked := max;
  212.                END;
  213.              END;
  214.       END;
  215.     END ELSE BEGIN
  216.       CASE c1 OF
  217.         #13: BEGIN
  218.                IF dira[marked][Length(dira[marked])] = '\'
  219.                  THEN BEGIN
  220.                  IF dira[marked] <> '.\' THEN BEGIN
  221.                    IF dira[marked] = '..\' THEN BEGIN
  222.                      IF path <> mask THEN BEGIN
  223.                        count := Length(path)-Length(mask)-1;
  224.                        WHILE (path [count] <> '\') DO
  225.                          Dec (count);
  226.                        Delete(path, count, Length(path) -
  227.                               Length(mask) - count);
  228.                      END;
  229.                    END ELSE BEGIN
  230.                      next := dira[marked];
  231.                      Delete(next, Length(next), 1);
  232.                      att := TRUE;  next := '\' + next;
  233.                      Insert(next, path, Length(path) -
  234.                                         Length(mask));
  235.                    END;
  236.                    att := TRUE;  marked := 1;
  237.                    dir;  fill;
  238.                  END;
  239.                END ELSE BEGIN
  240.                  GetDir := Copy(path, 1, Length(path) -
  241.                                Length(mask)) + dira[marked];
  242.                  GotoXY(xpos,ypos); restore; showcur;
  243.                  Exit;
  244.                END;
  245.              END;
  246.       END;
  247.     END;
  248.     fill;
  249.   UNTIL c1 = #27;
  250.   GetDir := '<ESC>';
  251.   GotoXY(xpos,ypos); restore; showcur;
  252. END;
  253.  
  254. BEGIN
  255.   mask := '*.*'
  256. END.
  257. (* ------------------------------------------------------ *)
  258. (*                 Ende von DIRWIN.PAS                    *)