:: Архив конференции по VFP до 2005 года
Как ограничить getfile()
matod

Сообщений: 3062
Откуда: Иркутск
Дата регистрации: 31.10.2001
Уважаемый All,
необходимо предоставить пользователю диалог выбора файла, который позволяет сделать выбор только внутри некоторого каталога и его подкаталогов. Можно, конечно написать такой диалог самому, но нет ли простого решения? Так, для аналогичной задачи по выбору папок можно использовать API Shell.Application.BrowseForFolder. Нет ли чего похожего для файлов?
Ratings: 0 negative/0 positive
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) - подойдет?

Ratings: 0 negative/0 positive
RE: Как ограничить getfile()
matod

Сообщений: 3062
Откуда: Иркутск
Дата регистрации: 31.10.2001
да, 0х4000 я как-то и не приметил Спасибо огромное .
Хотелось, конечно, посложнее - выбор типа файла из списка, создание папки..
Ratings: 0 negative/0 positive
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>&amp;&amp; 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>&amp;&amp; 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>&amp;&amp; Restore old directory</font>

<font color=blue>if</font><font color=blue> empty</font>(m.lcFileName) <font color=green>&amp;&amp; User pressed a Cancel button</font>
lnFiles = 0
<font color=blue>endif</font>
<font color=blue>if</font> m.lnFiles &gt; 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 &gt; 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 &gt; 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>
Ratings: 0 negative/0 positive


Извините, но у вас нет прав для того, чтобы оставлять сообщения в этом форуме.

On-line: 11 (Гостей: 11)

© 2000-2024 Fox Club 
Яндекс.Метрика