home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* BOXERG.PAS *)
- (* Turbo-Pascal-Unit für BOX.PAS *)
- (* (c) 1991 Achim Bergmeister & TOOLBOX *)
- (* ------------------------------------------------------ *)
- UNIT BoxErg;
-
- INTERFACE
-
- USES Dos,Crt;
-
- TYPE s12 = STRING[12];
- s80 = STRING[80];
- Schirm = ARRAY [1..25,1..80] OF
- RECORD ch: CHAR; Attr: BYTE; END;
-
- VAR Screen: Schirm ABSOLUTE $B800:0;
- SMem : Schirm;
-
- PROCEDURE Invers;
- PROCEDURE Normal;
- PROCEDURE Print (x,y: INTEGER; s: s80);
- PROCEDURE PrintF (x,y: INTEGER; s: s80);
- PROCEDURE Rahmen (x1,y1,x2,y2,Art: INTEGER);
- PROCEDURE GetCode (VAR Code: INTEGER);
- PROCEDURE WrtXY (x,y: BYTE; s: s80);
- PROCEDURE CursorDick;
- PROCEDURE CursorNormal;
- PROCEDURE CursorAus;
- PROCEDURE HoleDatei (x1,y1,Laenge: INTEGER; VAR WahlDatei: s12);
-
- IMPLEMENTATION
-
- PROCEDURE GetCode (VAR Code: INTEGER);
- VAR ch : CHAR;
- BEGIN
- ch := ReadKey;
- IF ch = #0 THEN Code := (Ord(ReadKey)+1000)
- ELSE Code := Ord(ch);
- END;
-
- PROCEDURE WrtXY (x,y: BYTE; s: s80);
- VAR i: BYTE;
- BEGIN
- Dec (x);
- FOR i := 1 TO Length(s) DO
- BEGIN
- Screen [y,x+i].ch := s[i];
- Screen [y,x+i].Attr := TextAttr;
- END;
- END;
-
- PROCEDURE Rahmen (x1,y1,x2,y2,Art: INTEGER);
- VAR i: BYTE; k: STRING[8];
- BEGIN
- CASE Art OF
- 1 : k := #218#191#192#217#196#196#179#179;
- 2 : k := #201#187#200#188#205#205#186#186;
- 3 : k := #218#220#192#219#196#220#179#219;
- END;
- Window (x1,y1,x2,y2); ClrScr; Window (1,1,80,25);
- WrtXY (x1,y1,k[1]); WrtXY (x2,y1,k[2]);
- WrtXY (x1,y2,k[3]); WrtXY (x2,y2,k[4]);
- FOR i := x1+1 TO x2-1 DO
- BEGIN WrtXY (i,y1,k[5]); WrtXY (i,y2,k[6]); END;
- FOR i := y1+1 TO y2-1 DO
- BEGIN WrtXY (x1,i,k[7]); WrtXY (x2,i,k[8]); END;
- END;
-
- PROCEDURE CursorSetzen (Anfang,Ende: INTEGER);
- VAR r: Registers;
- BEGIN
- r.AH := 1; r.ch := Anfang;
- r.CL := Ende; Intr ($10,r);
- END;
-
- PROCEDURE CursorDick; BEGIN CursorSetzen (4,10); END;
- PROCEDURE CursorNormal; BEGIN CursorSetzen (11,12); END;
- PROCEDURE CursorAus; BEGIN CursorSetzen (-1,-1); END;
-
- PROCEDURE Invers; BEGIN TextAttr := 112; END;
- PROCEDURE Normal; BEGIN TextAttr := 7; END;
-
- PROCEDURE Print (x,y: INTEGER; s: s80);
- BEGIN GotoXY (x,y); Write (s); END;
-
- PROCEDURE PrintF (x,y: INTEGER; s: s80);
- BEGIN Invers; GotoXY (x,y); Write (s); Normal; END;
-
- TYPE s30 = STRING[30];
- Zeilen = ARRAY [1..200] OF s30;
-
- VAR BZeile,DatZeile,Zaehler,j,i,Max,Code : INTEGER;
- Zeile : Zeilen;
- Pfad : PathStr;
- ch : CHAR;
- Dat : s12;
- Gewaehlt : BOOLEAN;
-
- PROCEDURE HoleDatei (x1,y1,Laenge: INTEGER; VAR WahlDatei: s12);
-
- PROCEDURE Down;
- BEGIN
- IF DatZeile < Zaehler THEN
- BEGIN
- Print (1,BZeile,Zeile[DatZeile]);
- IF BZeile < Laenge THEN
- BEGIN
- Inc(DatZeile); Inc(BZeile);
- PrintF (1,BZeile,Zeile[DatZeile]);
- END
- ELSE BEGIN
- Print (1,BZeile,Zeile[DatZeile]);
- Inc(DatZeile); WriteLn;
- PrintF (1,BZeile,Zeile[DatZeile]);
- END;
- END ELSE Write (^G);
- END;
-
- PROCEDURE Up;
- BEGIN
- IF DatZeile > 1 THEN
- BEGIN
- IF BZeile > 1 THEN
- BEGIN
- Print (1,BZeile,Zeile[DatZeile]);
- Dec(DatZeile); Dec(BZeile);
- PrintF (1,BZeile,Zeile[DatZeile]);
- END
- ELSE BEGIN
- Print (1,1,Zeile[DatZeile]); Dec(DatZeile);
- GotoXY (1,1); InsLine;
- PrintF (1,1,Zeile[DatZeile]);
- END;
- END ELSE Write (^G);
- END;
-
- PROCEDURE DDir (VAR Zeile:Zeilen; VAR Zaehler:INTEGER;
- VAR Pfad:PathStr);
- VAR SRec: SearchRec; Nix: BOOLEAN; i: INTEGER;
-
- PROCEDURE QS (links,rechts: INTEGER; VAR Dat: Zeilen);
- VAR i,j: INTEGER; x,y: s30;
- BEGIN
- i := links; j := rechts;
- x := Dat[(links+rechts) DIV 2];
- REPEAT
- WHILE Dat[i] < x DO Inc(i);
- WHILE x < Dat[j] DO Dec(j);
- IF i <= j THEN
- BEGIN
- y := Dat[i]; Dat[i] := Dat[j];
- Dat[j] := y; Inc(i); Dec(j);
- END;
- UNTIL i > j;
- IF links < j THEN QS(links,j,Dat);
- IF links < rechts THEN QS(i,rechts,Dat);
- END;
-
- PROCEDURE Einlesen (Eintrag: SearchRec; x: INTEGER);
- VAR dt: DateTime;
- d1,d2,d3 : STRING[2];
- PPos, i : INTEGER;
- Suffix : STRING[3];
- Dummy : STRING[7];
- BEGIN
- WITH Eintrag DO
- BEGIN
- PPos := Pos ('.',Name); IF PPos <> 0 THEN
- BEGIN
- Suffix := Copy (Name,PPos+1,Length(Name)-PPos);
- Delete (Name,PPos,1+Length(Name)-PPos);
- END ELSE Suffix := '';
- Zeile[x] := Name;
- FOR i := Length(Name) TO 7 DO
- Zeile[x] := Zeile[x] + ' ';
- Zeile[x] := Zeile[x] + '.' + Suffix;
- FOR i := Length(Suffix) TO 3 DO
- Zeile[x] := Zeile[x] + ' ';
- IF (Attr AND Directory) <> 0 THEN
- Zeile[x] := ' ' + Zeile[x] + ' <DIR> '
- ELSE BEGIN
- Str(Size,Dummy);
- WHILE Length(Dummy) < 7 DO Dummy := ' ' + Dummy;
- Zeile[x] := Zeile[x] + Dummy;
- UnpackTime (Time,dt);
- WITH dt DO
- BEGIN
- Str(Day,d1);
- IF Length(d1) < 2 THEN d1 := '0'+d1;
- Str(Month,d2);
- IF Length(d2) < 2 THEN d2 := '0'+d2;
- Str(Year MOD 100,d3);
- END;
- Zeile[x] := Zeile[x]+' '+d1+'.'+d2+'.'+d3;
- END;
- END;
- END;
-
- BEGIN { Ddir }
- Nix := TRUE; Zaehler := 1;
- FOR i := 1 TO 200 DO Zeile[i] := '';
- FindFirst ('*.*',$31,SRec);
- WHILE DosError = 0 DO
- BEGIN
- Einlesen (SRec,Zaehler); FindNext (SRec);
- Nix := FALSE; Inc (Zaehler);
- END;
- IF Nix THEN Zeile[1] := 'Leeres Verzeichnis';
- QS (1,Zaehler,Zeile);
- GetDir (0,Pfad); IF Length(Pfad) = 3 THEN
- BEGIN
- FOR i := 2 TO Zaehler DO Zeile[i-1] := Zeile[i];
- Dec (Zaehler,1);
- END
- ELSE BEGIN
- FOR i := 3 TO Zaehler DO Zeile[i-2] := Zeile[i];
- Dec (Zaehler,2);
- END;
- FOR i := 1 TO Zaehler DO
- IF Copy(Zeile[i],1,1) = ' ' THEN
- Zeile[i] := Copy(Zeile[i],2,Length(Zeile[i])-1)+' ';
- END;
-
- PROCEDURE Aktualisieren (Laenge: INTEGER;
- VAR BZeile,DatZeile: INTEGER);
- VAR a: LONGINT; j,m,d,w: WORD; i: BYTE;
- BEGIN
- ClrScr; DDir (Zeile,Zaehler,Pfad);
- IF (BZeile <= Laenge) AND (DatZeile >= Laenge) THEN
- FOR i := 1 TO Laenge DO
- Print (1,i,Zeile[i+(DatZeile-BZeile)])
- ELSE IF (BZeile < Laenge) AND (Zaehler >= Laenge) THEN
- FOR i := 1 TO Laenge DO Print (1,i,Zeile[i])
- ELSE IF (BZeile < Laenge) AND (Zaehler < Laenge) THEN
- FOR i := 1 TO Zaehler DO Print (1,i,Zeile[i]);
- BZeile := 1; DatZeile := 1;
- PrintF (1,BZeile,Zeile[DatZeile]);
- Window (1,1,80,25);
- IF Length(Pfad) > 3 THEN Pfad := Pfad+'\';
- GotoXY (x1+1,y1); Write (Pfad,'*.*');
- FOR i := Length(Pfad)+4 TO 32 DO Write (Chr(205));
- Window (x1+2,y1+1,x1+32,y1+Laenge);
- END;
-
- PROCEDURE Markieren (VAR WahlDatei: s12;
- y,z: INTEGER;x1,y1: INTEGER );
- VAR Dummy : s12; Attr : WORD; i : BYTE; f: FILE;
- BEGIN
- GotoXY (1,y); Write (Zeile[z]); Normal;
- Dummy := Copy (Zeile[z],1,12); WahlDatei := '';
- FOR i := 1 TO 12 DO
- IF Dummy[i] > ' ' THEN
- WahlDatei := WahlDatei + Dummy[i];
- Gewaehlt := TRUE;
- IF WahlDatei[Length(WahlDatei)] = '.' THEN
- BEGIN
- WahlDatei := Copy (WahlDatei,1,Length(WahlDatei)-1);
- Assign (f,WahlDatei); GetFAttr (f,Attr);
- IF Attr AND Directory <> 0 THEN
- BEGIN
- IF WahlDatei = '.' THEN ChDir ('..')
- ELSE ChDir (WahlDatei);
- Aktualisieren (Laenge,BZeile,DatZeile);
- Gewaehlt := FALSE; WahlDatei := '';
- END;
- END;
- END;
-
- BEGIN
- BZeile := 1; DatZeile := 1;
- CursorAus; Gewaehlt := FALSE;
- SMem := Screen; Window (x1,y1,x1+33,y1+1+Laenge); ClrScr;
- Window (1,1,80,25); Rahmen (x1,y1,x1+33,y1+1+Laenge,2);
- Window (x1+2,y1+1,x1+32,y1+Laenge);
- Aktualisieren (Laenge,BZeile,DatZeile);
- REPEAT
- GetCode (Code);
- CASE Code OF
- 13 : Markieren (WahlDatei,BZeile,DatZeile,1,y1);
- 1080 : Down;
- 1072 : Up;
- 1081 : FOR j := 1 TO Laenge-1 DO
- IF DatZeile < Zaehler THEN Down;
- 1073 : FOR j := 1 TO Laenge-1 DO
- IF DatZeile > 1 THEN Up;
- 1079 : IF Zaehler <= Laenge THEN
- BEGIN
- Print (1,BZeile,Zeile[DatZeile]);
- DatZeile := Zaehler; BZeile := DatZeile;
- PrintF (1,BZeile,Zeile[DatZeile]);
- END
- ELSE BEGIN
- FOR i := 1 TO Laenge DO
- Print (1,i,Zeile[Zaehler-Laenge+i]);
- DatZeile := Zaehler; BZeile := Laenge;
- PrintF (1,BZeile,Zeile[DatZeile]);
- END;
- 1071 : BEGIN
- IF Zaehler < Laenge THEN Max := Zaehler
- ELSE Max := Laenge;
- FOR i := 1 TO Max DO Print (1,i,Zeile[i]);
- DatZeile := 1; BZeile := 1;
- PrintF (1,BZeile,Zeile[DatZeile]);
- END;
- END;
- UNTIL Gewaehlt OR (Code = 27);
- Window (1,1,80,25); CursorNormal; Screen := SMem;
- END;
-
- END.
- (* ------------------------------------------------------ *)
- (* Ende von BOXERG.PAS *)
-
-
-