FILELIST$ - mkilgore/QB64pe GitHub Wiki

FILELIST$ Function Automatic Setup Version

This version of the FILELIST$ string Function can be set up as a separate Window or be positioned anywhere on program screens larger than 640 X 480. Two position parameters are added to place the top left corner position on a QB64 custom _NEWIMAGE screen. It can be used with ANY screen mode either as a separate window or combined with your program screen! Simply set the parameters to zero if you want to use it as a Window. It will completely restore your program after a file list is displayed. Like the original version, this setup can also be INCLUDEd as a library and supports all of the original file specifications listed on the FILELIST$ (function) page.

Function Window Screenshot
PAINT (799, 599), _RGB(180, 180, 180)
LINE (7, 15)-(648, 496), _RGB(0, 0, 80), BF

LOCATE 33, 10: PRINT "Do you want file display in a new window? (Y/N)"
DO: SLEEP: yesno$ = UCASE$(INKEY$): LOOP UNTIL yesno$ <> ""
IF...THEN yesno$ = "Y" THEN x% = 0: y% = 0 ELSE x% = 8: y% = 16 'set parameters

LOCATE 33, 10: INPUT "Enter a File Type extension(*.BMP, *.TXT, etc): ", spec$
spec$ = UCASE$(spec$)
IF...THEN LEN(spec$) = 0 THEN spec$ = "*.BMP"
'IF...THEN INSTR(spec$, "*.") = 0 THEN spec$ = "*." + spec$

'<<<<<<< If x% and y% parameters are 0, the display is in separate window.>>>>>>
filename$ = FILELIST$(spec$, x%, y%) '<<<<<<<< added display position parameters


LOCATE 35, 10: PRINT filename$, LFN$
SLEEP
'------------------------------------- END DEMO CODE -------------------------------
 '' ''
[[FUNCTION|FUNCTION]] FILELIST$ (Spec$, xpos%, ypos%)
[[SHARED|SHARED]] Path$, LFN$ 'values also accessable by program
[[REDIM|REDIM]] LGFN$(25), SHFN$(25), Last$(25), DIR$(25), Paths$(25) '<<<< [[$DYNAMIC|$DYNAMIC]] only
[[IF...THEN|IF]] [[LEN|LEN]]([[ENVIRON$|ENVIRON$]]("OS")) = 0 [[THEN|THEN]] [[EXIT FUNCTION|EXIT FUNCTION]] 'DIR X cannot be used on Win 9X
f% = [[FREEFILE|FREEFILE]]
[[IF...THEN|IF]] xpos% + ypos% = 0 [[THEN|THEN]] '****************** Root path TITLE in separate window only
  [[SHELL|SHELL]] [[_HIDE|_HIDE]] "CD > D0S-DATA.INF"
  [[OPEN|OPEN]] "D0S-DATA.INF" [[FOR (file statement)|FOR]] [[INPUT (file mode)|INPUT]] [[AS|AS]] #f%
  [[LINE INPUT (file statement)|LINE INPUT]] #f%, current$
  [[CLOSE|CLOSE]] #f%
[[END IF|END IF]] ' ******************************************** [[END|END]] TITLE(see [[_TITLE|_TITLE]] below)
Spec$ = [[UCASE$|UCASE$]]([[LTRIM$|LTRIM$]]([[RTRIM$|RTRIM$]](Spec$)))
[[IF...THEN|IF]] [[INSTR|INSTR]](Spec$, "/A:D") [[OR (boolean)|OR]] [[INSTR|INSTR]](Spec$, "/O:G") [[THEN|THEN]]
  DL$ = "DIR": BS$ = "\" 'directory searches only
