home *** CD-ROM | disk | FTP | other *** search
- Displaying
- Directories
-
-
-
- "An intellectual is someone who can listen to the William Tell overture
- and not think of the Lone Ranger."
-
- Anonymous
-
-
-
- The Toolkit includes two entirely different object families for dis-
- playing directory listings. The objects ListDirOBJ and ListDirSortOBJ
- are descendant from ListOBJ and should be used when you want to display
- the directory in a stretchable window, or let the user select multiple
- files. The DirWinOBJ should be used when you want to display a file
- selection dialog box and allow the user to choose a single file.
-
-
- Displaying Directory List Windows
-
- The totLIST unit includes the ListDirOBJ object which is an adaptation
- of ListOBJ. ListDirOBJ is designed to display files and directories in
- a stretchable window. ListDirOBJ is a descendant of ListOBJ, and inher-
- its all the following ListOBJ methods:
- Init
- SetTopPick
- SetActivePick
- SetTagging
- SetColWidth
- Show
- Go
- LastKey
- GetHiString
- Win^
- Done
-
- Some of the list defaults are influenced by LookTOT^ methods. Refer
- back to page 9-20 for a full description of these methods.
- In addition to the inherited methods, ListDirOBJ includes the following
- important method:
-
-
- ReadFiles(Filemasks:string; FileAttrib:word);
- This method must be called before the Go method. ReadFiles instructs
- the object to read all the files matching the first parameter. The
- filemask should include wild cards, e.g. *.pas, *.*, bob?.tit, etc.,
- and may optionally include a drive and path. If a drive/path is not
- specified, all matching files in the default directory will be read.
- Note that the string may include more than one file specification sepa-
- rated by spaces, e.g. '*.pas *.asm'. The second parameter identifies
- the attributes of the files to include in the list.
-
- 10-2 User's Guide
- --------------------------------------------------------------------------------
-
- The Turbo Pascal DOS unit includes the following file attribute con-
- stants:
-
- ReadOnly = $01
- Hidden = $02
- SysFile = $04
- VolumeID = $08
- Directory = $10
- Archive = $20
- AnyFile = $3F
- Specify any of the desired file types by summing these constants and
- passing them as the second parameter. For example, the following method
- call will list all the .TXT files that can be edited:
-
- ReadFiles('*.TXT',Anyfile-ReadOnly-Hidden);
- Note that the Toolkit automatically removes the VolumeID file from the
- list.
-
- In summary, to display a basic file listing, all you have to do is
- declare an instance of ListDirOBJ, and then call the methods Init,
- ReadFiles and Go. The chosen file can be determined by calling the
- function method GetHiString. Listed below is the demo file DEMDR1.PAS
- which displays a simple directory, followed by figure 10.1 showing the
- resultant list.
-
-
- program DemoDirectoryOne;
- {demdr1 - the default directory list}
- Uses DOS, CRT,
- totFAST, totLIST;
-
- Var
- ListWin: ListDirObj;
- begin
- Screen.Clear(white,'░'); {paint the screen}
- with ListWin do
- begin
- Init;
- ReadFiles('*.*',AnyFile);
- Go;
- Win^.Remove;
- if (LastKey = 27) or (Lastkey = 600) then
- writeln('You escaped!')
- Else
- writeln('You chose file '+GetHiString);
- Done;
- end;
- end.
-
-
-
-
- Displaying Directories 10-3
- --------------------------------------------------------------------------------
-
- Figure 10.1 [SCREEN]
- A Basic Directory
- List
-
-
- Determining Tagged Files
-
- By default, the user can select multiple files by hitting the [KEYCAP]
- or clicking the left mouse button on a filename. The method SetTagging
- can be used to enable or disable multiple file tagging.
- The ListDirOBJ object implements the methods GetStatus and SetStatus to
- provide access to tagged files. These methods work in precisely the
- same way as their namesakes in the DLLOBJ family. Full descriptions can
- be found on page 9-27, but in brief, GetStatus returns a boolean to
- indicate whether the file has been tagged, and is passed two parame-
- ters; the first parameter is the number of the file in the list, and
- the second is the flag ID which should be set to 0 (zero) to check the
- status of the tag flag.
-
- Each ListDirOBJ instance includes a FileDLLOBJ object which is a linked
- list holding all the file details. The ListDirOBJ object provides the
- method FileList which returns a pointer to the FileDLLOBJ list. This is
- useful when you want to directly manipulate the file linked list. You
- may recall that all DLLOBJ objects have a method TotalNodes which
- returns a longint identifying the number of entries in the list. The
- ListDirOBJ method FileList^.TotalNodes therefore returns the total num-
- ber of files in the list.
- The demo program DEMDR2.PAS, listed below, shows how the methods GetS-
- tatus and FileList^.TotalFiles can be used to ascertain which files the
- user tagged. Notice that you must access the tagged files before
- calling the method Done - otherwise, the list will be disposed of
- before you can access it! Following the listing are figures 10.2 and
- 10.3 which provide an example of the output generated by the program.
- Note that the highlighted file will only be included in the list if the
- file is tagged.
-
- program DemoDirectoryTwo;
- {demdr2 - determining chosen files}
- Uses DOS, CRT,
- totFAST, totLIST;
-
- Var
- ListWin: ListDirObj;
- Tot,L:longint;
- begin
- Screen.Clear(white,'░'); {paint the screen}
- with ListWin do
- begin
-
-
-
-
- 10-4 User's Guide
- --------------------------------------------------------------------------------
-
- Init;
- ReadFiles('*.*',AnyFile);
- Go;
- Win^.Remove;
- if (LastKey = 27) or (Lastkey = 600) then
- writeln('You escaped!')
- Else
- begin
- writeln('The highlighted file was '+GetHiString);
- writeln('The tagged files were: ');
- Tot := FileList^.TotalNodes;
- for L := 1 to Tot do
- if GetStatus(L,0) then
- writeln(GetString(L,0,0));
- end;
- Done;
- end;
- end.
-
-
-
- Figure 10.2 [SCREEN]
- Tagging Multiple
- Files
-
- Figure 10.3 [SCREEN]
- Displaying the
- Tagged Files
-
-
- Advanced Directory Management
-
- In the previous section you learned that the method FileList returns a
- pointer to an instance of type FileDLLOBJ which contains a list of all
- the files selected for display. In addition to the TotalNodes method,
- you can call any of the other FileDLLOBJ methods. Remember that these
- methods must be called via the FileList method using the syntax:
- FileList^.method
-
-
- Sorting
-
- The Sort method can be used to sort the directory listing. This method
- is described on page 9-6, and has the following syntax:
- FileList^.Sort(SortID:shortint;Ascending:boolean);
-
- When used with a FileDLLOBJ object, the first parameter instructs the
- Toolkit about which element of the file to sort by. The permissible
- values are as follows:
-
-
-
- Displaying Directories 10-5
- --------------------------------------------------------------------------------
-
- 0 DOS (unsorted)
- 1 Name
- 2 Ext
- 3 Size
- 4 Time
-
- For example, calling the method Sort(2,false) will sort the files by
- filename extension in descending order.
-
-
- Accessing File Details
-
- The totLINK unit includes the following type declaration:
- tFileInfo = record
- Filename: string[12];
- Attr: byte;
- Time:longint;
- Size:longint;
- LoadID: longint;
- end;
-
- Every node in a FileDLLOBJ list contains such a record, describing all
- the file details. The first four fields in the record are the same as
- the corresponding fields in the Turbo Pascal SearchRec record. The
- fifth record LoadID is the node number when the file was added to the
- list. This field is required so the list can be sorted in DOS order,
- i.e. the order in which the files are stored in the DOS directory.
- The FileDLLOBJ method GetFileRecord can be used to access a file's
- record, and the method GetLongStr can be used to access a string
- detailing the file information. The syntax of these methods is as fol-
- lows:
-
-
- FileList^.GetFileRecord(var Info:tFileInfo; NodeNumber:longint);
- The first parameter must be a variable of type tFileInfo. This variable
- is updated with the file details for the file specified by the second
- parameter.
-
-
- FileList^.GetLongStr(Node:DLLNodePtr): string;
- This method is passed a pointer to the list node, and returns a for-
- matted string representing the node's file details. Remember that the
- method FileList^.NodePtr can be used to return a node pointer.
-
-
-
- 10-6 User's Guide
- --------------------------------------------------------------------------------
-
- Refreshing the File List
-
- In the last chapter you learned that you can intercept all characters
- pressed while a list is active, by assigning a character hook, or by
- creating a descendant method and replacing the virtual method CharTask.
- Thanks to OOP inheritance, these techniques can also be used with List-
- DirOBJ objects.
- The FileList linked list can be directly modified using some FileDLLOBJ
- methods. Ordinarily, you wouldn't need to call these methods, but if
- you want to modify the displayed list "on the fly" from a character
- hook, you can use the following methods:
-
-
- FileList^.GetFileMask:string;
- This function returns the currently active file mask.
-
-
- FileList^.SetFileDetails(FileMasks:string; FileAttrib:word);
- Specifies a new set of file masks and file attributes. This method must
- be called prior to FillList.
-
-
- FileList^.FillList;
- Empties the list (if it already contains files), and re-populates the
- list with the new category of files.
-
-
- FileList^.FillNewMask(Filemasks:string);
- This method re-populates the list with all files matching the FileMasks
- parameter, which have the same attributes that were used when the list
- was last filled.
-
-
-
- Example
- The demo program DEMDR3.PAS, listed below, illustrates some of the
- techniques discussed in this section. Figure 10.4 shows the resultant
- output.
-
- program DemoDirectoryThree;
- {demdr3 - a customized directory list}
- Uses DOS, CRT,
- totFAST, totLINK, totLIST;
-
- Var
- ListWin: ListDirObj;
- FileInfo: tFileInfo;
-
-
-
- Displaying Directories 10-7
- --------------------------------------------------------------------------------
-
- begin
- Screen.Clear(white,'░'); {paint the screen}
- with ListWin do
- begin
- Init;
- SetTagging(false);
- ReadFiles('*.*',AnyFile - directory); {exclude directories}
- FileList^.Sort(1,true); {sort in name order}
- Win^.SetTitle(' Choose a file ');
- Go;
- Win^.Remove;
- if (LastKey = 27) or (Lastkey = 600) then
- writeln('You escaped!')
- Else
- begin
- writeln('You chose file '+GetHiString);
- writeln(FileList^.GetLongStr(FileList^.ActiveNodePtr));
- FileList^.GetFileRecord(FileInfo,
- FileList^.ActiveNodeNumber);
- with FileInfo do
- begin
- writeln('Name: ', FileName);
- writeln('Attr: ', Attr);
- writeln('Packed Time: ', Time);
- writeln('Size: ', Size);
- writeln('Directory entry:',LoadID);
- end;
- end;
- Done;
- end;
- end.
-
-
-
- Figure 10.4 [SCREEN]
- Advanced Directory
- Control
-
-
-
- Displaying Sortable Directories
- ListDirSortOBJ is a descendant of ListDirOBJ, and shares all the meth-
- ods of its ancestor. ListDirSort works in just the same way as ListDi-
- rOBJ, with one added bonus - the user can press the right mouse button
- or [KEYCAP] to display a sort dialog box. This allows the end user to
- sort the file list in any order.
-
- Listed below is the demo program DEMDR4.PAS, followed by figure 10.5
- showing the sort dialog box.
-
-
- 10-8 User's Guide
- --------------------------------------------------------------------------------
-
- program DemoDirFour;
- {demdr4 - a user sortable directory listing}
-
- Uses DOS, CRT,
- totFAST, totLIST;
- Var
- ListWin: ListDirSortOBJ;
-
- begin
- Screen.Clear(white,'░'); {paint the screen}
- Screen.WriteCenter(25,white,' Press S or Right Mouse Button
- for Sort Options ');
- with ListWin do
- begin
- Init;
- ReadFiles('*.*',AnyFile);
- Go;
- Done;
- end;
- end.
-
-
-
- Figure 10.5 [SCREEN]
- The Sort Dialog
- Box
-
-
-
- Displaying Directories 10-9
- --------------------------------------------------------------------------------
-
- Displaying a Directory Dialog Window
-
- In the unit totDIR, the Toolkit provides an alternative object for
- displaying a directory dialog box. Figure 10.6 shows how the dialog box
- looks to the user. The display is generated using a DirWinOBJ, and it
- is ideal for prompting the user to enter a filename.
- The user can enter a file name, or a file mask, into the filename
- field. If a file mask is entered, the file list is automatically
- updated to reflect the new mask. The user can move from field to field
- by pressing the [KEYCAP] and [KEYCAP] keys. As in the Turbo 6 environ-
- ment, the user can choose a file from the file list by cursoring to the
- desired file and pressing [KEYCAP]. The user can change directories or
- drives by tabbing to the directory list, highlighting the desired
- directory, and pressing [KEYCAP]. The user can also tab to the buttons
- and select OK, Cancel or Help. Alternatively, the buttons can be
- selected by pressing one of the hotkeys [KEYCAP], [KEYCAP] or [KEYCAP].
-
- A mouse user simply clicks on a field to activate it, and double-clicks
- to choose a specific file or directory.
-
-
- Figure 10.6 [SCREEN]
- A Pop-up Directory
- Window
-
-
- Displaying a Basic Directory Window
- The DirWinOBJ is very easy to use, and has the following four main
- methods:
-
-
- Init;
- As always, this methods initializes the instance and must always be
- called first.
-
-
- Go:tAction;
- This is the "do it" method which instructs the Toolkit to display the
- dialog window and wait for the user to choose a file. Go returns a
- member of the enumerated type tAction to indicate whether the user
- chose a file or escaped. This function will only return Finished or
- Escaped.
-
-
- GetChosenFile:string;
-
-
-
- 10-10 User's Guide
- --------------------------------------------------------------------------------
-
- This function method should be called after Go, to determine which file
- the user selected. The function returns the name the user entered in
- the input field, or the active filename in the file list. Note you
- should check the value returned by Go to check whether the user
- escaped.
-
-
- Done;
- This function should be called to dispose of the instance, and should
- be called after the method GetChosenFile.
-
-
- Listed below is the program DEMDR5.PAS which generated the display
- shown in figure 10.6.
- program DemoDirFive;
- {demdr5 - the directory dialog box}
-
- Uses DOS, CRT,
- totFAST, totDir, totIO1;
- Var
- DirWin: DirWinObj;
- Result: tAction;
- begin
- Screen.Clear(white,'░'); {paint the screen}
- with DirWin do
- begin
- Init;
- Result := Go;
- if Result = Finished then
- writeln('You chose file: ',GetChosenFile)
- else
- writeln('You escaped!');
- Done;
- end;
- end.
-
-
- Customizing the Window
-
- To provide further display control, the DirWinOBJ object also includes
- the following customization methods:
-
- SetFileDetails(StartDir:string; FileMasks:string; FileAttrib: word);
-
- By default, the Toolkit will display any file with a mask of '*.*' in
- the default directory. Use this method to override the defaults. The
- first parameter specifies the initial drive and directory to search.
- The second parameter identifies the file mask which may include multi-
-
-
-
- Displaying Directories 10-11
- --------------------------------------------------------------------------------
-
- ple file masks separated by spaces, e.g. '*.bat *.exe *.com'. The third
- parameter specifies the attributes of the files to be included in the
- list (see the file attribute list on page 10.2).
-
-
- SetSortDetails(SortID:byte; SortOrder: boolean);
- Ordinarily, the files are sorted in name order. Use this method to
- specify an alternate sort order. Refer to the sorting discussion on
- page 10.5 for further information.
-
-
- Win^:MoveWinPtr;
- The method Win returns a pointer to the MoveWinOBJ instance on which
- the window is drawn. By calling any MoveWinOBJ method using the syntax
- Win^.method, you control the appearance of the window.
-
-
-
- Note: the DirWinOBJ is a hybrid of a number of other Toolkit
- objects, and the way to control all the colors is not obvious. The
- overall background, title, box border and file details are con-
- trolled by the window, and the color is set with the method
- Win^.SetColors. All other aspects of the dialog box are controlled
- by the object IOTOT. The following IOTOT methods control the
- directory display colors:
-
- IOTOT^.SetColLabel (changes the box labels, e.g. Name:)
- IOTOT^.SetColList (changes the file and dir lists)
- IOTOT^.SetColField (changes the filename input field
- IOTOT^.SetColButtons (changes the buttons)
-
- IOTOT is discussed fully in the next chapter.
-
-
-
- Listed below is the demo program DEMDR6.PAS which illustrates how to
- customize the directory display using the above methods, and figure
- 10.7 shows the resultant output:
- program DemoDirSix;
- {demdr6 - customizing the directory dialog box}
-
- Uses DOS, CRT,
- totFAST, totDir, totIO1;
- Var
- DirWin: DirWinObj;
- Result: tAction;
- begin
- Screen.Clear(white,'░'); {paint the screen}
-
-
-
-
- 10-12 User's Guide
- --------------------------------------------------------------------------------
-
- with DirWin do
- begin
- Init;
- SetFileDetails('','*.EXE *.COM *.BAT',AnyFile);
- SetSortDetails(2,true);
- Win^.SetColors(15,15,15,11);
- IOTOT^.SetColLabel(15,15,15,15);
- IOTOT^.SetColList(7,7,112,112);
- IOTOT^.SetColField(7,112,8,8);
- IOTOT^.SetColButton(112,126,127,126);
- Result := Go;
- if Result = Finished then
- writeln('You chose file: ',GetChosenFile)
- else
- writeln('You escaped!');
- Done;
- end;
- end.
-
-
- Figure 10.7 [SCREEN]
- Customizing the
- Directory Window
-
-
-
- On-Screen Help
- By default, the Help key displays a simple message window describing
- how to select a file (see figure 10.8). You can substitute your own
- help dialog if necessary.
-
-
- Figure 10.8 [SCREEN]
- The Default Help
- Display
-
-
- In the next chapter, you will learn all about the Toolkit's very power-
- ful full screen input facility. The totDIR unit makes extensive use of
- the totIO units to build the directory dialog box. To override the
- default directory help, you need to access the full screen input man-
- ager object. You will be very familiar with the manager by the end of
- the next chapter, but for now, all you need to concentrate on is the
- help facility.
-
- The DirWinOBJ object includes the function method Action which returns
- a pointer to the dialog manager. By calling the dialog manager's own
- method SetHelpHook, you can assign a special procedure to be called
- when the user asks for help.
-
-
- Displaying Directories 10-13
- --------------------------------------------------------------------------------
-
- To create customized help, all you have to do is create a procedure
- following some specific rules, and then call the DirWinOBJ method
- Action^.SetHelpHook to instruct the Toolkit to use your procedure.
-
- For a procedure to be eligible as a help hook, it must adhere to the
- following rules:
- Rule 1 The procedure must be declared as a FAR procedure. This can
- be achieved by preceding the procedure with a {$F+} compiler
- directive, and following the procedure with a {$F-} direc-
- tive. Alternatively, Turbo 6 users can use the new keyword
- FAR following the procedure statement.
-
- Rule 2 The procedure must be declared with one passed parameter of
- type word. This parameter indicates which field was high-
- lighted when help was pressed. The directory dialog fields
- have the following IDs:
- 1 File mask field
- 2 File list field
- 3 Directory list field
- 4 OK button
- 5 Cancel button
- 65335 Help button (constant HelpID)
-
- Rule 3 The procedure must be at the root level, i.e. the procedure
- cannot be nested within another procedure.
- The following procedure declaration follows these rules:
-
- {$F+}
- procedure MyHelpHook(ID:word);
- .....{procedure statements}
- end;
- {$F-}
-
- The following method Action^.SetHelpHook is then called to instruct the
- Toolkit to call your procedure when the user asks for help:
-
-
- Action^.SetHelpHook(PassedProc:HelpProc);
- This method is passed the procedure name of a procedure declared using
- the rules outlined above.
-
-
- The demo program DEMDR7.PAS, listed below, illustrates how to customize
- the directory help. Figure 10.9 shows the help screen!
-
- program DemoDirSeven;
- {demdr7 - customizing directory help}
-
-
-
-
- 10-14 User's Guide
- --------------------------------------------------------------------------------
-
- Uses DOS, CRT,
- totFAST, totDir, totIO1, totMSG;
-
- Var
- DirWin: DirWinObj;
- Result: tAction;
- {$F+}
- procedure NewHelp(ID:word);
- {}
- var HelpWin: MessageOBJ;
- begin
- with HelpWin do
- begin
- Init(1,' Not Much Help ');
- AddLine('');
- Addline(' Honey, if you need help here, we got big problems! ');
- AddLine('');
- Show;
- Done;
- end;
- end; {NewHelp}
- {$F-}
-
- begin
- Screen.Clear(white,'░'); {paint the screen}
- with DirWin do
- begin
- Init;
- Action^.SetHelpHook(NewHelp);
- Result := Go;
- if Result = Finished then
- writeln('You chose file: ',GetChosenFile)
- else
- writeln('You escaped!');
- Done;
- end;
- end.
-
-
- Figure 10.9 [SCREEN]
- Customized Help
-
-
-