X-Git-Url: https://sfsrealm.hopto.org/projects/gitweb.cgi?a=blobdiff_plain;f=FileDialog.bas;h=07166f0e1ea58cfb2071e72b8da591259f99f804;hb=4ca9d6e7db9e88f4421c0704c5ee29bd92be4ffe;hp=d097eaf571f27611133c11a2e86029c7fa1954fa;hpb=62046253535cb1df0280f7e331d2f76b0fbf2d17;p=WinMPQ.git diff --git a/FileDialog.bas b/FileDialog.bas index d097eaf..07166f0 100644 --- a/FileDialog.bas +++ b/FileDialog.bas @@ -1,202 +1,202 @@ -Attribute VB_Name = "FileDialog" -Option Explicit - -Public NullPtr As String - -Type OPENFILENAME - lStructSize As Long - hwndOwner As Long - hInstance As Long - Filter As String - CustomFilter As String - nMaxCustFilter As Long - FilterIndex As Long - FileName As String - MaxFileSize As Long - FileTitle As String - MaxFileTitleSize As Long - InitDir As String - DialogTitle As String - Flags As Long - nFileOffset As Integer - nFileExtension As Integer - DefaultExt As String - lCustData As Long - lpfnHook As Long - lpTemplateName As String -End Type - -Type BROWSEINFO - hwndOwner As Long - pidlRoot As Long - DisplayName As String - Title As String - Flags As Long - lpfn As Long - lParam As Long - iImage As Long -End Type - -Declare Function CommDlgExtendedError Lib "Comdlg32.dll" () As Long -Declare Function GetOpenFileName Lib "Comdlg32.dll" _ - Alias "GetOpenFileNameA" (lpofn As OPENFILENAME) As Boolean -Declare Function GetSaveFileName Lib "Comdlg32.dll" _ - Alias "GetSaveFileNameA" (lpofn As OPENFILENAME) As Boolean -Declare Function SHBrowseForFolder Lib "Shell32.dll" _ - (lpbi As BROWSEINFO) As Long -Declare Function SHGetPathFromIDList Lib "Shell32.dll" ( _ - pidl As Long, _ - ByRef pszPath As Byte) As Boolean - -Public Const OFN_READONLY As Long = &H1 -Public Const OFN_OVERWRITEPROMPT As Long = &H2 -Public Const OFN_HIDEREADONLY As Long = &H4 -Public Const OFN_NOCHANGEDIR As Long = &H8 -Public Const OFN_SHOWHELP As Long = &H10 -Public Const OFN_ENABLEHOOK As Long = &H20 -Public Const OFN_ENABLETEMPLATE As Long = &H40 -Public Const OFN_ENABLETEMPLATEHANDLE As Long = &H80 -Public Const OFN_NOVALIDATE As Long = &H100 -Public Const OFN_ALLOWMULTISELECT As Long = &H200 -Public Const OFN_EXTENSIONDIFFERENT As Long = &H400 -Public Const OFN_PATHMUSTEXIST As Long = &H800 -Public Const OFN_FILEMUSTEXIST As Long = &H1000 -Public Const OFN_CREATEPROMPT As Long = &H2000 -Public Const OFN_SHAREAWARE As Long = &H4000 -Public Const OFN_NOREADONLYRETURN As Long = &H8000 -Public Const OFN_NOTESTFILECREATE As Long = &H10000 -Public Const OFN_NONETWORKBUTTON As Long = &H20000 -Public Const OFN_NOLONGNAMES As Long = &H40000 ' force no long names for 4.x modules -Public Const OFN_EXPLORER As Long = &H80000 ' new look commdlg -Public Const OFN_NODEREFERENCELINKS As Long = &H100000 -Public Const OFN_LONGNAMES As Long = &H200000 ' force long names for 3.x modules -Public Const OFN_ENABLEINCLUDENOTIFY As Long = &H400000 ' send include message to callback -Public Const OFN_ENABLESIZING As Long = &H800000 - -Public Const BIF_RETURNONLYFSDIRS As Long = &H1 ' For finding a folder to start document searching -Public Const BIF_DONTGOBELOWDOMAIN As Long = &H2 ' For starting the Find Computer -Public Const BIF_STATUSTEXT As Long = &H4 -Public Const BIF_RETURNFSANCESTORS As Long = &H8 -Public Const BIF_EDITBOX As Long = &H10 -Public Const BIF_VALIDATE As Long = &H20 ' insist on valid result (or CANCEL) - -Public Const BIF_BROWSEFORCOMPUTER As Long = &H1000 ' Browsing for Computers. -Public Const BIF_BROWSEFORPRINTER As Long = &H2000 ' Browsing for Printers -Public Const BIF_BROWSEINCLUDEFILES As Long = &H4000 ' Browsing for Everything - -Function GetPathFromID(ByVal dwID As Long) As String -Dim buffer(1 To 260) As Byte -GetPathFromID = NullPtr -If SHGetPathFromIDList(ByVal dwID, buffer(1)) Then - GetPathFromID = StrConv(buffer, vbUnicode) - StripNull GetPathFromID -End If -End Function -Sub ReplaceChar(ByRef TextStr As String, ByVal Char As String, ByVal NewChar As String) -If Len(Char) > 1 Then Char = Left$(Char, 1) -If Len(NewChar) > 1 Then NewChar = Left$(NewChar, 1) -Dim cNum As Long, cNum2 As Long -For cNum = 1 To Len(TextStr) - cNum2 = InStr(cNum, TextStr, Char) - If cNum2 Then - cNum = cNum2 - Mid$(TextStr, cNum, 1) = NewChar - Else - Exit Sub - End If -Next cNum -End Sub -Sub StripNull(ByRef TextStr As String) -Dim cNum As Long -cNum = InStr(1, TextStr, Chr$(0)) -If cNum Then - TextStr = Left(TextStr, cNum - 1) -End If -End Sub -Sub StripNullMulti(ByRef TextStr As String) -Dim cNum As Long, cNum2 As Long -For cNum = 1 To Len(TextStr) - cNum2 = InStr(cNum, TextStr, Chr$(0)) - If cNum2 Then - cNum = cNum2 - cNum2 = InStr(cNum + 1, TextStr, Chr$(0)) - If cNum + 1 = cNum2 Or cNum2 = 0 Then - TextStr = Left(TextStr, cNum - 1) - Exit Sub - End If - Else - Exit Sub - End If -Next cNum -End Sub -Sub InitFileDialog(ByRef lpFileDialog As OPENFILENAME) -lpFileDialog.lStructSize = Len(lpFileDialog) -lpFileDialog.hwndOwner = 0 -lpFileDialog.hInstance = 0 -lpFileDialog.Filter = NullPtr -lpFileDialog.CustomFilter = NullPtr -lpFileDialog.nMaxCustFilter = 0 -lpFileDialog.FilterIndex = 0 -lpFileDialog.FileName = NullPtr -lpFileDialog.MaxFileSize = 260 -lpFileDialog.FileTitle = NullPtr -lpFileDialog.MaxFileTitleSize = 260 -lpFileDialog.InitDir = NullPtr -lpFileDialog.DialogTitle = NullPtr -lpFileDialog.Flags = 0 -lpFileDialog.nFileOffset = 0 -lpFileDialog.nFileExtension = 0 -lpFileDialog.DefaultExt = NullPtr -lpFileDialog.lCustData = 0 -lpFileDialog.lpfnHook = 0 -lpFileDialog.lpTemplateName = NullPtr -End Sub -Sub InitFolderDialog(ByRef lpFolderDialog As BROWSEINFO) -lpFolderDialog.hwndOwner = 0 -lpFolderDialog.pidlRoot = 0 -lpFolderDialog.DisplayName = NullPtr -lpFolderDialog.Title = NullPtr -lpFolderDialog.Flags = 0 -lpFolderDialog.lpfn = 0 -lpFolderDialog.lParam = 0 -lpFolderDialog.iImage = 0 -End Sub -Function ShowOpen(ByRef lpFileDialog As OPENFILENAME) As Boolean -lpFileDialog.lStructSize = Len(lpFileDialog) -ReplaceChar lpFileDialog.Filter, "|", Chr$(0) -lpFileDialog.Filter = lpFileDialog.Filter + Chr$(0) -If Len(lpFileDialog.FileName) <= lpFileDialog.MaxFileSize Then _ - lpFileDialog.FileName = lpFileDialog.FileName + String$(lpFileDialog.MaxFileSize - Len(lpFileDialog.FileName), Chr$(0)) -If Len(lpFileDialog.FileTitle) <= lpFileDialog.MaxFileTitleSize Then _ - lpFileDialog.FileTitle = lpFileDialog.FileTitle + String$(lpFileDialog.MaxFileTitleSize - Len(lpFileDialog.FileTitle), Chr$(0)) -ShowOpen = GetOpenFileName(lpFileDialog) -lpFileDialog.Filter = Left$(lpFileDialog.Filter, Len(lpFileDialog.Filter) - 1) -ReplaceChar lpFileDialog.Filter, Chr$(0), "|" -If lpFileDialog.Flags And (OFN_ALLOWMULTISELECT Or OFN_EXPLORER) Then - StripNullMulti lpFileDialog.FileName - StripNullMulti lpFileDialog.FileTitle -Else - StripNull lpFileDialog.FileName - StripNull lpFileDialog.FileTitle -End If -End Function -Function ShowSave(ByRef lpFileDialog As OPENFILENAME) As Boolean -lpFileDialog.lStructSize = Len(lpFileDialog) -ReplaceChar lpFileDialog.Filter, "|", Chr$(0) -lpFileDialog.Filter = lpFileDialog.Filter + Chr$(0) -If Len(lpFileDialog.FileName) <= lpFileDialog.MaxFileSize Then _ - lpFileDialog.FileName = lpFileDialog.FileName + String$(lpFileDialog.MaxFileSize - Len(lpFileDialog.FileName), Chr$(0)) -If Len(lpFileDialog.FileTitle) <= lpFileDialog.MaxFileTitleSize Then _ - lpFileDialog.FileTitle = lpFileDialog.FileTitle + String$(lpFileDialog.MaxFileTitleSize - Len(lpFileDialog.FileTitle), Chr$(0)) -ShowSave = GetSaveFileName(lpFileDialog) -lpFileDialog.Filter = Left$(lpFileDialog.Filter, Len(lpFileDialog.Filter) - 1) -ReplaceChar lpFileDialog.Filter, Chr$(0), "|" -StripNull lpFileDialog.FileName -StripNull lpFileDialog.FileTitle -End Function -Function ShowFolder(ByRef lpFolderDialog As BROWSEINFO) As Long -If Len(lpFolderDialog.DisplayName) <= 260 Then _ - lpFolderDialog.DisplayName = lpFolderDialog.DisplayName + String$(260 - Len(lpFolderDialog.DisplayName), Chr$(0)) -ShowFolder = SHBrowseForFolder(lpFolderDialog) -StripNull lpFolderDialog.DisplayName -End Function +Attribute VB_Name = "FileDialog" +Option Explicit + +Public NullPtr As String + +Type OPENFILENAME + lStructSize As Long + hwndOwner As Long + hInstance As Long + Filter As String + CustomFilter As String + nMaxCustFilter As Long + FilterIndex As Long + FileName As String + MaxFileSize As Long + FileTitle As String + MaxFileTitleSize As Long + InitDir As String + DialogTitle As String + Flags As Long + nFileOffset As Integer + nFileExtension As Integer + DefaultExt As String + lCustData As Long + lpfnHook As Long + lpTemplateName As String +End Type + +Type BROWSEINFO + hwndOwner As Long + pidlRoot As Long + DisplayName As String + Title As String + Flags As Long + lpfn As Long + lParam As Long + iImage As Long +End Type + +Declare Function CommDlgExtendedError Lib "Comdlg32.dll" () As Long +Declare Function GetOpenFileName Lib "Comdlg32.dll" _ + Alias "GetOpenFileNameA" (lpofn As OPENFILENAME) As Boolean +Declare Function GetSaveFileName Lib "Comdlg32.dll" _ + Alias "GetSaveFileNameA" (lpofn As OPENFILENAME) As Boolean +Declare Function SHBrowseForFolder Lib "Shell32.dll" _ + (lpbi As BROWSEINFO) As Long +Declare Function SHGetPathFromIDList Lib "Shell32.dll" ( _ + pidl As Long, _ + ByRef pszPath As Byte) As Boolean + +Public Const OFN_READONLY As Long = &H1 +Public Const OFN_OVERWRITEPROMPT As Long = &H2 +Public Const OFN_HIDEREADONLY As Long = &H4 +Public Const OFN_NOCHANGEDIR As Long = &H8 +Public Const OFN_SHOWHELP As Long = &H10 +Public Const OFN_ENABLEHOOK As Long = &H20 +Public Const OFN_ENABLETEMPLATE As Long = &H40 +Public Const OFN_ENABLETEMPLATEHANDLE As Long = &H80 +Public Const OFN_NOVALIDATE As Long = &H100 +Public Const OFN_ALLOWMULTISELECT As Long = &H200 +Public Const OFN_EXTENSIONDIFFERENT As Long = &H400 +Public Const OFN_PATHMUSTEXIST As Long = &H800 +Public Const OFN_FILEMUSTEXIST As Long = &H1000 +Public Const OFN_CREATEPROMPT As Long = &H2000 +Public Const OFN_SHAREAWARE As Long = &H4000 +Public Const OFN_NOREADONLYRETURN As Long = &H8000 +Public Const OFN_NOTESTFILECREATE As Long = &H10000 +Public Const OFN_NONETWORKBUTTON As Long = &H20000 +Public Const OFN_NOLONGNAMES As Long = &H40000 ' force no long names for 4.x modules +Public Const OFN_EXPLORER As Long = &H80000 ' new look commdlg +Public Const OFN_NODEREFERENCELINKS As Long = &H100000 +Public Const OFN_LONGNAMES As Long = &H200000 ' force long names for 3.x modules +Public Const OFN_ENABLEINCLUDENOTIFY As Long = &H400000 ' send include message to callback +Public Const OFN_ENABLESIZING As Long = &H800000 + +Public Const BIF_RETURNONLYFSDIRS As Long = &H1 ' For finding a folder to start document searching +Public Const BIF_DONTGOBELOWDOMAIN As Long = &H2 ' For starting the Find Computer +Public Const BIF_STATUSTEXT As Long = &H4 +Public Const BIF_RETURNFSANCESTORS As Long = &H8 +Public Const BIF_EDITBOX As Long = &H10 +Public Const BIF_VALIDATE As Long = &H20 ' insist on valid result (or CANCEL) + +Public Const BIF_BROWSEFORCOMPUTER As Long = &H1000 ' Browsing for Computers. +Public Const BIF_BROWSEFORPRINTER As Long = &H2000 ' Browsing for Printers +Public Const BIF_BROWSEINCLUDEFILES As Long = &H4000 ' Browsing for Everything + +Function GetPathFromID(ByVal dwID As Long) As String +Dim buffer(1 To 260) As Byte +GetPathFromID = NullPtr +If SHGetPathFromIDList(ByVal dwID, buffer(1)) Then + GetPathFromID = StrConv(buffer, vbUnicode) + StripNull GetPathFromID +End If +End Function +Sub ReplaceChar(ByRef TextStr As String, ByVal Char As String, ByVal NewChar As String) +If Len(Char) > 1 Then Char = Left$(Char, 1) +If Len(NewChar) > 1 Then NewChar = Left$(NewChar, 1) +Dim cNum As Long, cNum2 As Long +For cNum = 1 To Len(TextStr) + cNum2 = InStr(cNum, TextStr, Char) + If cNum2 Then + cNum = cNum2 + Mid$(TextStr, cNum, 1) = NewChar + Else + Exit Sub + End If +Next cNum +End Sub +Sub StripNull(ByRef TextStr As String) +Dim cNum As Long +cNum = InStr(1, TextStr, Chr$(0)) +If cNum Then + TextStr = Left(TextStr, cNum - 1) +End If +End Sub +Sub StripNullMulti(ByRef TextStr As String) +Dim cNum As Long, cNum2 As Long +For cNum = 1 To Len(TextStr) + cNum2 = InStr(cNum, TextStr, Chr$(0)) + If cNum2 Then + cNum = cNum2 + cNum2 = InStr(cNum + 1, TextStr, Chr$(0)) + If cNum + 1 = cNum2 Or cNum2 = 0 Then + TextStr = Left(TextStr, cNum - 1) + Exit Sub + End If + Else + Exit Sub + End If +Next cNum +End Sub +Sub InitFileDialog(ByRef lpFileDialog As OPENFILENAME) +lpFileDialog.lStructSize = Len(lpFileDialog) +lpFileDialog.hwndOwner = 0 +lpFileDialog.hInstance = 0 +lpFileDialog.Filter = NullPtr +lpFileDialog.CustomFilter = NullPtr +lpFileDialog.nMaxCustFilter = 0 +lpFileDialog.FilterIndex = 0 +lpFileDialog.FileName = NullPtr +lpFileDialog.MaxFileSize = 260 +lpFileDialog.FileTitle = NullPtr +lpFileDialog.MaxFileTitleSize = 260 +lpFileDialog.InitDir = NullPtr +lpFileDialog.DialogTitle = NullPtr +lpFileDialog.Flags = 0 +lpFileDialog.nFileOffset = 0 +lpFileDialog.nFileExtension = 0 +lpFileDialog.DefaultExt = NullPtr +lpFileDialog.lCustData = 0 +lpFileDialog.lpfnHook = 0 +lpFileDialog.lpTemplateName = NullPtr +End Sub +Sub InitFolderDialog(ByRef lpFolderDialog As BROWSEINFO) +lpFolderDialog.hwndOwner = 0 +lpFolderDialog.pidlRoot = 0 +lpFolderDialog.DisplayName = NullPtr +lpFolderDialog.Title = NullPtr +lpFolderDialog.Flags = 0 +lpFolderDialog.lpfn = 0 +lpFolderDialog.lParam = 0 +lpFolderDialog.iImage = 0 +End Sub +Function ShowOpen(ByRef lpFileDialog As OPENFILENAME) As Boolean +lpFileDialog.lStructSize = Len(lpFileDialog) +ReplaceChar lpFileDialog.Filter, "|", Chr$(0) +lpFileDialog.Filter = lpFileDialog.Filter + Chr$(0) +If Len(lpFileDialog.FileName) <= lpFileDialog.MaxFileSize Then _ + lpFileDialog.FileName = lpFileDialog.FileName + String$(lpFileDialog.MaxFileSize - Len(lpFileDialog.FileName), Chr$(0)) +If Len(lpFileDialog.FileTitle) <= lpFileDialog.MaxFileTitleSize Then _ + lpFileDialog.FileTitle = lpFileDialog.FileTitle + String$(lpFileDialog.MaxFileTitleSize - Len(lpFileDialog.FileTitle), Chr$(0)) +ShowOpen = GetOpenFileName(lpFileDialog) +lpFileDialog.Filter = Left$(lpFileDialog.Filter, Len(lpFileDialog.Filter) - 1) +ReplaceChar lpFileDialog.Filter, Chr$(0), "|" +If lpFileDialog.Flags And (OFN_ALLOWMULTISELECT Or OFN_EXPLORER) Then + StripNullMulti lpFileDialog.FileName + StripNullMulti lpFileDialog.FileTitle +Else + StripNull lpFileDialog.FileName + StripNull lpFileDialog.FileTitle +End If +End Function +Function ShowSave(ByRef lpFileDialog As OPENFILENAME) As Boolean +lpFileDialog.lStructSize = Len(lpFileDialog) +ReplaceChar lpFileDialog.Filter, "|", Chr$(0) +lpFileDialog.Filter = lpFileDialog.Filter + Chr$(0) +If Len(lpFileDialog.FileName) <= lpFileDialog.MaxFileSize Then _ + lpFileDialog.FileName = lpFileDialog.FileName + String$(lpFileDialog.MaxFileSize - Len(lpFileDialog.FileName), Chr$(0)) +If Len(lpFileDialog.FileTitle) <= lpFileDialog.MaxFileTitleSize Then _ + lpFileDialog.FileTitle = lpFileDialog.FileTitle + String$(lpFileDialog.MaxFileTitleSize - Len(lpFileDialog.FileTitle), Chr$(0)) +ShowSave = GetSaveFileName(lpFileDialog) +lpFileDialog.Filter = Left$(lpFileDialog.Filter, Len(lpFileDialog.Filter) - 1) +ReplaceChar lpFileDialog.Filter, Chr$(0), "|" +StripNull lpFileDialog.FileName +StripNull lpFileDialog.FileTitle +End Function +Function ShowFolder(ByRef lpFolderDialog As BROWSEINFO) As Long +If Len(lpFolderDialog.DisplayName) <= 260 Then _ + lpFolderDialog.DisplayName = lpFolderDialog.DisplayName + String$(260 - Len(lpFolderDialog.DisplayName), Chr$(0)) +ShowFolder = SHBrowseForFolder(lpFolderDialog) +StripNull lpFolderDialog.DisplayName +End Function