[[ELSE|ELSE]]: DL$ = [[SPACE$|SPACE$]](3): BS$ = ""
[[END IF|END IF]]
mode& = [[_COPYIMAGE|_COPYIMAGE]](0) 'save previous screen value to restore if files displayed.
' Get Specific file information if available
[[SHELL|SHELL]] [[_HIDE|_HIDE]] "cmd /c dir " + Spec$ + " /X > D0S-DATA.INF" 'get data
Head$ = "      Short Name          Long Name                     Last Modified     "
tmp$ = " \ \  \          \   \                              \ \                  \"
[[OPEN|OPEN]] "D0S-DATA.INF" [[FOR (file statement)|FOR]] [[INPUT (file mode)|INPUT]] [[AS|AS]] #f% 'read the data file
[[DO...LOOP|DO]] [[UNTIL|UNTIL]] [[EOF|EOF]](f%)
  [[LINE INPUT (file statement)|LINE INPUT]] #f%, line$
  [[IF...THEN|IF]] [[INSTR|INSTR]](line$, ":\") [[THEN|THEN]]
    Path$ = [[MID$|MID$]](line$, [[INSTR|INSTR]](line$, ":\") - 1)
    [[IF...THEN|IF]] [[RIGHT$|RIGHT$]](Path$, 1) <> "\" [[THEN|THEN]] Path$ = Path$ + "\"
    setcode% = 0: filecode% = 0
  [[END IF|END IF]]
  [[IF...THEN|IF]] [[LEN|LEN]](line$) > 25 [[AND (boolean)|AND]] [[MID$|MID$]](line$, 1, 1) <> " " [[THEN|THEN]] 'don't read other info
    [[IF...THEN|IF]] format% = 0 [[THEN|THEN]]
      [[IF...THEN|IF]] [[MID$|MID$]](line$, 20, 1) = "M" [[OR (boolean)|OR]] [[INSTR|INSTR]](line$, "<") = 25 [[THEN|THEN]]
        Sst% = 40: Lst% = 53: Dst% = 26: format% = 1 ' XP
      [[ELSE|ELSE]]: Sst% = 37: Lst% = 50: Dst% = 23: format% = 2 'VISTA
      [[END IF|END IF]]
    [[END IF|END IF]]
    [[IF...THEN|IF]] [[LEN|LEN]](line$) >= Lst% [[THEN|THEN]] filecode% = [[ASC|ASC]]([[UCASE$|UCASE$]]([[MID$|MID$]](line$, Lst%, 1))) [[ELSE|ELSE]] filecode% = 0
    D1R$ = [[MID$|MID$]](line$, Dst%, 3) 'returns directories only with Spec$ = "/A:D" or "/O:G"
    [[IF...THEN|IF]] D1R$ <> "DIR" [[THEN|THEN]] D1R$ = [[SPACE$|SPACE$]](3) 'change if anything else
    [[IF...THEN|IF]] D1R$ = DL$ [[AND (boolean)|AND]] filecode% >= setcode% [[THEN|THEN]]
      cnt% = cnt% + 1
      DIR$(cnt%) = D1R$: Paths$(cnt%) = Path$
      Last$(cnt%) = [[MID$|MID$]](line$, 1, 20)
      [[IF...THEN|IF]] [[MID$|MID$]](line$, Sst%, 1) <> [[SPACE$|SPACE$]](1) [[THEN|THEN]]
        SHFN$(cnt%) = [[MID$|MID$]](line$, Sst%, [[INSTR|INSTR]](Sst%, line$, " ") - Sst%)
        LGFN$(cnt%) = [[MID$|MID$]](line$, Lst%)
      [[ELSE|ELSE]]: SHFN$(cnt%) = [[MID$|MID$]](line$, Lst%): LGFN$(cnt%) = ""
      [[END IF|END IF]]
      [[IF...THEN|IF]] [[LEN|LEN]](Spec$) [[AND (boolean)|AND]] (Spec$ = [[UCASE$|UCASE$]](SHFN$(cnt%)) [[OR (boolean)|OR]] Spec$ = [[UCASE$|UCASE$]](LGFN$(cnt%))) [[THEN|THEN]]
        Spec$ = SHFN$(cnt%) + BS$: FILELIST$ = Spec$: LFN$ = LGFN$(cnt%) + BS$
        noshow = -1: [[GOSUB|GOSUB]] KILLdata ' verifies file exist query (no display)
      [[END IF|END IF]]
      [[IF...THEN|IF]] page% > 0 [[THEN|THEN]] ' pages after first
        [[IF...THEN|IF]] cnt% = 1 [[THEN|THEN]] [[GOSUB|GOSUB]] NewScreen
        [[COLOR|COLOR]] 11: [[LOCATE|LOCATE]] , 3: [[PRINT USING|PRINT USING]] tmp$; DIR$(cnt%); SHFN$(cnt%); LGFN$(cnt%); Last$(cnt%)
        [[IF...THEN|IF]] DIR$(cnt%) = "DIR" [[AND (boolean)|AND]] [[LEFT$|LEFT$]](SHFN$(cnt%), 1) = "." [[THEN|THEN]] SHFN$(cnt%) = "": LGFN$(cnt%) = ""
      [[ELSE|ELSE]] 'first page = 0
        [[IF...THEN|IF]] cnt% = 2 [[THEN|THEN]] 'only display to screen if 2 or more files are found
          FList& = [[_NEWIMAGE|_NEWIMAGE]](640, 480, 256)
          [[IF...THEN|IF]] xpos% + ypos% > 0 [[THEN|THEN]] ' user wants display on program screen
            Show& = [[_NEWIMAGE|_NEWIMAGE]](640, 480, 256) '<<<<<< ONSCREEN program displays only
            [[_DEST|_DEST]] FList&
          [[ELSE|ELSE]]: [[SCREEN (statement)|SCREEN]] FList& ' <<<<<<<<< Separate Window
            [[_TITLE|_TITLE]] current$ '<<<<<<<<<<<<<<<<<<<<<<<<<<< TITLE optional
          [[END IF|END IF]]
          [[GOSUB|GOSUB]] NewScreen '<<<< update function's screen with Putimage(see notes)
          [[COLOR|COLOR]] 11: [[LOCATE|LOCATE]] , 3: [[PRINT USING|PRINT USING]] tmp$; DIR$(1); SHFN$(1); LGFN$(1); Last$(1)
          [[IF...THEN|IF]] DIR$(1) = "DIR" [[AND (boolean)|AND]] [[LEFT$|LEFT$]](SHFN$(1), 1) = "." [[THEN|THEN]] SHFN$(1) = "": LGFN$(1) = ""
        [[END IF|END IF]]
        [[IF...THEN|IF]] cnt% > 1 [[THEN|THEN]]
          [[COLOR|COLOR]] 11: [[LOCATE|LOCATE]] , 3: [[PRINT USING|PRINT USING]] tmp$; DIR$(cnt%); SHFN$(cnt%); LGFN$(cnt%); Last$(cnt%)
          [[IF...THEN|IF]] DIR$(cnt%) = "DIR" [[AND (boolean)|AND]] [[LEFT$|LEFT$]](SHFN$(cnt%), 1) = "." [[THEN|THEN]] SHFN$(cnt%) = "": LGFN$(cnt%) = ""
        [[END IF|END IF]]
      [[END IF|END IF]] 'page%
      [[IF...THEN|IF]] cnt% [[MOD|MOD]] 25 = 0 [[THEN|THEN]] 'each page holds 25 file names
        [[COLOR|COLOR]] 14: [[LOCATE|LOCATE]] 28, 24: [[PRINT|PRINT]] "Select file or click here for next.";
        [[GOSUB|GOSUB]] pickfile
        page% = page% + 1: cnt% = 0
        [[REDIM|REDIM]] LGFN$(25), SHFN$(25), Last$(25), DIR$(25), Paths$(25) '<<<< [[$DYNAMIC|$DYNAMIC]] only
      [[END IF|END IF]] 'mod  25
    [[END IF|END IF]] 'DIR = DL$
  [[END IF|END IF]] 'len line$ > 25
[[LOOP|LOOP]]
[[CLOSE|CLOSE]] #f%
last = 1: total% = cnt% + (page% * 25)
[[IF...THEN|IF]] total% = 0 [[THEN|THEN]] FILELIST$ = "": Spec$ = "": LFN$ = "": noshow = -1: [[GOSUB|GOSUB]] KILLdata: 'no files(no display)
[[IF...THEN|IF]] total% = 1 [[THEN|THEN]]   'one file(no display)
  Spec$ = SHFN$(1) + BS$: FILELIST$ = Spec$: LFN$ = LGFN$(1) + BS$: noshow = -1: [[GOSUB|GOSUB]] KILLdata 
[[END IF|END IF]]
[[IF...THEN|IF]] DL$ = [[SPACE$|SPACE$]](3) [[THEN|THEN]]
  [[COLOR|COLOR]] 10: [[LOCATE|LOCATE]] 28, 65: [[PRINT|PRINT]] total%; "Files"
[[ELSE|ELSE]]: [[COLOR|COLOR]] 10: [[LOCATE|LOCATE]] 28, 65: [[PRINT|PRINT]] total%; "Folders"
[[END IF|END IF]]
[[COLOR|COLOR]] 14: [[LOCATE|LOCATE]] 28, 24: [[PRINT|PRINT]] "Select file or click here to Exit. ";
pickfile:
[[_DEST|_DEST]] FList&
ShowPath$ = [[RIGHT$|RIGHT$]](Path$, 78)
[[COLOR|COLOR]] 15: [[LOCATE|LOCATE]] 29, 41 - ([[LEN|LEN]](ShowPath$) \ 2): [[PRINT|PRINT]] ShowPath$;
[[GOSUB|GOSUB]] NewDisplay
DO: Key$ = [[UCASE$|UCASE$]]([[INKEY$|INKEY$]]): [[_LIMIT|_LIMIT]] 30
  [[DO...LOOP|DO]] [[WHILE|WHILE]] [[_MOUSEINPUT|_MOUSEINPUT]]
    Tcol% = (([[_MOUSEX|_MOUSEX]] - xpos%) \ 8) + 1 'mouse column with Putimage offset
    Trow% = (([[_MOUSEY|_MOUSEY]] - ypos%) \ 16) + 1 'mouse row with offset
    Pick = [[_MOUSEBUTTON|_MOUSEBUTTON]](1) ' get left button selection click
  [[LOOP|LOOP]]
  [[IF...THEN|IF]] Trow% > 2 [[AND (boolean)|AND]] Trow% < cnt% + 3 [[AND (boolean)|AND]] Tcol% > 0 [[AND (boolean)|AND]] Tcol% < 80 [[THEN|THEN]] 'when mouse in area
    R% = Trow% - 2
    [[IF...THEN|IF]] P% = 0 [[OR (boolean)|OR]] P% > cnt% + 3 [[THEN|THEN]] P% = R%
    [[IF...THEN|IF]] P% = R% [[THEN|THEN]]
      [[COLOR|COLOR]] 15: [[LOCATE|LOCATE]] R% + 2, 3: [[PRINT USING|PRINT USING]] tmp$; DIR$(R%); SHFN$(R%); LGFN$(R%); Last$(R%)
    [[ELSE|ELSE]]
      [[COLOR|COLOR]] 11: [[LOCATE|LOCATE]] P% + 2, 3: [[PRINT USING|PRINT USING]] tmp$; DIR$(P%); SHFN$(P%); LGFN$(P%); Last$(P%)
    [[END IF|END IF]]
    [[GOSUB|GOSUB]] NewDisplay
    P% = R%
    [[IF...THEN|IF]] Pick [[THEN|THEN]]
      Spec$ = SHFN$(R%)
      [[IF...THEN|IF]] [[LEN|LEN]](Spec$) [[THEN|THEN]]
        [[COLOR|COLOR]] 13: [[LOCATE|LOCATE]] R% + 2, 3: [[PRINT USING|PRINT USING]] tmp$; DIR$(R%); SHFN$(R%); LGFN$(R%); Last$(R%)
        [[GOSUB|GOSUB]] NewDisplay
        Spec$ = Spec$ + BS$: FILELIST$ = Spec$: Path$ = Paths$(R%)
        [[IF...THEN|IF]] [[LEN|LEN]](LGFN$(R%)) [[THEN|THEN]] LFN$ = LGFN$(R%) + BS$ [[ELSE|ELSE]] LFN$ = ""
        [[_DELAY|_DELAY]] 1.5: [[CLS|CLS]]: [[SCREEN (statement)|SCREEN]] mode&: [[GOSUB|GOSUB]] KILLdata 'exit if user selection
      [[END IF|END IF]]
    [[END IF|END IF]] 'len spec
  [[END IF|END IF]] 'pick
  [[IF...THEN|IF]] [[LEN|LEN]](Key$) [[THEN|THEN]] usercode% = [[ASC|ASC]](Key$) [[ELSE|ELSE]] usercode% = 0
  [[IF...THEN|IF]] usercode% > setcode% [[THEN|THEN]] setcode% = usercode% 'user can press letter to jump to
  [[IF...THEN|IF]] Pick [[AND (boolean)|AND]] Trow% > 27 [[THEN|THEN]] [[EXIT DO|EXIT DO]]
[[LOOP|LOOP]] [[UNTIL|UNTIL]] [[LEN|LEN]](Key$)
[[_DELAY|_DELAY]] .4 'adjust delay for page scroll speed
DO: Key$ = [[INKEY$|INKEY$]]: [[LOOP|LOOP]] [[UNTIL|UNTIL]] Key$ = ""
[[IF...THEN|IF]] last = 0 [[THEN|THEN]] [[RETURN|RETURN]] 'exit if file no more data
FILELIST$ = "": Spec$ = "": LFN$ = ""
[[CLS|CLS]]: [[SCREEN (statement)|SCREEN]] mode& 'resets program screen to previous condition
KILLdata:
[[CLOSE|CLOSE]] #f%: [[KILL|KILL]] "D0S-DATA.INF" 'kill D0S-DATA.INF file and exit
[[IF...THEN|IF]] FList& < -1 [[THEN|THEN]] [[_FREEIMAGE|_FREEIMAGE]] FList&
[[IF...THEN|IF]] Show& < -1 [[THEN|THEN]] [[_FREEIMAGE|_FREEIMAGE]] Show&
[[IF...THEN|IF]] noshow = -1 AND mode& < -1 THEN [[_FREEIMAGE|_FREEIMAGE]] mode&
[[_AUTODISPLAY|_AUTODISPLAY]] 'reset default settings
[[EXIT FUNCTION|EXIT FUNCTION]]
[[RETURN|RETURN]]
NewScreen: 'clear screen and set display format
[[LINE|LINE]] (0, 0)-(639, 499), 0, BF
[[COLOR|COLOR]] 14: [[LOCATE|LOCATE]] 2, 3: [[PRINT|PRINT]] Head$
[[LINE|LINE]] (4, 4)-(636, 476), 13, B: [[LINE|LINE]] (5, 5)-(635, 475), 13, B
[[GOSUB|GOSUB]] NewDisplay
[[RETURN|RETURN]]
NewDisplay: 'show program or window displays
[[IF...THEN|IF]] xpos% + ypos% > 0 [[THEN|THEN]]
  [[_PUTIMAGE|_PUTIMAGE]] , FList&, Show&
  [[_DEST|_DEST]] 0: [[_PUTIMAGE|_PUTIMAGE]] (xpos%, ypos%), Show&: [[_DISPLAY|_DISPLAY]]
  [[_DEST|_DEST]] FList&
[[ELSE|ELSE]]: [[_DISPLAY|_DISPLAY]]
[[END IF|END IF]]
[[RETURN|RETURN]]
[[END FUNCTION|END FUNCTION]] '' ''      
NOTE: Refresh browser if full code is not displayed! Updated for VISTA Screen format 8/20/2010 Added optional root path in _TITLE bar of windowed mode only 11/16/2010 NOTE: IF $STATIC Metacommand is required, change function Arrays to STATIC and ERASE them at start and every loop!

See also:

Return to original FILELIST$ function


Navigation:
Go to Keyword Reference - Alphabetical
Go to Keyword Reference - By usage
Go to Main WIKI Page
⚠️ **GitHub.com Fallback** ⚠️