[Back to DIRS SWAG index] [Back to Main SWAG index] [Original]
Program DIRSEL;
Uses
Crt,Dos; { ** needed for DIRSELECT functions ** }
{ ** The following Type & Var declarations are for the main program only ** }
{ ** However, the string length of the returned parameter from DIRSELECT ** }
{ ** must be a least 12 characters. ** }
Type
strtype = String[12];
Var
spec,fname : strtype;
{ ************************************************************************** }
{ ** List of Procedures/Functions needed for DIRSELECT ** }
{ ** Procedure CURSOR - turns cursor on or off ** }
{ ** Procedure FRAME - draws single or double frame ** }
{ ** Function ISCOLOR - returns the current video mode ** }
{ ** Procedure SAVESCR - saves current video screen ** }
{ ** Procedure RESTORESCR - restores old video screen ** }
{ ** Procedure SCRGET - get character/attribute ** }
{ ** Procedure SCRPUT - put character/attribute ** }
{ ** Procedure FNAMEPOS - finds proper screen position ** }
{ ** Procedure HILITE - highlights proper name ** }
{ ** Function DIRSELECT - directory selector ** }
{ ************************************************************************** }
Procedure CURSOR( attrib : Boolean );
Var
regs : Registers;
Begin
If NOT attrib Then { turn cursor off }
Begin
regs.ah := 1;
regs.cl := 7;
regs.ch := 32;
Intr($10,regs)
End
Else { turn cursor on }
Begin
Intr($11,regs);
regs.cx := $0607;
If regs.al AND $10 <> 0 Then regs.cx := $0B0C;
regs.ah := 1;
Intr($10,regs)
End
End;
Procedure FRAME(t,l,b,r,ftype : Integer);
Var
i : Integer;
Begin
GoToXY(l,t);
If ftype = 2 Then
Write(Chr(201))
Else
Write(Chr(218));
GoToXY(r,t);
If ftype = 2 Then
Write(Chr(187))
Else
Write(Chr(191));
GoToXY(l+1,t);
For i := 1 To (r - (l + 1)) Do
If ftype = 2 Then
Write(Chr(205))
Else
Write(Chr(196));
GoToXY(l+1,b);
For i := 1 To (r - (l + 1)) Do
If ftype = 2 Then
Write(Chr(205))
Else
Write(Chr(196));
GoToXY(l,b);
If ftype = 2 Then
Write(Chr(200))
Else
Write(Chr(192));
GoToXY(r,b);
If ftype = 2 Then
Write(Chr(188))
Else
Write(Chr(217));
For i := (t+1) To (b-1) Do
Begin
GoToXY(l,i);
If ftype = 2 Then
Write(Chr(186))
Else
Write(Chr(179))
End;
For i := (t+1) To (b-1) Do
Begin
GoToXY(r,i);
If ftype = 2 Then
Write(Chr(186))
Else
Write(Chr(179))
End
End;
Function ISCOLOR : Boolean; { returns FALSE for MONO or TRUE for COLOR }
Var
regs : Registers;
video_mode : Integer;
equ_lo : Byte;
Begin
Intr($11,regs);
video_mode := regs.al and $30;
video_mode := video_mode shr 4;
Case video_mode of
1 : ISCOLOR := FALSE; { Monochrome }
2 : ISCOLOR := TRUE { Color }
End
End;
Procedure SAVESCR( Var screen );
Var
vidc : Byte Absolute $B800:0000;
vidm : Byte Absolute $B000:0000;
Begin
If NOT ISCOLOR Then { if MONO }
Move(vidm,screen,4000)
Else { else COLOR }
Move(vidc,screen,4000)
End;
Procedure RESTORESCR( Var screen );
Var
vidc : Byte Absolute $B800:0000;
vidm : Byte Absolute $B000:0000;
Begin
If NOT ISCOLOR Then { if MONO }
Move(screen,vidm,4000)
Else { else COLOR }
Move(screen,vidc,4000)
End;
Procedure SCRGET( Var ch,attr : Byte );
Var
regs : Registers;
Begin
regs.bh := 0;
regs.ah := 8;
Intr($10,regs);
ch := regs.al;
attr := regs.ah
End;
Procedure SCRPUT( ch,attr : Byte );
Var
regs : Registers;
Begin
regs.al := ch;
regs.bl := attr;
regs.ch := 0;
regs.cl := 1;
regs.bh := 0;
regs.ah := 9;
Intr($10,regs);
End;
Procedure FNAMEPOS(Var arypos,x,y : Integer);
{ determine position on screen of filename }
Const
FPOS1 = 2;
FPOS2 = 15;
FPOS3 = 28;
FPOS4 = 41;
FPOS5 = 54;
FPOS6 = 67;
Begin
Case arypos of
1: Begin x := FPOS1; y := 2 End;
2: Begin x := FPOS2; y := 2 End;
3: Begin x := FPOS3; y := 2 End;
4: Begin x := FPOS4; y := 2 End;
5: Begin x := FPOS5; y := 2 End;
6: Begin x := FPOS6; y := 2 End;
7: Begin x := FPOS1; y := 3 End;
8: Begin x := FPOS2; y := 3 End;
9: Begin x := FPOS3; y := 3 End;
10: Begin x := FPOS4; y := 3 End;
11: Begin x := FPOS5; y := 3 End;
12: Begin x := FPOS6; y := 3 End;
13: Begin x := FPOS1; y := 4 End;
14: Begin x := FPOS2; y := 4 End;
15: Begin x := FPOS3; y := 4 End;
16: Begin x := FPOS4; y := 4 End;
17: Begin x := FPOS5; y := 4 End;
18: Begin x := FPOS6; y := 4 End;
19: Begin x := FPOS1; y := 5 End;
20: Begin x := FPOS2; y := 5 End;
21: Begin x := FPOS3; y := 5 End;
22: Begin x := FPOS4; y := 5 End;
23: Begin x := FPOS5; y := 5 End;
24: Begin x := FPOS6; y := 5 End;
25: Begin x := FPOS1; y := 6 End;
26: Begin x := FPOS2; y := 6 End;
27: Begin x := FPOS3; y := 6 End;
28: Begin x := FPOS4; y := 6 End;
29: Begin x := FPOS5; y := 6 End;
30: Begin x := FPOS6; y := 6 End;
31: Begin x := FPOS1; y := 7 End;
32: Begin x := FPOS2; y := 7 End;
33: Begin x := FPOS3; y := 7 End;
34: Begin x := FPOS4; y := 7 End;
35: Begin x := FPOS5; y := 7 End;
36: Begin x := FPOS6; y := 7 End;
37: Begin x := FPOS1; y := 8 End;
38: Begin x := FPOS2; y := 8 End;
39: Begin x := FPOS3; y := 8 End;
40: Begin x := FPOS4; y := 8 End;
41: Begin x := FPOS5; y := 8 End;
42: Begin x := FPOS6; y := 8 End;
43: Begin x := FPOS1; y := 9 End;
44: Begin x := FPOS2; y := 9 End;
45: Begin x := FPOS3; y := 9 End;
46: Begin x := FPOS4; y := 9 End;
47: Begin x := FPOS5; y := 9 End;
48: Begin x := FPOS6; y := 9 End;
49: Begin x := FPOS1; y := 10 End;
50: Begin x := FPOS2; y := 10 End;
51: Begin x := FPOS3; y := 10 End;
52: Begin x := FPOS4; y := 10 End;
53: Begin x := FPOS5; y := 10 End;
54: Begin x := FPOS6; y := 10 End;
55: Begin x := FPOS1; y := 11 End;
56: Begin x := FPOS2; y := 11 End;
57: Begin x := FPOS3; y := 11 End;
58: Begin x := FPOS4; y := 11 End;
59: Begin x := FPOS5; y := 11 End;
60: Begin x := FPOS6; y := 11 End;
61: Begin x := FPOS1; y := 12 End;
62: Begin x := FPOS2; y := 12 End;
63: Begin x := FPOS3; y := 12 End;
64: Begin x := FPOS4; y := 12 End;
65: Begin x := FPOS5; y := 12 End;
66: Begin x := FPOS6; y := 12 End;
67: Begin x := FPOS1; y := 13 End;
68: Begin x := FPOS2; y := 13 End;
69: Begin x := FPOS3; y := 13 End;
70: Begin x := FPOS4; y := 13 End;
71: Begin x := FPOS5; y := 13 End;
72: Begin x := FPOS6; y := 13 End;
73: Begin x := FPOS1; y := 14 End;
74: Begin x := FPOS2; y := 14 End;
75: Begin x := FPOS3; y := 14 End;
76: Begin x := FPOS4; y := 14 End;
77: Begin x := FPOS5; y := 14 End;
78: Begin x := FPOS6; y := 14 End;
79: Begin x := FPOS1; y := 15 End;
80: Begin x := FPOS2; y := 15 End;
81: Begin x := FPOS3; y := 15 End;
82: Begin x := FPOS4; y := 15 End;
83: Begin x := FPOS5; y := 15 End;
84: Begin x := FPOS6; y := 15 End;
85: Begin x := FPOS1; y := 16 End;
86: Begin x := FPOS2; y := 16 End;
87: Begin x := FPOS3; y := 16 End;
88: Begin x := FPOS4; y := 16 End;
89: Begin x := FPOS5; y := 16 End;
90: Begin x := FPOS6; y := 16 End;
91: Begin x := FPOS1; y := 17 End;
92: Begin x := FPOS2; y := 17 End;
93: Begin x := FPOS3; y := 17 End;
94: Begin x := FPOS4; y := 17 End;
95: Begin x := FPOS5; y := 17 End;
96: Begin x := FPOS6; y := 17 End;
97: Begin x := FPOS1; y := 18 End;
98: Begin x := FPOS2; y := 18 End;
99: Begin x := FPOS3; y := 18 End;
100: Begin x := FPOS4; y := 18 End;
101: Begin x := FPOS5; y := 18 End;
102: Begin x := FPOS6; y := 18 End;
103: Begin x := FPOS1; y := 19 End;
104: Begin x := FPOS2; y := 19 End;
105: Begin x := FPOS3; y := 19 End;
106: Begin x := FPOS4; y := 19 End;
107: Begin x := FPOS5; y := 19 End;
108: Begin x := FPOS6; y := 19 End;
109: Begin x := FPOS1; y := 20 End;
110: Begin x := FPOS2; y := 20 End;
111: Begin x := FPOS3; y := 20 End;
112: Begin x := FPOS4; y := 20 End;
113: Begin x := FPOS5; y := 20 End;
114: Begin x := FPOS6; y := 20 End;
115: Begin x := FPOS1; y := 21 End;
116: Begin x := FPOS2; y := 21 End;
117: Begin x := FPOS3; y := 21 End;
118: Begin x := FPOS4; y := 21 End;
119: Begin x := FPOS5; y := 21 End;
120: Begin x := FPOS6; y := 21 End
Else
Begin
x := 0;
y := 0;
End
End
End;
Procedure HILITE(old,new : Integer); { highlight a filename on the screen }
Var
i,oldx,oldy,newx,newy : Integer;
ccolor,locolor,hicolor,cchar : Byte;
Begin
FNAMEPOS(old,oldx,oldy); { get position in the array of the filename }
FNAMEPOS(new,newx,newy); { get position in the array of the filename }
For i := 0 To 11 Do
Begin
If old < 121 Then { if valid position, reverse video, old selection }
Begin
GoToXY((oldx + i),oldy);
SCRGET(cchar,ccolor);
locolor := ccolor AND $0F;
locolor := locolor shl 4;
hicolor := ccolor AND $F0;
hicolor := hicolor shr 4;
ccolor := locolor + hicolor;
SCRPUT(cchar,ccolor)
End;
GoToXY((newx + i),newy); { reverse video, new selection }
SCRGET(cchar,ccolor);
locolor := ccolor AND $0F;
locolor := locolor shl 4;
hicolor := ccolor AND $F0;
hicolor := hicolor shr 4;
ccolor := locolor + hicolor;
SCRPUT(cchar,ccolor)
End
End;
Function DIRSELECT(mask : strtype; attr : Integer) : strtype;
Const
OFF = FALSE;
ON = TRUE;
Var
i,oldcurx,oldcury,
newcurx,newcury,
oldpos,newpos,
scrrows,fncnt : Integer;
ch : Char;
dos_dir : Array[1..120] of String[12];
fileinfo : SearchRec;
screen : Array[1..4000] of Byte;
Begin
fncnt := 0;
FindFirst(mask,attr,fileinfo);
If DosError <> 0 Then { if not found, return NULL }
Begin
DIRSELECT := '';
Exit
End;
While (DosError = 0) AND (fncnt <> 120) Do { else, collect filenames }
Begin
Inc(fncnt);
dos_dir[fncnt] := fileinfo.Name;
FindNext(fileinfo)
End;
oldcurx := WhereX; { store old CURSOR position }
oldcury := WhereY;
SAVESCR(screen);
CURSOR(OFF);
scrrows := (fncnt DIV 6) + 3;
Window(1,1,80,scrrows + 1);
ClrScr;
GoToXY(1,1);
i := 1;
While (i <= fncnt) AND (i <= 120) Do { display all filenames }
Begin
FNAMEPOS(i,newcurx,newcury);
GoToXY(newcurx,newcury);
Write(dos_dir[i]);
Inc(i)
End;
FRAME(1,1,scrrows,80,1); { draw the frame }
HILITE(255,1); { highlight the first filename }
oldpos := 1;
newpos := 1;
While TRUE Do { get keypress and do appropriate action }
Begin
ch := ReadKey;
Case ch of
#27: { Esc }
Begin
Window(1,1,80,25);
RESTORESCR(screen);
GoToXY(oldcurx,oldcury);
CURSOR(ON);
DIRSELECT := '';
Exit { return NULL }
End;
#71: { Home } { goto first filename }
Begin
oldpos := newpos;
newpos := 1;
HILITE(oldpos,newpos)
End;
#79: { End } { goto last filename }
Begin
oldpos := newpos;
newpos := fncnt;
HILITE(oldpos,newpos)
End;
#72: { Up } { move up one filename }
Begin
i := newpos;
i := i - 6;
If i >= 1 Then
Begin
oldpos := newpos;
newpos := i;
HILITE(oldpos,newpos)
End
End;
#80: { Down } { move down one filename }
Begin
i := newpos;
i := i + 6;
If i <= fncnt Then
Begin
oldpos := newpos;
newpos := i;
HILITE(oldpos,newpos)
End
End;
#75: { Left } { move left one filename }
Begin
i := newpos;
Dec(i);
If i >= 1 Then
Begin
oldpos := newpos;
newpos := i;
HILITE(oldpos,newpos)
End
End;
#77: { Right } { move right one filename }
Begin
i := newpos;
Inc(i);
If i <= fncnt Then
Begin
oldpos := newpos;
newpos := i;
HILITE(oldpos,newpos)
End
End;
#13: { CR }
Begin
Window(1,1,80,25);
RESTORESCR(screen);
GoToXY(oldcurx,oldcury); { return old CURSOR position }
CURSOR(ON);
DIRSELECT := dos_dir[newpos];
Exit { return with filename }
End
End
End
End;
{ ************************************************************************** }
{ ** Main Program : NOTE that the following is a demo program only. ** }
{ ** It is not needed to use the DIRSELECT function. ** }
{ ************************************************************************** }
Begin
While TRUE Do
Begin
Writeln;
Write('Enter a filespec => ');
Readln(spec);
fname := DIRSELECT(spec,0);
If Length(fname) = 0 Then
Begin
Writeln('Filespec not found.');
Halt
End;
Writeln('The file you have chosen is ',fname,'.')
End
End.
{ ** EOF( DIRSEL.PAS ) ** }
[Back to DIRS SWAG index] [Back to Main SWAG index] [Original]