Iâll paste the code of one of the examples so it does not need to be downloaded to see. This one is of a Directory File:Queue with the File Name that is 1st in the Queue moved to last in the LIST using Format #1#.

ListSort:HasSortColumn_ColumnReorder PROCEDURE()
QNdx LONG,AUTO
DirQ QUEUE(FILE:Queue),PRE(DirQ)
END ! DirQ:Name DirQ:ShortName(8.3?) DirQ:Date DirQ:Time DirQ:Size DirQ:Attrib
SortNow SHORT
SortLast SHORT
SortNowWho STRING(128)
SortLastWho STRING(128)
FilesWindow WINDOW('#1# Columns not in Order - Sort "PROPLIST:HasSortColumn" '),AT(350,1,343,250),GRAY,SYSTEM,FONT('Segoe UI',9,, |
FONT:regular),RESIZE
STRING('Column 5 Name is Q Field #1#. C9 PROPLIST:HasSortColumn and EVENT:HeaderPressed.'),AT(2,2),USE(?HowSort)
LIST,AT(1,15),FULL,USE(?ListFiles),VSCROLL,TIP('Click heads to sort, Click again to reverse'), |
FROM(DirQ),FORMAT('52L(1)|M~Short Name~@s13@#2#40R(1)|M~Date~C(0)@' & |
'd1@40R(1)|M~Time~C(0)@T4@56R(1)|M~Size~C(0)@n13@120L(1)|M~Name~@s255@#1#')
END
CODE
FREE(DirQ)
DIRECTORY(DirQ,WinTempBS&'*.*',ff_:NORMAL)
LOOP QNdx = RECORDS(DirQ) TO 1 BY -1 !--Keep directories, Delete files, Case Name
GET(DirQ,QNdx)
IF BAND(DirQ:Attrib,FF_:Directory) OR DirQ:Name='.' OR DirQ:Name='..' !. or .. Dirs
DELETE(DirQ)
ELSE
DirQ:Name=UPPER(DirQ:Name[1]) & DirQ:Name[2 : SIZE(DirQ:Name) ]
PUT(DirQ)
END
END
OPEN(FilesWindow)
0{PROP:Text}=CLIP(0{PROP:Text}) &' '& WinTempBS & ' (' & RECORDS(DirQ) &' records) '
!To setup for new LIST HasSortColumn MUST set PROPLIST:HasSortColumn=1
?ListFiles{PROPLIST:HasSortColumn}=1
?ListFiles{PROPLIST:HdrSortBackColor} = COLOR:HIGHLIGHT !Color Header Background
?ListFiles{PROPList:HdrSortTextColor} = COLOR:HIGHLIGHTtext !Color Header Text
?ListFiles{PROPList:SortBackColor} = 80000018h !COLOR:InfoBackground !Color List Background
?ListFiles{PROPList:SortTextColor} = 80000017h !COLOR:InfoText !Color List Text
ACCEPT
CASE EVENT()
OF EVENT:OpenWindow
?ListFiles{PROPLIST:SortColumn} =5 !Color column 5 as sorted, really Q field 1
?ListFiles{PROPList:MouseDownField}=5 !Force Initial Sort Column - You can Write this Property
DO TakeEVENT:HeaderPressed !Use Click Column code to Sort Queue and set variable
?ListFiles{PROP:Selected}=1 !First time select row 1 of sorted
END
CASE FIELD()
OF ?ListFiles
CASE EVENT()
OF EVENT:HeaderPressed
DO TakeEVENT:HeaderPressed
OF EVENT:NewSelection !DblClick to View 1 File
IF KEYCODE()=MouseLeft2 THEN
GET(DirQ,CHOICE(?ListFiles))
MESSAGE(CLIP(DirQ:Name) &'|'& DirQ:ShortName &'|'& DirQ:Date &'|'& DirQ:Time &'|'& DirQ:Size |
&'|'& DirQ:Attrib,'File '&CHOICE(?ListFiles),,,,2)
END
END ! Case EVENT()
END ! Case FIELD()
END !ACCEPT
CLOSE(FilesWindow)
TakeEVENT:HeaderPressed ROUTINE !Sort the Queue just using column numbers
GET(DirQ, CHOICE(?ListFiles)) !To preserve selected row
SortNow=?ListFiles{PROPList:MouseDownField} !This is really LIST Column and NOT Q Field
SortNow=?ListFiles{PROPLIST:FieldNo,SortNow} !This is Q Field No. Required here because Name uses #1#
IF SortNow<>ABS(SortLast) THEN SortLastWho=',' & SortNowWho.
SortNowWho=CHOOSE(SortNow=SortLast,'-','+') & WHO(DirQ,SortNow)
0{PROP:Text}='#1# Order - HasSortColumn: SORT (' & SortNow &' /'& SortLast &') ' & CLIP(SortNowWho) & SortLastWho
SORT(DirQ,CLIP(SortNowWho) & SortLastWho)
SortLast = CHOOSE(SortNow=ABS(SortLast),-1*SortLast,SortNow)
GET(DirQ, DirQ:Name) !If no Unique field to GET() then Loop until find it
?ListFiles{PROP:Selected}=POINTER(DirQ) !Preserved the selected record
DISPLAY