|
|
This example illustrates how Lotuscript can be used to call a Win32 API Common File Dialog to get a file. Similiar techniques can be used on other operating systems:
Option Public Option Declare
Dim Filter As String Dim FileName As String Dim FileTitle As String Dim TruncName As String
Dim VaultWIPRoot As String Dim VaultWIPUserPath As String
Type tagOPENFILENAME
lStructSize As Long
hwndOwner As Long
hInstance As Long
lpstrFilter As String
lpstrCustomFilter As Long
nMaxCustFilter As Long
nFilterIndex As Long
lpstrFile As String
nMaxFile As Long
lpstrFileTitle As String
nMaxFileTitle As Long
lpstrInitialDir As String
lpstrTitle As String
Flags As Long
nFileOffset As Integer
nFileExtension As Integer
lpstrDefExt As String
lCustData As Long
lpfnHook As Long
lpTemplateName As Long
End Type
Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" (OPENFILENAME As tagOPENFILENAME) As Long
Dim OPENFILENAME As tagOPENFILENAME
Public Const OFN_ALLOWMULTISELECT = &H200 Public Const OFN_CREATEPROMPT = &H2000 Public Const OFN_ENABLEHOOK = &H20 Public Const OFN_ENABLETEMPLATE = &H40 Public Const OFN_ENABLETEMPLATEHANDLE = &H80 Public Const OFN_EXPLORER = &H80000 Public Const OFN_EXTENSIONDIFFERENT = &H400 Public Const OFN_FILEMUSTEXIST = &H1000 Public Const OFN_HIDEREADONLY = &H4 Public Const OFN_LONGNAMES = &H200000 Public Const OFN_NOCHANGEDIR = &H8 Public Const OFN_NODEREFERENCELINKS = &H100000 Public Const OFN_NOLONGNAMES = &H40000 Public Const OFN_NONETWORKBUTTON = &H20000 Public Const OFN_NOREADONLYRETURN = &H8000 Public Const OFN_NOTESTFILECREATE = &H10000 Public Const OFN_NOVALIDATE = &H100 Public Const OFN_OVERWRITEPROMPT = &H2 Public Const OFN_PATHMUSTEXIST = &H800 Public Const OFN_READONLY = &H1 Public Const OFN_SHAREAWARE = &H4000 Public Const OFN_SHAREFALLTHROUGH = 2 Public Const OFN_SHARENOWARN = 1 Public Const OFN_SHAREWARN = 0 Public Const OFN_SHOWHELP = &H10
Function OpenCommDlg ()
Dim Title As String
Dim DefExt As String
Dim szCurDir As String
Dim APIResults%
SetFileFilter
'Give the dialog a caption title.
Title = "Add supporting document" & Chr$(0)
'Allocate string space for returned strings
FileName = Chr$(0) & Space$(255) & Chr$(0)
FileTitle = Space$(255) & Chr$(0)
'If the user does not specify an extension, append TXT.
DefExt = "BMP" & Chr$(0)
'Set up the default directory
szCurDir = Curdir$ & Chr$(0)
'Set up the data structure before you call the GetOpenFileName
OPENFILENAME.lStructSize = Len(OPENFILENAME)
'If the OpenFile Dialog box is not linked to any form use this line.
'It will pass a null pointer.
OPENFILENAME.hwndOwner = 0&
OPENFILENAME.lpstrFilter = Filter
OPENFILENAME.nFilterIndex = 1
OPENFILENAME.lpstrFile = FileName
OPENFILENAME.nMaxFile = Len(FileName)
OPENFILENAME.lpstrFileTitle = FileTitle
OPENFILENAME.nMaxFileTitle = Len(FileTitle)
OPENFILENAME.lpstrTitle = Title
OPENFILENAME.Flags = OFN_FILEMUSTEXIST
OPENFILENAME.lpstrDefExt = DefExt
OPENFILENAME.hInstance = 0
OPENFILENAME.lpstrCustomFilter = 0
OPENFILENAME.nMaxCustFilter = 0
OPENFILENAME.lpstrInitialDir = szCurDir
OPENFILENAME.nFileOffset = 0
OPENFILENAME.nFileExtension = 0
OPENFILENAME.lCustData = 0
OPENFILENAME.lpfnHook = 0
OPENFILENAME.lpTemplateName = 0
'This will pass the desired data structure to the Windows API,
'which will in turn it uses to display the Open Dialog form.
APIResults% = GetOpenFileName(OPENFILENAME)
If APIResults% <> 0 Then
FileName = Cstr( OPENFILENAME.lpstrFile )
FileTitle = Cstr( OPENFILENAME.lpstrFileTitle )
OpenCommDlg = 1
Else
OpenCommDlg = 0
End If
End Function
Sub Initialize
If (OpenCommDlg = 1) Then
Print " "
' use FileExt and other globals that contain the filename and extension, etc.
Else
Print "No documents were attached."
End If
End Sub
Another way to do this is to use Notes' undocument API to do this. This is available on more platforms, but the usual caveats apply about using an undocumented API:
Declare Function NEMGetFile Lib "nnotesws" ( wUnk As Integer, Byval szFileName As String, Byval szFilter As String, Byval szTitle As String ) As Integer 'use nnotesws for Win95 and WinNT, inotesws for OS/2, and _nem for Win16
Sub Click(Source As Button)
Dim szFileName As String*256
Dim szTitle As String
Dim szFilter As String
szFilename = Chr(0)
szTitle = "Select a database"
szFilter = "Notes Databases|*.NSF|Notes Templates|*.NTF|Programs|*.EXE|All Files|*.*|" 'Use this format for ANY file type
If NEMGetFile( 0, szFileName, szFilter, szTitle) <> 0 Then
Messagebox szFileName
End If
End Sub