Вот готовый пример на основе предыдущего кода.
Код: Выделить всё
PROGRAM
MAP
END
tqLF QUEUE,TYPE
Name STRING(FILE:MAXFILENAME) !FILE:MAXFILENAME is an EQUATE
ShortName STRING(13)
Date LONG
Time LONG
Size LONG
Attrib BYTE !A bitmap, the same as the attributes EQUATEs
recs long
szFullName cstring(255)
flag long
END
tcIO CLASS,TYPE
mLoadDir function(tqLF pqLF, *cstring p_Path, *cstring p_Mask, long p_SkipSubDir = 0),byte,proc
mLoadDirQ function(tqLF pqLF, *cstring p_Path, Queue p_Que, long p_SkipSubDir = 0),byte,proc
mStrToQue function(*cstring p_Str, Queue p_Que, *cstring p_Sep, long p_Flag),byte,proc
END
QQ tqLF
YY tcIO
Path CSTRING(200)
Mask CSTRING(200)
Window WINDOW('Dirlist'),AT(,,359,261),FONT('Tahoma',8,,FONT:regular,CHARSET:CYRILLIC),CENTER,GRAY,DOUBLE
LIST,AT(2,3,355,256),USE(?List1),VSCROLL,FORMAT('39L(2)|M~szFullName~@s255@#8#'),FROM(QQ)
END
CODE
OPEN(Window)
Path = 'c:\Clarion6\'
Mask = '*.tps|*.bmp'
YY.mLoadDir(QQ,Path,Mask)
ACCEPT
END
CLOSE(Window)
tcIO.mLoadDir function(tqLF pqLF, *cstring p_Path, *cstring p_Mask, long p_SkipSubDir = 0)
Que Queue
str cstring(61)
.
loc:Sep cstring('|')
code
self.mStrToQue(p_Mask, Que, loc:Sep, 0)
return(self.mLoadDirQ(pqLF, p_Path, Que, p_SkipSubDir))
tcIO.mLoadDirQ function(tqLF pqLF, *cstring p_Path, Queue p_Que, long p_SkipSubDir = 0)
loc:i long
loc:szPath cstring(255)
loc:szNewPath cstring(255)
loc:j long
qLF queue(tqLF).
loc:Flag long
loc:Mask cstring(64)
pAny Any
code
loc:Flag = pqLF.Flag
pAny &= what(p_Que,1)
!Сначала все поддиректории
loc:szPath = p_Path & '*.*'
directory(qLF, loc:szPath, ff_:directory )
loop loc:i = 1 to records(qLF)
get(qLF, loc:i)
if clip(qLF.ShortName) = '..'
cycle.
if clip(qLF.ShortName) = '.'
cycle.
if band(qLF.Attrib, ff_:DIRECTORY)
!Message(p_Path&'|'&qLF.Name,'Dir')
if p_SkipSubDir = 0
loc:szNewPath = p_Path & clip(qLF.Name) & '\'
self.mLoadDirQ(pqLF, loc:szNewPath, p_Que)
.
.
.
if ~records(p_Que)
loc:Mask = '*.*'
do RunIt
else
loop loc:j = 1 to records(p_Que)
get(p_Que, loc:j)
loc:Mask = pAny
do RunIt
.
.
return(1)
RunIt routine
free(qLF)
loc:szPath = p_Path & loc:Mask
!Message(loc:szPath)
directory(qLF, loc:szPath, ff_:NORMAL + ff_:READONLY + ff_:ARCHIVE)
loop loc:i = 1 to records(qLF)
get(qLF, loc:i)
if clip(qLF.ShortName) = '..'
cycle.
if clip(qLF.ShortName) = '.'
cycle.
if band(qLF.Attrib, ff_:DIRECTORY)
else
pqLF = qLF
pqLF.szFullName = p_Path & clip(qLF.Name)
pqLF.recs = 0
pqLF.Flag = loc:flag
add(pqLF)
.
.
tcIO.mStrToQue function(*cstring p_Str, Queue p_Que, *cstring p_Sep, long p_Flag)
pAny Any
loc:len ulong
loc:pos ulong
loc:currpos ulong
loc:str cstring(2048)
loc:SepLen long
!loc:m equate(500)
!loc:mx long
code
if ~p_Flag
free(p_Que)
clear(p_Que)
.
pAny &= what(p_Que,1)
loc:len = len(clip(p_Str))
loc:currpos = 1
!Message(loc:Len)
loc:SepLen = len(p_Sep)
loop
loc:pos = instring(p_Sep,p_str,1,loc:currpos)
if ~loc:pos
break.
loc:Str = p_Str[loc:currpos : loc:pos - 1]&'<0>'
loc:currpos = loc:pos + loc:Seplen
do add_que
.
if loc:currpos < loc:len
loc:Str = p_Str[loc:currpos : loc:len]&'<0>'
do add_que
.
return(0)
Add_que routine
loc:str = clip(loc:str)
if len(loc:str)
pAny = loc:str
add(p_que)
else
clear(p_que)
add(p_que)
.