home *** CD-ROM | disk | FTP | other *** search
-
- UNIT DIRBOXG;
-
- INTERFACE
-
- {
- FILE- SELECTOR- BOX AEHNLICH DER IM TURBO- PASCAL 4 EDITOR
-
- AUS C'T 12/88
- DENNIS HERZBERG
- }
-
- USES TPCRT,DOS,GRAPH,GRAPHWIN,TPDOS;
-
- CONST NOATTR = $FF;
- WWID = 3; { BREITE DES FENSTERS }
- WHIG = 8; { HÖHE DES FENSTERS }
-
- NONSEL = $07; { TEXTATTRIBUT NICHT SELEKTIERT }
- SELECT = $09; { TEXTATTRIBUT SELEKTIERT }
- WILLNICHT : ARRAY[1..5] OF STRING[12] = ('','','','','');
-
- TYPE STR6 = STRING[6];
- STR12 = STRING[12];
- STR80 = STRING[80];
- DIRPTR = ^DIRREC;
- DIRREC = RECORD
- NAME : STR12;
- ATTR : BYTE;
- TIME,SIZE : LONGINT;
- NEXT : DIRPTR;
- END;
-
-
- FUNCTION STRTOATTR(ST:STR6):BYTE;
- FUNCTION ATTRTOSTR(ATTR:BYTE):STR6;
- PROCEDURE READDIR(PATH:STRING;JA,NEIN:BYTE;VAR FEHLER:BYTE;
- VAR ANZAHL:WORD;VAR START:DIRPTR);
- PROCEDURE FREEDIR(VAR DP:DIRPTR);
- FUNCTION SELECTDIRREC(TITEL:STR80;START:DIRPTR;MAXANZ:WORD):DIRPTR;
- FUNCTION SELECTFILE(PTH,NAME:STRING):STRING;
-
-
- IMPLEMENTATION
-
-
- VAR REGS : REGISTERS;
-
-
- FUNCTION UPSTR(ST : STRING):STRING;
- VAR I : BYTE;
- BEGIN { UPSTR }
- FOR I := 1 TO LENGTH(ST) DO ST[I] := UPCASE(ST[I]);
- UPSTR := ST;
- END; { UPSTR }
-
-
- FUNCTION STRTOATTR(ST:STR6):BYTE;
- VAR B : BYTE;
- BEGIN { STRTOATTR }
- B := 0;
- ST := UPSTR(ST);
- IF POS('R',ST) > 0 THEN B := B + READONLY;
- IF POS('H',ST) > 0 THEN B := B + HIDDEN;
- IF POS('A',ST) > 0 THEN B := B + ARCHIVE;
- IF POS('S',ST) > 0 THEN B := B + SYSFILE;
- IF POS('D',ST) > 0 THEN B := B + DIRECTORY;
- IF POS('V',ST) > 0 THEN B := B + VOLUMEID;
- IF B = 0 THEN B := NOATTR;
- STRTOATTR := B;
- END; { STRTOATTR }
-
-
- FUNCTION ATTRTOSTR(ATTR:BYTE):STR6;
- VAR ST : STR6;
- BEGIN { ATTRTOSTR }
- IF (ATTR AND READONLY ) = 0 THEN ST := '-' ELSE ST := 'R';
- IF (ATTR AND HIDDEN ) = 0 THEN ST := ST + '-' ELSE ST := ST + 'H';
- IF (ATTR AND ARCHIVE ) = 0 THEN ST := ST + '-' ELSE ST := ST + 'A';
- IF (ATTR AND SYSFILE ) = 0 THEN ST := ST + '-' ELSE ST := ST + 'S';
- IF (ATTR AND DIRECTORY) = 0 THEN ST := ST + '-' ELSE ST := ST + 'D';
- IF (ATTR AND VOLUMEID ) = 0 THEN ST := ST + '-' ELSE ST := ST + 'V';
- ATTRTOSTR := ST;
- END; { ATTRTOSTR }
-
-
- FUNCTION EXPAND(NAME : STR12):STR12;
- VAR A,B : BYTE;
- S : STR12;
- BEGIN { EXPAND }
- A := POS('.',NAME);
- IF A > 1 THEN BEGIN
- S := '';
- FOR B := A TO 8 DO S := S + ' ';
- INSERT(S,NAME,A);
- END;
- EXPAND := NAME;
- END; { EXPAND }
-
-
- PROCEDURE READDIR(PATH:STRING;JA,NEIN:BYTE;VAR FEHLER:BYTE;
- VAR ANZAHL:WORD;VAR START:DIRPTR);
- VAR EINTRAG : SEARCHREC;
- NEU : DIRPTR;
- I : WORD;
-
- PROCEDURE INSERTLIST(VAR ALT,NEU:DIRPTR);
- VAR P : POINTER;
- BEGIN
- IF ALT = NIL THEN ALT := NEU
- ELSE BEGIN
- IF ALT^.NAME > NEU^.NAME THEN BEGIN
- P := ALT; ALT := NEU; NEU^.NEXT := P;
- END ELSE
- IF ALT^.NEXT = NIL THEN ALT^.NEXT := NEU
- ELSE INSERTLIST(ALT^.NEXT,NEU);
- END;
- END; { INSERTLIST }
-
- FUNCTION TEST(VAR EINTRAG:SEARCHREC):BOOLEAN;
- VAR I : BYTE;
- BEGIN
- TEST := FALSE;
- WITH EINTRAG DO BEGIN
- FOR I := 1 TO 10 DO BEGIN
- IF (WILLNICHT[I] <> '') AND
- (POS(WILLNICHT[I],NAME) <> 0) THEN EXIT;
- END;
- TEST := (((ATTR AND JA) = JA) OR (JA = NOATTR)) AND
- (((ATTR AND NEIN) = 0) OR (NEIN = NOATTR)) AND
- (NAME <> '.');
- END; { WITH EINTRAG }
- END; { TEST }
-
- PROCEDURE SPEICHERN;
- BEGIN
- IF (EINTRAG.ATTR = DIRECTORY) AND (EINTRAG.NAME[1] <> ' ') THEN BEGIN
- IF LENGTH(EINTRAG.NAME) = 12 THEN DELETE(EINTRAG.NAME,9,1);
- IF EINTRAG.NAME = '..' THEN INSERT(' ',EINTRAG.NAME,1)
- ELSE INSERT('\',EINTRAG.NAME,1);
- END;
- INC(ANZAHL);
- NEW(NEU);
- WITH NEU^ DO BEGIN
- NAME := EINTRAG.NAME; ATTR := EINTRAG.ATTR;
- TIME := EINTRAG.TIME; SIZE := EINTRAG.SIZE;
- NEXT := NIL;
- END; { WITH }
- INSERTLIST(START,NEU);
- END; { SPEICHERN }
-
- BEGIN { READDIR }
- ANZAHL := 0;
- I := LENGTH(PATH);
- WHILE (I > 1) AND (PATH[I] <> '\') DO DEC(I);
-
- FINDFIRST(COPY(PATH,1,I)+'*.*',DIRECTORY,EINTRAG);
- FEHLER := DOSERROR;
- WHILE FEHLER = 0 DO BEGIN
- IF (FEHLER = 0) AND
- (EINTRAG.ATTR = DIRECTORY) AND
- (EINTRAG.NAME <> '.') THEN SPEICHERN;
- FINDNEXT(EINTRAG);
- FEHLER := DOSERROR;
- END; { WHILE }
-
- EINTRAG.ATTR := DIRECTORY;
- IF I <= 3 THEN BEGIN
- EINTRAG.NAME := ' A:';
- FOR I := 1 TO NUMBEROFDRIVES DO BEGIN
- EINTRAG.NAME[2] := CHR(I+$40);
- SPEICHERN;
- END; { NEXT I }
- END;
-
- FINDFIRST(PATH,ANYFILE,EINTRAG);
- FEHLER := DOSERROR;
- WHILE FEHLER = 0 DO BEGIN
- IF (FEHLER = 0) AND TEST(EINTRAG) THEN SPEICHERN;
- FINDNEXT(EINTRAG);
- FEHLER := DOSERROR;
- END; { WHILE }
- END; { READDIR }
-
-
- PROCEDURE FREEDIR(VAR DP:DIRPTR);
- BEGIN { FREEDIR }
- IF DP <> NIL THEN BEGIN
- FREEDIR(DP^.NEXT);
- DISPOSE(DP);
- END;
- END; { FREEDIR }
-
-
- PROCEDURE CLS;
- VAR TA : BYTE;
- BEGIN
- TA := TEXTATTR;
- TEXTCOLOR(TA SHR 4);
- CLRSCR;
- TEXTATTR := TA;
- END;
-
-
- FUNCTION SELECTDIRREC(TITEL:STR80;START:DIRPTR;MAXANZ:WORD):DIRPTR;
- VAR ZEILE,SPALTE,XPOS,YPOS,
- TAALT,AUSSCHN,MAXAUSSCHN : BYTE;
- WO,WU,I : WORD;
- ANZAHL : INTEGER;
- ENDE : BOOLEAN;
- CH1,CH2 : CHAR;
- ST : STRING[14];
- P : DIRPTR;
- POINTERLIST : ARRAY[0..WWID,1..WHIG] OF DIRPTR;
-
- PROCEDURE BILDAUFBAU;
- VAR I,S,Z : WORD;
- TEST : BOOLEAN;
- BEGIN
- FOR S := 0 TO WWID DO
- FOR Z := 1 TO WHIG DO
- POINTERLIST[S,Z] := NIL;
- TEXTATTR := NONSEL;
- P := START; S := 0; Z := 1;
- CLS;
-
- FOR I := 1 TO AUSSCHN * SUCC(WWID) DO P := P^.NEXT;
- REPEAT
- GOTOXY(3+S*16,Z);
- POINTERLIST[S,Z] := P;
- IF (P^.ATTR AND DIRECTORY) = DIRECTORY
- THEN WRITE(P^.NAME,'\')
- ELSE WRITE(EXPAND(P^.NAME));
- TEST := (P^.NEXT = NIL) OR ((Z = WHIG) AND (S = WWID));
- IF NOT TEST THEN BEGIN
- P := P^.NEXT;
- INC(S);
- IF S = SUCC(WWID) THEN BEGIN
- S := 0;
- INC(Z);
- END;
- END;
- UNTIL TEST;
- END; { BILDAUFBAU }
-
- PROCEDURE AUFWAERTS;
- BEGIN
- IF ZEILE > 1 THEN DEC(ZEILE)
- ELSE IF AUSSCHN > 0 THEN BEGIN
- DEC(AUSSCHN);
- BILDAUFBAU;
- END;
- END;
-
- PROCEDURE ABWAERTS;
- BEGIN
- IF ZEILE < WHIG THEN BEGIN
- IF (ZEILE*SUCC(WWID)+SUCC(SPALTE)) <= MAXANZ THEN INC(ZEILE);
- END ELSE IF AUSSCHN < MAXAUSSCHN THEN BEGIN
- INC(AUSSCHN);
- BILDAUFBAU;
- END;
- WHILE POINTERLIST[SPALTE,ZEILE] = NIL DO DEC(SPALTE);
- END;
-
- BEGIN { SELECTDIRREC }
- SELECTDIRREC := NIL;
- IF START = NIL THEN EXIT;
- TAALT := TEXTATTR; TEXTATTR := NONSEL;
- WO := WINDMIN; WU := WINDMAX; XPOS := WHEREX; YPOS := WHEREY;
-
- GOTOXY(1,1); CLREOL;
- GOTOXY((LO(WU)-LO(WO)-LENGTH(TITEL)+4) SHR 1,1);
- TEXTATTR := TEXTATTR XOR($F0);
- WRITE(TITEL);
- TEXTATTR := TEXTATTR XOR($F0);
- WINDOW(SUCC(LO(WO)),HI(WO)+2,SUCC(LO(WU)),SUCC(HI(WU)));
-
- ZEILE := 1; SPALTE := 0; AUSSCHN := 0;
- P := START; ANZAHL := 1;
- WHILE P^.NEXT <> NIL DO BEGIN
- INC(ANZAHL);
- P := P^.NEXT;
- END; { WHILE }
- ANZAHL := ANZAHL - (SUCC(WWID) * WHIG);
- IF ANZAHL < 1 THEN MAXAUSSCHN := 0 ELSE BEGIN
- MAXAUSSCHN := ANZAHL DIV SUCC(WWID);
- IF ANZAHL MOD SUCC(WWID) > 0 THEN INC(MAXAUSSCHN);
- END;
- BILDAUFBAU;
- ENDE := FALSE;
-
- REPEAT
- GOTOXY(2+SPALTE*16,ZEILE); TEXTATTR := SELECT;
- WITH POINTERLIST[SPALTE,ZEILE]^ DO
- IF (ATTR AND DIRECTORY) = DIRECTORY
- THEN ST := ' '+NAME+'\'
- ELSE ST := ' '+EXPAND(NAME);
- WRITE(ST,' ':14-LENGTH(ST));
- CH1 := READKEY; IF CH1 = #0 THEN CH2 := READKEY ELSE CH2 := #0;
- CASE CH1 OF
- #27 : BEGIN { ESC }
- SELECTDIRREC := NIL;
- ENDE := TRUE;
- END;
- #13 : BEGIN { ENTER }
- SELECTDIRREC := POINTERLIST[SPALTE,ZEILE];
- ENDE := TRUE;
- END;
- #0 : BEGIN { FUNKTIONSTASTE }
- IF (CH2 <> #73) AND (CH2 <> #81) THEN BEGIN
- GOTOXY(2+SPALTE*16,ZEILE);
- TEXTATTR := NONSEL;
- WITH POINTERLIST[SPALTE,ZEILE]^ DO
- IF (ATTR AND DIRECTORY) = DIRECTORY
- THEN ST := ' '+NAME+'\'
- ELSE ST := ' '+EXPAND(NAME);
- WRITE(ST,' ':14-LENGTH(ST));
- END;
- END;
- END; { CASE CH1 }
- CASE CH2 OF
- #72 : BEGIN { AUF }
- AUFWAERTS;
- END;
- #80 : BEGIN { AB }
- ABWAERTS;
- END;
- #75 : BEGIN { LINKS }
- IF SPALTE > 0 THEN DEC(SPALTE) ELSE BEGIN
- IF (ZEILE + AUSSCHN) > 1 THEN BEGIN
- AUFWAERTS;
- SPALTE := WWID;
- END;
- END;
- END;
- #77 : BEGIN { RECHTS }
- IF SPALTE < WWID THEN BEGIN
- IF POINTERLIST[SUCC(SPALTE),ZEILE] <> NIL THEN INC(SPALTE);
- END ELSE BEGIN
- SPALTE := 0;
- ABWAERTS;
- END;
- END;
- #73 : BEGIN { PG UP }
- IF AUSSCHN > 0 THEN BEGIN
- DEC(AUSSCHN);
- BILDAUFBAU;
- END;
- END;
- #81 : BEGIN { PG DOWN }
- IF AUSSCHN < MAXAUSSCHN THEN BEGIN
- INC(AUSSCHN);
- BILDAUFBAU;
- WHILE POINTERLIST[SPALTE,ZEILE] = NIL DO DEC(SPALTE);
- END;
- END;
- #71 : BEGIN { HOME }
- ZEILE := 1;
- SPALTE := 0;
- IF AUSSCHN > 0 THEN BEGIN
- AUSSCHN := 0;
- BILDAUFBAU;
- END;
- END;
- #79 : BEGIN { END }
- IF AUSSCHN < MAXAUSSCHN THEN BEGIN
- AUSSCHN := MAXAUSSCHN;
- BILDAUFBAU;
- END;
- ZEILE := WHIG;
- SPALTE := 0;
- WHILE POINTERLIST[SPALTE,ZEILE] = NIL DO DEC(ZEILE);
- SPALTE := WWID;
- WHILE POINTERLIST[SPALTE,ZEILE] = NIL DO DEC(SPALTE);
- END;
- END; { CASE CH2 }
- UNTIL ENDE;
-
- WINDOW(SUCC(LO(WO)),SUCC(HI(WO)),SUCC(LO(WU)),SUCC(HI(WU)));
- GOTOXY(XPOS,YPOS);
- TEXTATTR := TAALT;
- END; { SELECTDIRREC }
-
-
- FUNCTION SELECTFILE(PTH,NAME:STRING):STRING;
- VAR EXECOM,DATEI : DIRPTR;
- I,DMB,DIRATTR,
- SP,TA : BYTE;
- DMW : WORD;
- PATH,DATEINAME,
- S1 : STRING;
- DIRECTORY : BOOLEAN;
- CH : CHAR;
-
- BEGIN { SELECTFILE }
- SELECTFILE := '';
-
- EXECOM := NIL;
- DIRATTR := STRTOATTR('D');
- IF PTH = '' THEN GETDIR(0,PATH) ELSE PATH := PTH;
- REPEAT
- IF PATH[LENGTH(PATH)] <> '\' THEN PATH := PATH + '\';
- FREEDIR(EXECOM);
- EXECOM := NIL;
- TA := TEXTATTR;
- TEXTATTR := $4E;
- GOTOXY(2,1);
- WRITE(' warten ');
- TEXTATTR := TA;
- READDIR(PATH+NAME,NOATTR,VOLUMEID,DMB,DMW,EXECOM);
-
- STR(DMW,S1);
- DATEI := SELECTDIRREC(' '+PATH+NAME+' '+S1+' Files ',EXECOM,DMW);
-
- IF DATEI = NIL THEN BEGIN
- IF DMW = 0 THEN BEGIN
- CH := READKEY; IF CH = #0 THEN CH := READKEY;
- END;
- EXIT;
- END;
-
- DIRECTORY := (DATEI^.ATTR AND DIRATTR) <> 0;
- { BEI NAME[1] = ' ' HANDELT ES SICH UM EINE LAUFWERKSBEZEICHNUNG }
- IF DATEI^.NAME[1] = ' ' THEN BEGIN
- DELETE(DATEI^.NAME,1,1);
- IF DATEI^.NAME <> '..' THEN PATH := '';
- END;
- { DIRECTORIES SIND MIT NAME[1] = '\' MARKIERT }
- IF DATEI^.NAME[1] = '\' THEN BEGIN
- DELETE(DATEI^.NAME,1,1);
- IF LENGTH(DATEI^.NAME) > 8 THEN INSERT('.',DATEI^.NAME,9);
- END;
- PATH := PATH + DATEI^.NAME;
-
- IF (DATEI^.NAME = '..') THEN BEGIN
- SP := LENGTH(PATH) - 3;
- PATH := COPY(PATH,1,SP);
- WHILE PATH[SP] <> '\' DO DEC(SP);
- PATH := COPY(PATH,1,PRED(SP));
- END;
-
- UNTIL (NOT DIRECTORY);
- SELECTFILE := PATH;
- END; { SELECTFILE }
-
-
- END.
-