Как ограничить getfile() | |
---|---|
matod Сообщений: 3062 Откуда: Иркутск Дата регистрации: 31.10.2001 |
Уважаемый All,
необходимо предоставить пользователю диалог выбора файла, который позволяет сделать выбор только внутри некоторого каталога и его подкаталогов. Можно, конечно написать такой диалог самому, но нет ли простого решения? Так, для аналогичной задачи по выбору папок можно использовать API Shell.Application.BrowseForFolder. Нет ли чего похожего для файлов? |
RE: Как ограничить getfile() | |
---|---|
Nadya Nosonovsky Автор |
From UT
<font color=blue> Frequently Asked Questions Title Enhanced GETDIR() using Shell Object Summary The native VFP GETDIR() is pretty lame; the following function uses the Shell automation object to provide access to the native Explorer Directory Browser for selecting directories. You can get at the Network Neighborhood and URLs as well as the usual assortment of suspects, and unlike the VFP GETDIR(), it doesn't do strange things to your VFP path intermittently: Description </font> <pre> FUNCTION SelDirDlg LPARAMETERS cDialogTitle, cStartingFolder, nBrowseFlags * Select a directory using the default browser dialog * Give a default title if none specified IF TYPE('cDialogTitle') # 'C' cDialogTitle = 'Please select a folder:' ENDIF * Default the start folder to an empty string; if * you specify a starting folder, the browse is * anchored there, although you can override it with * the dialog's EditBox IF TYPE('cStartingFolder') # 'C' cStartingFolder = '' ENDIF IF TYPE('nBrowseFlags') # 'N' * uses BROWSEINFO structure ulFlags values * by default, set BIF_RETURNONLYFSDIRS (1) and BIF_EDITBOX (16) and BIF_VALIDATE * to limit to returning directories, provide an edit box to let user enter a path, * and validate manually-entered paths * * ulFlags values: * BIF_RETURNONLYFSDIRS 1 * BIF_DONTGOBELOWDOMAIN 2 * BIF_STATUSTEXT 4 * BIF_RETURNFSANCESTORS 8 * BIF_EDITBOX 0x10 * BIF_VALIDATE 0x20 * BIF_BROWSEFORCOMPUTER 0x1000 * BIF_BROWSEFORPRINTER 0x2000 * BIF_BROWSEFOREVERYTHING 0x4000 nBrowseFlags = 32 + 16 + 1 ENDIF LOCAL oBrowseObject, cPathToReturn, oShellObj oShellObj = CREATEOBJ('Shell.Application') cPathToReturn = '' * Get a Folder object oBrowseObject = oShellObj.BrowseForFolder(0, ; cDialogTitle, ; nBrowseFlags, ; cStartingFolder) * Before I used the Items collection of the Folder object * to get a path; it doesn't work if the directory is empty. * Instead, spin through the Items collection of the Parent * Folder and locate the item whose name matches the * Title property of the Folder object; return that path IF TYPE('oBrowseObject') = 'O' AND ! ISNULL(oBrowseObject) FOR EACH item IN oBrowseObject.ParentFolder.Items IF item.name == oBrowseObject.title cPathToReturn = Item.Path EXIT ENDIF ENDFOR ENDIF RETURN cPathToReturn</pre> ID 461 Created on October 8, 1998 Created by Ed Rauh Academic Industries West Haven, Connecticut ===================== ?seldirdlg('Select Files','c:\redp',33+0x4000) - подойдет? |
RE: Как ограничить getfile() | |
---|---|
matod Сообщений: 3062 Откуда: Иркутск Дата регистрации: 31.10.2001 |
да, 0х4000 я как-то и не приметил Спасибо огромное .
Хотелось, конечно, посложнее - выбор типа файла из списка, создание папки.. |
RE: Как ограничить getfile() | |
---|---|
Nadya Nosonovsky Автор |
Можно попробовать с Common Dialog Control, но там, по-моему, нельзя ограничить папки (впрочем, подробно не разбиралась):
<pre> <font color=green>************************************************************</font> <font color=blue>function</font> File_Chooser <font color=green>* Description...... : Function invokes MS Common Dialog Control and</font> <font color=green>* : returns an array of files via parameters list.</font> <font color=green>* : Each element of the array contains one file...</font> <font color=green>* Calling Samples...: dimension a_File[1]</font> <font color=green>* : lcPath = ""</font> <font color=green>* : lnFiles = File_Chooser(@a_File, @lcPath, DTitle, InDir)</font> <font color=green>* Parameter List....: a_File, pPath, DTitle, InDir</font> <font color=green>* Created by George Tasker and modified by Nadya Nosonovsky</font> <font color=green>********************************************************************</font> <font color=blue>lparameter</font> a_File, tcPath, DTitle, InDir, tcFilter <font color=blue>external</font><font color=blue> array</font> a_File <font color=green>** Definition of Common Dialog flags see in CommonDlg.h file</font> #<font color=blue>define</font> cdlOFNAllowMultiselect 0x200 <font color=green>*!* Specifies that the File Namelist box allows multiple selections.</font> <font color=green>*!* The user can select more than one file at run time by pressing</font> <font color=green>*!* the SHIFT key and using the UP ARROW and DOWN ARROW keys to select the desired files.</font> <font color=green>*!* When this is done, the FileName property returns a string containing the names</font> <font color=green>*!* of all selected files.</font> <font color=green>*!* The names in the string are delimited by spaces.</font> <font color=blue>local</font> oDialog, lcFileName, lnFiles, lcOldDir lnFiles = 1 lcOldDir =<font color=blue> sys</font>(5)+<font color=blue>curdir</font>() <font color=green>&& Save current directory</font> oDialog =<font color=blue> createobject</font>('MSComDlg.CommonDialog') <font color=blue>with</font> oDialog <font color=green>* Set the flags for Multi-Select/Explorer</font> .MaxFileSize = 1640 <font color=green>&& 820</font> .Flags = 0x200 + 0x80000 <font color=blue> if</font><font color=blue> vartype</font>(m.DTitle)='C' .DialogTitle = m.DTitle <font color=blue> else</font> .DialogTitle = "Choose files" <font color=blue> endif</font> <font color=green>* Set filters</font> <font color=blue> if</font><font color=blue> vartype</font>(m.tcFilter)='C' and !<font color=blue>empty</font>(m.tcFilter) .<font color=blue>filter</font> = m.tcFilter <font color=blue> else</font> .<font color=blue>filter</font> = "All Files (*.*)|*.*|Database Files (*.dbf)|*.dbf|Index Files (*.cdx)|*.cdx" <font color=blue> endif</font> <font color=green>* Specify default filter</font> .FilterIndex = 1 <font color=blue> if</font><font color=blue> vartype</font>(m.InDir)='C' .InitDir= m.InDir <font color=blue> endif</font> .ShowOpen <font color=green>* Save the file name to a variable</font> lcFileName = .FileName <font color=blue>endwith</font> oDialog =<font color=blue> null</font> <font color=blue>release</font> oDialog <font color=blue>cd</font> (m.lcOldDir) <font color=green>&& Restore old directory</font> <font color=blue>if</font><font color=blue> empty</font>(m.lcFileName) <font color=green>&& User pressed a Cancel button</font> lnFiles = 0 <font color=blue>endif</font> <font color=blue>if</font> m.lnFiles > 0 <font color=blue> local</font> lnPt, lnI, lcName lnPt =<font color=blue> at</font>(<font color=blue>chr</font>(0), m.lcFileName) <font color=blue> if</font> m.lnPt > 0 tcPath =<font color=blue> left</font>(m.lcFileName, m.lnPt - 1) lcFileName =<font color=blue> substr</font>(m.lcFileName, m.lnPt + 1) lnFiles =<font color=blue> occurs</font>(<font color=blue>chr</font>(0), m.lcFileName) + 1 <font color=blue> dimension</font> a_File[m.lnFiles] lnI = 0 <font color=blue> do</font><font color=blue> while</font> not<font color=blue> empty</font>(m.lcFileName) lnI = m.lnI + 1 lnPt =<font color=blue> at</font>(<font color=blue>chr</font>(0), m.lcFileName) <font color=blue> if</font> m.lnPt > 0 lcName =<font color=blue> left</font>(m.lcFileName, m.lnPt - 1) lcFileName =<font color=blue> substr</font>(m.lcFileName, m.lnPt + 1) <font color=blue> else</font> lcName = m.lcFileName lcFileName = "" <font color=blue> endif</font> a_File[m.lni] = m.lcName <font color=blue> enddo</font> lnFiles =<font color=blue> alen</font>(a_File, 1) <font color=blue> else</font> lnFiles=1 <font color=blue> dimension</font> a_File[m.lnFiles] lnPos=<font color=blue>rat</font>('\',m.lcFileName) tcPath=<font color=blue>justpath</font>(m.lcFileName) lcName=<font color=blue>justfname</font>(m.lcFileName) a_File[1] = m.lcName <font color=blue> endif</font> <font color=blue>endif</font> <font color=blue>return</font> m.lnFiles</pre> |
© 2000-2024 Fox Club  |