Teams (I-Man/Pete) (Login The-Universe)
Admin
Posted Sep 15, 2007 1:04 AM
Just a raw project that I ran out of time on and only tested in one directory. I'll be happy to fix any problems if you let me know about them. Basically this is the inturrupt routine Ildurest created and posted on the main forum with a few simple bells and whistles added to give the user the start of an actual scrolling file explorer tool.
CAUTION: This program will erase and replace:
myFiles.tmp
myDirs.tmp
myCombs.tmp
IMPORTANT: This routine requires QB45 and up.
-------------------------------------------------------------------------------
DECLARE SUB Main ()
DECLARE SUB Skin ()
TYPE RegType
AX AS INTEGER
BX AS INTEGER
CX AS INTEGER
DX AS INTEGER
BP AS INTEGER
SI AS INTEGER
DI AS INTEGER
FLAGS AS INTEGER
END TYPE
TYPE DTABuffer
Reserved AS STRING * 21
Attr AS STRING * 1
Time AS INTEGER
Date AS INTEGER
Size AS LONG
Name1 AS STRING * 13
END TYPE
SCREEN 0, 0, 0, 0
LOCATE , , 0
CHDIR "c:\qb45"
DIM SHARED R AS RegType, R2 AS RegType
DIM SHARED DTA AS DTABuffer
DIM SHARED Filespec AS STRING * 13
CALL Skin
CALL Main
SUB Main
REDIM tab1(4)
tab1(1) = 5
tab1(2) = 46
tab1(3) = 54
tab1(4) = 67
DirID$ = " [Folder]"
CONST alen% = 71: REM tab1(4) + 10 - tab1(1)
DIM Entry AS STRING * alen
R.AX = &H1A00
R.DX = VARPTR(DTA)
CALL INTERRUPT(&H21, R, R2)
Filespec = "*.*"
R.AX = &H4E00
R.CX = 1 + 2 + 4 + 16 + 32
R.DX = VARPTR(Filespec)
CALL INTERRUPT(&H21, R, R)
COLOR 4, 0
LOCATE 3, tab1(1)
PRINT "<File Name>";
LOCATE , tab1(2) - 5
PRINT "<Size>";
LOCATE , tab1(3) + 2
PRINT "<Date>";
LOCATE , tab1(4) + 2
PRINT "<Time>"
COLOR 7, 0
VP1% = 4: VP2% = 22
PCOPY 0, 1: SCREEN 0, 0, 1, 0
VIEW PRINT VP1% TO VP2%
ff1% = FREEFILE: OPEN "myfiles.tmp" FOR OUTPUT AS ff1%: CLOSE #ff1%
ff1% = FREEFILE: OPEN "myfiles.tmp" FOR RANDOM AS ff1% LEN = alen
ff2% = FREEFILE: OPEN "myDirs.tmp" FOR OUTPUT AS ff2%: CLOSE #ff2%
ff2% = FREEFILE: OPEN "myDirs.tmp" FOR RANDOM AS ff2% LEN = alen
DO
GOSUB GetDTA
IF (R.AX AND 255) <> 0 AND task% = 0 THEN IF task% = 0 THEN task% = 1
IF FileName$ <> "" OR task% = 1 THEN
IF task% = 0 THEN GOSUB StoreDTA ELSE GOSUB PrintDTA
IF task% = 1 THEN
IF CSRLIN = VP2% THEN
IF Combine% = 1 THEN PCOPY 1, 0: SCREEN 0, 0, 0, 0: VIEW PRINT VP1% TO VP2%: Combine% = -2
DO
DO
Key$ = INKEY$
IF Key$ = CHR$(27) THEN COLOR 15, 1: SYSTEM
IF Key$ = CHR$(0) + "H" OR Key$ = CHR$(0) + "P" THEN EXIT DO
LOOP
SELECT CASE Key$
CASE CHR$(0) + "H": GOSUB ScrollUp
CASE CHR$(0) + "P": GOSUB Start
END SELECT
LOOP
END IF
END IF
END IF
Start:
IF task% = 0 THEN
R.AX = &H4F00
R.CX = 1 + 2 + 4 + 16 + 32
CALL INTERRUPT(&H21, R, R)
ELSE
IF CSRLIN = VP2% AND ii% <> noe% THEN
PRINT
LOCATE VP2%, 1: COLOR 4, 0: PRINT CHR$(179); : LOCATE , 80: PRINT CHR$(179); : LOCATE VP2%, 1: COLOR 7, 0
ELSE
IF ii% <> noe% THEN PRINT
END IF
END IF
DirectoryName$ = "": FileName$ = ""
LOOP
SYSTEM
GetDTA:
IF ASC(DTA.Attr) AND 16 THEN
DirectoryName$ = DTA.Name1
IF MID$(DirectoryName$, 1, 2) <> "." + CHR$(0) AND MID$(DirectoryName$, 1, 3) <> ".." + CHR$(0) THEN
FileName$ = DTA.Name1
IF INSTR(FileName$, CHR$(0)) <> 0 THEN FileName$ = MID$(FileName$, 1, INSTR(FileName$, CHR$(0)) - 1)
FileName$ = FileName$ + DirID$
ELSE
FileName$ = ""
END IF
ELSE
FileName$ = DTA.Name1 + SPACE$(LEN(DirID$))
END IF
FileSize = DTA.Size / 1000
IF FileSize <> 0 AND FileSize < 1 THEN FileSize = 1
FileSize$ = LTRIM$(STR$(CINT(FileSize)))
FileYear$ = LTRIM$(STR$((DTA.Date AND &HFE00) \ 512 + 1980))
FileMonth$ = LTRIM$(STR$((DTA.Date AND 480) \ 32))
IF LEN(FileMonth$) = 1 THEN FileMonth$ = " " + FileMonth$
FileDay$ = LTRIM$(STR$((DTA.Date AND 31)))
IF LEN(FileDay$) = 1 THEN FileDay$ = "0" + FileDay$
FileHours$ = LTRIM$(STR$((PEEK(VARPTR(DTA.Time) + 1) AND &HF8) \ 8))
IF VAL(FileHours$) > 12 THEN FileHours$ = LTRIM$(STR$(VAL(FileHours$) - 12)): AMPM$ = "pm" ELSE AMPM$ = "am"
IF LEN(FileHours$) = 1 THEN FileHours$ = " " + FileHours$
FileMinutes$ = LTRIM$(STR$((DTA.Time AND &H7E0) \ &H20))
IF LEN(FileMinutes$) = 1 THEN FileMinutes$ = "0" + FileMinutes$
FileSeconds$ = LTRIM$(STR$((DTA.Time AND &H1F) * 2))
IF LEN(FileSeconds$) = 1 THEN FileSeconds$ = "0" + FileSeconds$
TimeStamp$ = FileHours$ + ":" + FileMinutes$ + ":" + FileSeconds$ + AMPM$
DateStamp$ = FileMonth$ + "-" + FileDay$ + "-" + FileYear$
RETURN
StoreDTA:
noe% = noe% + 1
MID$(Entry$, 1, LEN(FileName$)) = FileName$
MID$(Entry$, tab1(2) - LEN(FileSize$) - tab1(1)) = FileSize$ + " KB"
MID$(Entry$, tab1(3) - tab1(1)) = DateStamp$
MID$(Entry$, tab1(4) - tab1(1)) = TimeStamp$
SELECT CASE LEN(DirectoryName$)
CASE 0: SFD% = SFD% + 1: PUT #ff1%, SFD%, Entry
CASE ELSE: SDD% = SDD% + 1: PUT #ff2%, SDD%, Entry
END SELECT
DirectoryName$ = "": Entry = ""
RETURN
CombineFiles:
CLOSE #ff1%, ff2%
ff1% = FREEFILE: OPEN "myfiles.tmp" FOR RANDOM AS ff1% LEN = alen
ff2% = FREEFILE: OPEN "myDirs.tmp" FOR RANDOM AS ff2% LEN = alen
ff3% = FREEFILE: OPEN "myCombs.tmp" FOR OUTPUT AS ff3%: CLOSE ff3%
ff3% = FREEFILE: OPEN "myCombs.tmp" FOR RANDOM AS ff3% LEN = alen
ii% = 0
DO UNTIL EOF(ff2%)
ii% = ii% + 1
GET #ff2%, ii%, Entry
PUT #ff3%, ii%, Entry
LOOP
jj% = 0
DO UNTIL EOF(ff1%)
jj% = jj% + 1
GET #ff1%, jj%, Entry
PUT #ff3%, ii%, Entry
ii% = ii% + 1
LOOP
CLOSE ff1%, ff2%, ff3%
KILL "myfiles.tmp"
KILL "myDirs.tmp"
NAME "myCombs.tmp" AS "myfiles.tmp"
ff1% = FREEFILE: OPEN "myfiles.tmp" FOR RANDOM AS ff1% LEN = alen
ii% = 0
RETURN
PrintDTA:
IF Combine% = 0 THEN GOSUB CombineFiles: Combine% = 1
IF ii% = noe% THEN RETURN
ii% = ii% + 1
GET #ff1%, ii%, Entry
LOCATE , tab1(1): PRINT Entry;
RETURN
ScrollUp:
IF ii% <= VP2% - VP1% + 1 THEN RETURN
ii% = ii% - (VP2% - VP1% + 1)
LOCATE VP1%
FOR i% = 1 TO (VP2% - VP1% + 1)
GET #ff1%, ii%, Entry
LOCATE , tab1(1): PRINT Entry;
IF CSRLIN <> VP2% THEN PRINT : ii% = ii% + 1
NEXT
LOCATE VP2%, 1
RETURN
END SUB
SUB Skin
COLOR 14, 1
LOCATE 1, 1: PRINT SPACE$(80);
LOCATE 24, 1: PRINT STRING$(80, 196);
LOCATE 2, 1: PRINT STRING$(80, 196);
LOCATE 1, 1
COLOR 11, 1
PZ$ = "QBasic File Explorer": LOCATE , 41 - LEN(PZ$) \ 2: PRINT PZ$;
COLOR 4, 0: LOCATE 3, 1
PRINT CHR$(218); STRING$(78, CHR$(196)); CHR$(191);
LOCATE 23, 1
PRINT CHR$(192); STRING$(78, CHR$(196)); CHR$(217);
LOCATE 4, 1
FOR i = 1 TO 19
LOCATE , 1: PRINT CHR$(179); : LOCATE , 80: PRINT CHR$(179)
NEXT i
COLOR 11, 1: LOCATE 25, 1: PRINT SPACE$(80);
PZ$ = "PRESS THE UP AND DOWN ARROW KEYS TO SCROLL LIST OR PRESS THE ESC KEY TO QUIT"
COLOR 11, 1
LOCATE 25, 41 - LEN(PZ$) \ 2: PRINT PZ$;
COLOR 7, 0
END SUB
--------------------------------------------------------
Pete